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

4

Como obtenho uma lista de todos os arquivos com permissão para "ler e escrever" para um usuário específico.

Por exemplo, quando eu vou para a área de trabalho do meu mac, clico com o botão direito no arquivo "A", depois "get info", então no fundo eu tenho "share and permission" onde eu posso adicionar um usuário customizado "popo" por exemplo e, em seguida, especifique que ele pode "ler e gravar" esse arquivo.

Então eu quero usar uma linha de comando para obter todos os arquivos que o POPO pode ler e escrever, e apenas estes (eu quero pegar "A" no exemplo acima).

Todas as minhas pesquisas me levam, por enquanto, a algo como:

find /Users/Me/Desktop -user popo -perm 777

Mas eu não recebo nada ..

Qual é o problema com o find acima e como devo proceder?

    
por lapin 19.09.2013 / 09:11

3 respostas

3

Você precisa procurar por arquivos que são RW por todos OU são RW pelo usuário uid OU que são RW por todos os grupos dos quais o usuário é membro. Mas é um pouco mais complicado que isso. Como apontado por aqui por Stephane Chazelas, se um arquivo for de propriedade de um usuário, então SOMENTE o proprietário perms count, e se um arquivo pertencer a um grupo do qual o usuário é membro, então apenas o grupo perms count.

Portanto, precisamos verificar "owner = 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 lances de grupo dos quais um usuário é membro com id -G . Isso pode ser usado para construir uma linha de comando de localização com a substituição do comando shell padrão.

Minha resposta original tinha um one-liner, mas esse trabalho é complexo demais para querer fazer em um one-liner. Aqui está um script de 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 últimas versões de id do GNU Coreutils e find do GNU findutils. As implementações do Mac de 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 em relação a id e find - as coisas que precisam ser modificadas para um Mac são as opções -G e -u para id e -perm / ou '-perm -' opções de find .

    
por 19.09.2013 / 09:57
2

Isso porque a opção -user pesquisa arquivos onde o usuário especificado é proprietário do arquivo e esse não é o seu caso.

Parece que a maneira mais fácil de fazer o que você quer é executar o comando sob o usuário popo:

find /Users/Me/Desktop -readable
    
por 19.09.2013 / 09:21
1
sudo find . -print0 | 
  sudo -u popo perl -Mfiletest=access -l -0ne '
    print if -r && -w'

Veja essa resposta a uma pergunta quase idêntica porque a verificação das permissões geralmente não funciona.     

por 19.09.2013 / 11:08