Come posso trovare tutti i file e le directory scrivibili da un utente specifico?


10

Sotto Linux, come posso trovare tutti i file e le directory che sono scrivibili (o, in realtà, non scrivibili) da un determinato utente?

Modifica: per chiarire, intendevo sotto un particolare sottodir, non a livello di sistema. E sì, ciò significa tutte le permutazioni e combinazioni di scrivibilità di utenti, gruppi e mondi che consentirebbero a quell'utente di scrivere. So cosa comporta semanticamente la domanda, speravo in una o poche righe da eseguire per ottenere un elenco di questi file.


Va bene, grazie a tutti per le risposte. Ho già trovato la soluzione "trova" tramite google, ma mi chiedevo se ci fosse un modo per applicarla genericamente a un determinato utente. Sembra che non ci sia altro modo che su come utente, quindi eseguire il comando find - a meno che non intervenga qualcun altro? Accetterò domani la risposta di Ophidian, salvo eventuali risposte migliori.
Pistos,

Risposte:


18

Usa il comando 'trova' se hai installato findutils versione 4.3.0 o successiva:

Per tutti i file nella directory corrente che sono scrivibili dall'utente corrente:

find . -writable

Per tutti i file nella directory corrente che non sono scrivibili dall'utente corrente:

find . ! -writable

Secondo la pagina man:

Questo test fa uso della chiamata di sistema access (2) e quindi può essere ingannato dai server NFS che eseguono il mapping UID (o root-squashing), poiché molti sistemi implementano l'accesso (2) nel kernel del client e quindi non possono fare uso di le informazioni sulla mappatura UID conservate sul server.


4
Ho pensato di menzionarlo per ulteriori edificazioni: in realtà ho dovuto farlo con un utente che non aveva una shell di accesso (/ sbin / nologin). Per farlo, ho usato sudo, in questo modo: sudo -u nessuno lo trova. ! -writable
Pistos

Questo non risponde alla domanda e quindi non dovrebbe essere la risposta accettata. La domanda riguardava "un utente particolare", non "l'utente corrente".
Jl

e per nascondere il permesso negato errori aggiungere 2>&1 | grep -v "Permission denied"esserefind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

Puoi creare uno script Perl ( writable.pl) in questo modo:

#!/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 quindi usa questo script, come root, come segue:

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

compilando USERNAMEe DIRECTORYcome appropriato.


Eccellente. Grazie. $ ARGV [0] è considerato vuoto nella shell bash su CentOS 6.2. Non so perché. Ho modificato lo script per leggere da un file.
doon,

1

Sei sicuro che sia davvero la domanda che vuoi porre?

Dire "Voglio vedere tutti i file su cui l'account X può scrivere" significa ogni file di loro proprietà con u + w, ogni file di proprietà di qualsiasi gruppo a cui appartengono impostato g + w, e ogni mondo di file scrivibile (o + w).

Non scrivibile sarebbe ancora più difficile. Faresti meglio a fare un elenco di tutti i file, quindi escludere quelli su cui possono scrivere.


3
Naturalmente è ancora più complicato se nel sistema sono abilitati gli ACL.
Zoredache,

2
Senza contare i file chattr + i
Matt Simmons,

1

Per la risposta di Eddie se lanci:

my $path = quotemeta shift;

Quindi attraverserà anche le directory con spazi nel loro nome.


1

Userò la sintassi di gnu find per il flag -perm in questo esempio:

Fondamentalmente - se scarichi estensioni stravaganti come ACL, hai 3 cioccolatini - proprietario, gruppo e "altro" accesso in scrittura. Sembra un lavoro per un ciclo.

C'è un sacco di spazio per ottimizzare questo, ma lo lascerò a qualcun altro ... Inoltre, non riesco mai a ricordare tutti i dettagli di trovare e attraversare i filesystem e quel tipo di assurdità. Inoltre, assicurati che l'output dei gruppi sia lo stesso del mio sistema Linux di prova

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

Questo è un esempio approssimativo di come potresti trovare file scrivibili da un utente. Questo verrà eseguito come qualsiasi utente, ma se lo esegui come un utente diverso da uid0 troverai solo le cose che si trovano nelle directory in cui l'utente che esegue lo script ha sia le autorizzazioni di lettura che quelle di esecuzione.

#!/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

1

Questo comando dovrebbe trovare tutte le directory scrivibili, puoi modificare le autorizzazioni come ritieni opportuno:

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

0

Non sono sicuro che sia il modo migliore, ma dovrei fare ciò che chiedi:

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

la chiave è ovviamente nello -wswitch, che può anche essere negata

EDIT: Pensando di più a questo, questo script stampa ciò che è scrivibile dall'utente corrente, ovviamente non funzionerebbe per un determinato utente.


Ovviamente, devi eseguire questo script come quell'utente.
Eddie,

sì, immaginavo ...
Slartibartfast,

come lo scriveresti in perl?
ealeon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.