Em geral, a única maneira de saber se o usuário B pode gravar no diretório D é para o usuário B tentar gravar no diretório D.
Então, como root, você pode su
para o usuário e tentar. Embora isso possa não ser 100% preciso, uma vez que o usuário que faz login e digita sua senha pode alterar as coisas (por exemplo, um módulo pam pode configurar chaves de criptografia com base na senha do usuário).
Quase tão preciso, novamente como root, você pode su
para o usuário e usar o access(2)
syscall ou similar. Provavelmente, isso é o que o shell faz se você usar test -w
e também o que /usr/bin/test
faz. Embora, conforme a página de manual avisa, no NFSv2, a verificação real é feita pelo servidor, mas o teste para o access
syscall é feito localmente, portanto, pode estar errado. Da mesma forma, os sistemas de arquivos FUSE podem fazer o mesmo.
(O access(2)
manpage também menciona uma condição de corrida que é fundamental para o que você está fazendo: as permissões de B em D podem mudar entre quando você checa e quando B realmente tenta escrever para D.)
Além disso, você precisa decidir o quanto está disposto a aceitar:
- Você pode definir o diretório e verificar os usuários & grupos (como várias das outras respostas mostram)
- Você também pode verificar as ACLs no diretório.
Mas mesmo se você fizer isso, o seguinte irá te enganar:
- Com o NFS e vários outros sistemas de arquivos de rede, o servidor decide se o acesso é permitido. Pode tomar essa decisão com base em, bem, o que quiser. Considere, por exemplo, as várias opções de exportação do NFS para o squash.
- As verificações de permissões são feitas pelo sistema de arquivos; sistemas de arquivos não Unix podem fornecer respostas inesperadas (como o usuário Unix é mapeado para um SID para NTFS?). Todas as apostas estão desativadas com, por exemplo, sistemas de arquivos FUSE.