Eu estaria inclinado a resolver com sudo
em vez de ACLs. (Não há menção explícita do NFS na questão, então vou assumir que root_squash
não é um problema.)
Comece com o seu diretório com as permissões 1777 (fixas, mais todas as leituras / gravações) como você sugeriu.
Crie este script com um nome de arquivo, como /usr/local/bin/rmd
. Altere a definição de TARGET
para que seja o caminho absoluto para o diretório de destino
#!/bin/bash
#
# Remove files from $TARGET. Some care is taken to avoid escaping from
# the path root
#
########################################################################
#
TARGET='/tmp'
ERROR=
for ITEM in "$@"
do
LINK=$(readlink -f "$ITEM")
if test -n "$LINK" && echo "$LINK" | grep -vq "^$TARGET/"
then
echo "Suspicious path: $ITEM" >&2
ERROR=yes
fi
done
test yes = "$ERROR" && exit 1
exec rm "$@"
Adicione a seguinte entrada ao arquivo sudoers
(use visudo
para editar este arquivo). Altere o admin
para ser o usuário com privilégios administrativos para excluir arquivos no diretório de destino.
admin ALL = NOPASSWD: /usr/local/bin/rmd
Como sabemos que rmd
está em /usr/local/bin
, seria possível refazer% deexec
do script se ele não tivesse privilégios suficientes e, portanto, evitar que o usuário administrativo tenha que se lembrar de usar sudo
, mas eu omiti isso por enquanto. Deixe-me saber se você deseja esse ajuste no script.
Exemplo de uso
$ ls -l /tmp
lrwxrwxrwx 1 roaima roaima 4 Mar 31 00:17 etc -> /etc
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 one
lrwxrwxrwx 1 roaima roaima 2 Mar 31 00:20 root -> ..
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 two
$ sudo rmd /tmp/etc/hosts /tmp/root/etc/motd /tmp/one
Suspicious path: /tmp/etc/hosts
Suspicious path: /tmp/root/etc/motd
$ ls /tmp
etc one root two
$ sudo rmd /tmp/one /tmp/root
$ ls /tmp
etc two