Como saber se um determinado utilizador tem permissões de leitura e/ou gravação permissões para um determinado caminho
-
12-12-2019 - |
Pergunta
Devo começar por dizer que eu me considero um utilizador proficiente.Mas hoje eu tive a necessidade de se automatizar este e ficou perplexo.
Vamos supor que eu sou raiz, e, como tal, eu sou capaz de atravessar todo o sistema de arquivos, mas eu não consigo executar o comando "sudo" ou "su".
Eu tenho um determinado usuário e um determinado caminho.
Como posso verificar, através da CLI, se o usuário será capaz de ler e/ou escrever para o caminho?
Eu sei que isto parece fácil, mas tenha em mente que:
- Não somos, nem podemos ser, o usuário.
- Não podemos confiar apenas no final permissões de diretório, as permissões mais o caminho pode estar bloqueando o acesso para o diretório final.
- Não podemos confiar apenas no diretório, as permissões do grupo ou, na era dos herdadas grupos.
Eu estou supondo que isso não pode ser feito através de qualquer comando, e eu preciso, primeiro, reunir todos os grupos de usuário e, em seguida, atravessar toda a hierarquia do caminho, verifique as permissões de leitura ao longo de todo o caminho e, em seguida, leitura e gravação para o diretório final.Soa terrivelmente caro, porém.
Solução
Tag-me um script de guru!
check_access() {
checked_file=$1
target_user=$2
result=PASS
groups=`id -G $target_user | sed -e 's| | -o -group |g' -e 's|^|\\( -group |' -e 's|$| \\)|'`
while [ $checked_file != / ]; do
find $checked_file -maxdepth 0 \
-type f \( \
\( -user $target_user -perm 0400 \) \
-o \( $groups -perm 0040 \) \
-o -perm 0004 \
\) -o -type d \( \
\( -user $target_user -perm 0100 \) \
-o \( $groups -perm 0010 \) \
-o -perm 0001 \
\) >/dev/null 2>&1 || result=FAIL
checked_file=`dirname $checked_file`
done
echo $result
}
Outras dicas
Eu realmente não pode fornecer uma resposta completa, e eu não posso adicionar nada de substancial para suas próprias idéias, exceto, talvez, esta:
Eu suspeito que uma abordagem geral para a verificação efetiva de direitos de acesso não existe, simplesmente porque os direitos de acesso dependem fortemente o sistema de arquivos subjacente(s).Por exemplo, verificar os direitos de acesso funciona de forma bastante diferente em sistemas de arquivos que usa o padrão do Unix rwx
sinalizadores (e.g.Linux ext2, ext3) do que com sistemas de arquivos que oferecem suporte a ACLs (como O XFS ou NTFS).
Pode haver vários ferramentas de linha de comando que fazer o que você quer fazer para específicos tipos de sistema de arquivos.(Analogia:ferramentas como o fsck
, mkfs
podem existir por tipo de sistema de arquivo.)
Especialmente com sistemas operacionais UNIX-like, onde todos os tipos de sistemas de arquivos podem ser montados em uma grande estrutura de diretório, assumindo apenas uma permissões específicas mecanismo pode levar a problemas.
Se você construir a sua própria solução para este problema, pensar sobre o fato e, em seguida, decidir exatamente o que o direito de acesso mecanismo(s) que você deseja suporte.(Eu não tenho certeza, mas eu poderia imaginar que o Unix / POSIX especificação prescreve o rwx
direitos de acesso bandeiras como mínimo que qualquer Unix deve suportar.)
a melhor maneira é para validar através do próprio usuário:
if sudo su - $user_to_check -c "[[ -r $path_to_check ]]"
then echo "$user_to_check can read $path_to_check"
else echo "$user_to_check can not read $path_to_check"
fi
if sudo su - $user_to_check -c "[[ -w $path_to_check ]]"
then echo "$user_to_check can write $path_to_check"
else echo "$user_to_check can not write $path_to_check"
fi
ls -l <file-name or dir-name>
Suponha que você deseja verificar as permissões para o diretório de uploads.Entrar
ls -l uploads
O resultado será como este
total 20
drwxrwxr-x 2 tomcat ec2-user 4096 Nov 5 04:21 deals
drwxrwxr-x 2 tomcat ec2-user 4096 Nov 5 04:25 gallery-images
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:25 hotels
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:28 rooms
drwxrwxr-x 3 tomcat ec2-user 4096 Nov 5 04:32 temp