Permitir que o usuário atravesse o caminho para o diretório fornecido

2

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

Como explicado, por exemplo, aqui e , primeiro preciso fazer Certifique-se de que colleague possa atravessar 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 é muito entediante para um caminho profundamente aninhado. Existe uma maneira mais elegante de fazer isso?

P.S. Para dificultar um pouco, 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 ignorar esses diretórios (supondo que colleague possa atravessá-los) ou, melhor ainda, verificar se colleague tem permissão para percorrê-los e fornecer uma mensagem de erro, caso contrário.

    
por leopold.talirz 11.07.2014 / 18:13

1 resposta

3

A resposta simples e estúpida:

Você pode encurtar sua sequência de comandos um pouco combinando o primeiro n -1 deles:

setfacl -m u:colleague:x  /rather /rather/long /rather/long/path /rather/long/path/to /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory

Um aviso "óbvio":

Mesmo se você tiver o diretório de destino (folha), você precisa ter acesso de execução (atravessar) a todos os diretórios no caminho. Se há algum diretório que você não tem acesso e você não possui, Você não está com sorte. (Você precisa assumir uma identidade (por exemplo, root ou o proprietário do diretório) que permite que você se acesse ou persuada alguém que tenha o poder de fazê-lo. Isso está fora do escopo desta pergunta.

Mas, se houver diretórios intermediários que você possui, mas não tem acesso a (por exemplo, alguém fez chmod 0 ), você precisa acessar de cima para baixo .

A resposta: (TL; DR)

Eu fiz o ponto acima porque isso funciona de baixo para cima:

leaf="/rather/long/path/to/the/directory"
branch="$leaf"
while branch="$(dirname "$branch")"
do
     setfacl -m u:colleague:x "$branch"  ||  break
     if [ "$branch" = / ]
     then
         break
     fi
done
setfacl -m u:colleague:xr "$leaf"

Opcionalmente, você pode ocultar qualquer mensagem de erro de setfacl adicionando 2> /dev/null . Se você tem uma situação patológica em que você 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 , porque você precisa continuar subindo na árvore depois de obter o erro em setfacl … /rather/long/path . Caso contrário, se você não for root , você poderá remover o teste if [ "$branch" = / ] , porque o loop será encerrado quando você atingir um nível de diretório onde você não pode executar setfacl . (Mas isso não é uma ótima ideia; se você salvar isso como um script, você um dia irá executá-lo como root , e então você terá um loop infinito.)

Não é preciso dizer que, se você fizer disso um script, o caminho do diretório e o nome do colega deverão ser parâmetros.

    
por 05.08.2014 / 22:39