Como localizo todos os arquivos e diretórios graváveis ​​por um usuário específico?

10

No Linux, como posso encontrar todos os arquivos e diretórios graváveis ​​(ou, na verdade, não graváveis) por um usuário específico?

Edit: Para esclarecer, eu quis dizer sob um subdir particular, não todo o sistema. E sim, isso significa todas as permutações e combinações de gravabilidade de usuário, grupo e mundo que permitiriam que esse usuário escrevesse. Eu sei o que a pergunta implica semanticamente, eu esperava que um ou poucos liners fossem executados para obter uma lista desses arquivos.

Pistos
fonte
Ok, obrigado a todos pelas respostas. Eu já encontrei a solução "find" via google, mas queria saber se havia alguma maneira de aplicá-la genericamente a um determinado usuário. Parece que não há outra maneira senão su como o usuário e, em seguida, execute o comando find - a menos que mais alguém participe? Amanhã vou aceitar a resposta de Ophidian, exceto em caso de respostas melhores.
Pistos

Respostas:

18

Use o comando 'find' se você tiver o findutils versão 4.3.0 ou superior instalado:

Para todos os arquivos no diretório atual que podem ser gravados pelo usuário atual:

find . -writable

Para todos os arquivos no diretório atual que não são graváveis ​​pelo usuário atual:

find . ! -writable

De acordo com a página do manual:

Este teste utiliza a chamada do sistema access (2) e, portanto, pode ser enganado pelos servidores NFS que fazem o mapeamento de UID (ou esmagamento de raiz), pois muitos sistemas implementam o acesso (2) no kernel do cliente e, portanto, não podem usar o as informações de mapeamento do UID mantidas no servidor.

Ophidian
fonte
4
Apenas pensei em mencionar para mais edificação: na verdade, eu tinha que fazer isso com um usuário que não tinha um shell de login (/ sbin / nologin). Para fazer isso, usei o sudo, assim: sudo -u ninguém encontra. ! -writable
Pistos
Isso não responde à pergunta e, portanto, não deve ser a resposta aceita. A pergunta era sobre "um usuário específico", não sobre o "usuário atual".
JLH
e para ocultar a permissão negada, os erros 2>&1 | grep -v "Permission denied"podem ser adicionadosfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Você pode criar um script Perl ( writable.pl) como este:

#!/usr/bin/perl

use strict;

sub recurse {
  my $path = shift;
  my @files = glob "$path/{*,.*}";
  for my $file (@files) {
    if (-d $file) {
      if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
        recurse($file);
      }
    } else {
      print "$file\n" if -w $file;
    }
  }
}

print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);

e use esse script, como root, da seguinte maneira:

su USERNAME -c "./writable.pl DIRECTORY"

preenchimento USERNAMEe DIRECTORYconforme apropriado.

Eddie
fonte
Excelente. Obrigado. O $ ARGV [0] é considerado vazio no shell bash no CentOS 6.2. Não sei por que. Modifiquei o script para ler de um arquivo.
apr
1

Tem certeza de que essa é realmente a pergunta que você deseja fazer?

Dizer "Quero ver todos os arquivos nos quais a conta X pode gravar" significa que todos os arquivos pertencentes a eles com u + w, todos os arquivos pertencentes a qualquer grupo ao qual pertencem estão definidos como g + w e todo mundo de arquivo gravável (o + W).

Não gravável seria ainda mais difícil. Seria melhor fazer uma lista de todos os arquivos e excluir aqueles nos quais eles podem gravar.

Matt Simmons
fonte
3
É claro que é ainda mais complicado se o sistema tiver ACLs ativadas.
Zoredache
2
Sem contar + arquivos i chattr
Matt Simmons
1

Para a resposta de Eddie, se você escrever:

my $path = quotemeta shift;

Em seguida, ele percorrerá diretórios com espaços em seus nomes também.


fonte
1

Vou usar a sintaxe gnu find para a flag -perm neste exemplo:

Basicamente - se você lançar extensões malucas como ACLs, terá três chocies - proprietário, grupo e "outros" acessos de gravação. Soa como um trabalho para um loop.

Há muito espaço para otimizar isso, mas deixarei isso para outra pessoa ... Além disso, nunca consigo me lembrar de todos os detalhes de encontrar e cruzar sistemas de arquivos e esse tipo de bobagem. Além disso, verifique se a saída dos grupos é igual à do meu sistema linux de teste

$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$

Este é um exemplo aproximado de como você encontra arquivos graváveis ​​por um usuário. Isso será executado quando qualquer usuário, mas se você o executar como um usuário não uid0, encontrará apenas itens que estão nos diretórios para os quais o usuário que está executando o script possui permissões de leitura e execução.

#!/bin/sh

user=snoopy

directory=/

# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null


# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
  find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done

# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null
chris
fonte
1

Este comando deve encontrar todos os diretórios graváveis, você pode alterar as permissões como achar melhor:

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;
Boschko
fonte
0

Não tenho certeza se essa é a melhor maneira, mas deve fazer o que você pede:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

é claro que a chave está no -wswitch, que também pode ser negada

EDIT: Pensando mais sobre isso, este script imprime o que é gravável pelo usuário atual, obviamente não funcionaria para um determinado usuário.

Slartibartfast
fonte
Obviamente, você deve executar esse script como esse usuário.
Eddie
sim, percebi ...
Slartibartfast
como você escreveria isso em perl?
ealeon