Permitir que o usuário percorra o caminho para determinado diretório

Permitir que o usuário percorra o caminho para determinado diretório

Digamos que eu queira dar a um usuário colleagueacesso de leitura a um diretório /rather/long/path/to/the/directory, mas não necessariamente aos seus diretórios pai.

Como explicado por exemploaquie, primeiro preciso ter certeza de que colleagueposso 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, rooto 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 setfacladicionando 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 || breakapó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 roote 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.

informação relacionada