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

9

No Linux, como posso encontrar todos os arquivos e diretórios que podem ser gravados (ou, na verdade, não graváveis) por um usuário em particular?

Edit: Para esclarecer, eu quis dizer sob um subdir particular, não em todo o sistema. E sim, isso significa todas as permutações e combinações de escritura de usuário, grupo e mundo que permitiriam ao usuário escrever. Eu sei o que a questão implica semanticamente, eu estava esperando por um ou poucos liner para executar para obter uma lista desses arquivos.

    
por Pistos 02.06.2009 / 02:04

7 respostas

17

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

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 podem ser gravados pelo usuário atual:

find . ! -writable

De acordo com a página man:

This test makes use of the access(2) system call, and so can be fooled by NFS servers which do UID mapping (or root-squashing), since many systems implement access(2) in the client’s kernel and so cannot make use of the UID mapping information held on the server.

    
por 02.06.2009 / 03:38
3

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

#!/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 este script, como root, da seguinte forma:

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

preenchendo USERNAME e DIRECTORY conforme apropriado.

    
por 02.06.2009 / 03:28
1

Tem certeza de que essa é realmente a pergunta que você quer perguntar?

Para dizer "Quero ver todos os arquivos para os quais a conta X pode gravar", todos os arquivos pertencentes a eles com u + w, todos os arquivos pertencentes a um grupo ao qual eles pertencem são g + w e todos os arquivos graváveis (o + w).

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

    
por 02.06.2009 / 02:07
1

Para a resposta de Eddie, se você jogar:

my $path = quotemeta shift;

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

    
por 15.10.2009 / 18:56
1

Vou usar a sintaxe de localização do gnu para o sinalizador -perm neste exemplo:

Basicamente - se você jogar fora extensões malucas como ACLs, você tem 3 chocies - proprietário, grupo e "outro" acesso de gravação. Soa como um trabalho por 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, certifique-se de que a saída dos grupos seja a mesma do meu sistema linux de teste

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

Este é um exemplo aproximado de como você encontraria arquivos graváveis por um usuário. Isso acontecerá quando for executado como qualquer usuário, mas se você executá-lo como um usuário não-uid0, somente encontrará itens que estejam nos diretórios em que o usuário que está executando o script tenha 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
    
por 23.06.2009 / 17:43
0

Não tenho certeza se esse é o melhor caminho, mas devo fazer o que você perguntar:

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

é claro em -w switch, 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.

    
por 02.06.2009 / 02:47
0

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 {} \;
    
por 23.05.2018 / 22:19