Como encontrar um arquivo com permissão específica de um usuário específico?

Como encontrar um arquivo com permissão específica de um usuário específico?

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 finde 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 idGNU Coreutils e finddo GNU findutils. As implementações para Mac ide findpodem 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 ide find- as coisas a procurar que podem exigir modificação para se adequar a um Mac são as opções -Ge para e as opções ou '-perm -' de .-uid-perm /find

Responder2

Isso ocorre porque -usera 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.

informação relacionada