
Digamos que eu queira dar a um usuário colleague
acesso de leitura a um diretório /rather/long/path/to/the/directory
, mas não necessariamente aos seus diretórios pai.
Como explicado por exemploaquielá, primeiro preciso ter certeza de que colleague
posso percorrer o caminho. Usando setfacl
:
setfacl -m u:colleague:x /rather
setfacl -m u:colleague:x /rather/long
setfacl -m u:colleague:x /rather/long/path
setfacl -m u:colleague:x /rather/long/path/to
setfacl -m u:colleague:x /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory
Isso é bastante tedioso para um caminho profundamente aninhado. Existe uma maneira mais elegante de fazer isso?
PS Para tornar as coisas um pouco mais difíceis, sendo um usuário normal, talvez eu não tenha o direito de alterar as permissões do diretório de nível superior no caminho (por exemplo, /home
). Se possível, a solução deve ou ignorar esses diretórios (assumindo que colleague
é possível percorrê-los) ou, melhor ainda, verificar se colleague
é permitido percorrê-los e dar uma mensagem de erro, caso não seja.
Responder1
A resposta simples e estúpida:
Você podeencurtarsua sequência de comandos combinando um pouco o primeiron–1 deles:
setfacl -mu:colega:x /em vez /em vez/longo /em vez/longo/caminho /em vez/longo/caminho/para /em vez/longo/caminho/para/o setfacl -mu:colega:xr /em vez/longo/caminho/para/o/diretório
Um aviso “óbvio”:
Mesmo se você possuir o diretório de destino (folha), você precisa ter acesso de execução (atravessar) a todos os diretórios no caminho. Se houver algum diretório ao qual você não tem acesso e não é seu, você está sem sorte. (Você precisa assumir uma identidade (ou seja, root
o proprietário do diretório) que lhe permita acessar ou persuadir alguém que tenha o poder de fazê-lo. Isso está fora do escopo desta questão.)
Mas, se houver diretórios intermediários que você possui, mas aos quais não tem acesso (por exemplo, alguém fez chmod 0
), você precisa conceder acessode cima para baixo.
A resposta: (TL;DR)
Afirmei o ponto acima porque funciona de baixo para cima:
leaf="/em vez/longo/caminho/para/o/diretório" branch="$folha" while branch="$(dirname "$branch")" fazer setfacl -mu:colega:x "$ramo" || quebrar if ["$ramo" = /] então quebrar fi feito setfacl -mu:colega:xr "$folha"
Opcionalmente, você pode ocultar quaisquer mensagens de erro setfacl
adicionando 2> /dev/null
. Se você tiver uma situação patológica em que possui /rather/long
e /rather/long/path/to
, mas não /rather/long/path
(mas suas permissões estão abertas), remova o || break
após o setfacl
, pois você precisa continuar subindo na árvore após obter o erro no setfacl … /rather/long/path
. Caso contrário, se você não estiver root
, vocêpoderiaremova o if [ "$branch" = / ]
teste, porque o loop terminará quando você atingir um nível de diretório onde não poderá executar o setfacl
. (Mas isso não é uma boa ideia; se você salvar isso como um script, algum dia você o executará como root
e terá um loop infinito.)
Nem é preciso dizer que, se você fizer disso um script, o caminho do diretório e o nome do colega deverão ser parâmetros.