
Como obtenho uma lista de todos os arquivos cuja permissão é "leitura e gravação" para um usuário específico.
Por exemplo, quando vou para a área de trabalho do meu mac, clico com o botão direito no arquivo "A", depois em "obter informações" e, na parte inferior, tenho "compartilhar e permissão", onde posso adicionar um usuário personalizado como "popo" por exemplo, e então especificar que ele pode "ler e gravar" esse arquivo.
Então quero usar uma linha de comando para obter todos os arquivos que o POPO pode ler e escrever, e apenas estes (quero obter "A" no exemplo acima).
Todas as minhas pesquisas me levam, por enquanto, a algo como:
find /Users/Me/Desktop -user popo -perm 777
Mas não ganho nada..
O que há de errado com o acima find
e como devo proceder?
Responder1
Você precisa procurar arquivos que sejam RW por todos OU sejam RW pelo uid do usuário OU que sejam RW por todos os grupos dos quais o usuário é membro. Mas é um pouco mais complicado do que isso. Como apontado poraquipor Stephane Chazelas, se um arquivo pertence a um usuário, SOMENTE as permissões do proprietário contam, e se um arquivo pertence a um grupo do qual o usuário é membro, apenas as permissões do grupo contam.
Portanto, precisamos verificar "proprietário = RW ou (não proprietário e grupo = rw) ou (não proprietário e não grupo e outro = rw)"
Você pode obter uma lista dos GIDs de grupo dos quais um usuário é membro com id -G
. Isso pode ser usado para construir uma linha de comando find com substituição de comando shell padrão.
Minha resposta original tinha uma linha única, mas esse trabalho é complexo demais para ser feito de uma só linha. Aqui está um script shell bash que faz o trabalho.
#! /bin/bash
U="$1" # username to do perm search on - e.g. popo
TOPDIR="$2" # starting directory for search - e.g. /Users/Me/Desktop
# permissions to search for - defaults to "rw"
PERMS=${3:-rw}
# permission bits "style". "/"=ANY or "-"=ALL. defaults to /
#
# see find(1) and search for '-perm -mode' or '-perm /mode' for
# details on how this works.
PSTYLE=${4:-/}
# construct a find expression specifying all groups that the user
# is a member of
GIDS="$(for i in $(id -G "$U"); do echo -n " -gid $i -o "; done)"
GIDS=$(echo "$GIDS" | sed -e 's/ -o $//') # strip trailing " -o "
find "$TOPDIR" \
\( -user "$U" -perm ${PSTYLE}u=$PERMS \) \
-o \( -not -user "$U" -a \( $GIDS \) -perm ${PSTYLE}g=$PERMS \) \
-o \( -not -user "$U" -not \( $GIDS \) -perm ${PSTYLE}o=$PERMS \)
Este script deve ser executado como root. Outros usuários podem não ter as permissões necessárias para procurar em todos os diretórios que o popo pode.
Nota: Eu testei isso em um sistema Debian Linux usando as versões mais recentes do id
GNU Coreutils e find
do GNU findutils. As implementações para Mac id
e find
podem ser diferentes, não tenho um Mac disponível no momento para testar. Se for diferente, verifique as páginas de manual do Mac para id
e find
- as coisas a procurar que podem exigir modificação para se adequar a um Mac são as opções -G
e para e as opções ou '-perm -' de .-u
id
-perm /
find
Responder2
Isso ocorre porque -user
a opção pesquisa arquivos onde o usuário especificado é o proprietário do arquivo e esse não é o seu caso.
Parece que a maneira mais fácil de fazer o que você deseja é executar o comando no usuário popo:
find /Users/Me/Desktop -readable
Responder3
sudo find . -print0 |
sudo -u popo perl -Mfiletest=access -l -0ne '
print if -r && -w'
Veressa resposta a uma pergunta quase idênticapara saber por que verificar as permissões geralmente não funciona.