Jak znaleźć wszystkie pliki i katalogi do zapisu przez konkretnego użytkownika?

10

Jak pod Linuksem mogę znaleźć wszystkie pliki i katalogi, które są zapisywalne (a właściwie nie do zapisu) przez konkretnego użytkownika?

Edycja: Aby wyjaśnić, miałem na myśli konkretny podkatalog, a nie cały system. I tak, oznacza to wszystkie permutacje i kombinacje zapisu użytkownika, grupy i świata, które pozwoliłyby temu użytkownikowi pisać. Wiem, co obejmuje pytanie semantycznie, miałem nadzieję na wykonanie jednego lub kilku linijek, aby uzyskać listę tych plików.

Pistacje
źródło
OK, dziękuję wszystkim za odpowiedzi. Znalazłem już rozwiązanie „znajdź” za pośrednictwem google, ale zastanawiałem się, czy istnieje jakiś sposób na ogólne zastosowanie go do danego użytkownika. Wygląda na to, że nie ma innego sposobu, jak su jako użytkownik, a następnie uruchomić polecenie find - chyba że ktoś jeszcze włączy się? Przyjmę odpowiedź Ophidiana jutro, z wyjątkiem jakichkolwiek lepszych odpowiedzi.
Pistos

Odpowiedzi:

18

Użyj polecenia „znajdź”, jeśli masz zainstalowany program findutils w wersji 4.3.0 lub nowszej:

Dla wszystkich plików w bieżącym katalogu, które mogą być zapisywane przez bieżącego użytkownika:

find . -writable

Dla wszystkich plików w bieżącym katalogu, których bieżący użytkownik nie może zapisać:

find . ! -writable

Według strony podręcznika:

Ten test korzysta z wywołania systemowego access (2) i dlatego może zostać oszukany przez serwery NFS, które wykonują mapowanie UID (lub squashing), ponieważ wiele systemów implementuje dostęp (2) w jądrze klienta i dlatego nie może korzystać z informacje o mapowaniu UID przechowywane na serwerze.

Ophidian
źródło
4
Pomyślałem, że wspomnę o dalszej edycji: faktycznie musiałem to zrobić z użytkownikiem, który nie miał powłoki logowania (/ sbin / nologin). Aby to zrobić, użyłem sudo, w ten sposób: sudo -u nikt nie znajduje. ! -pryskliwy
Pistos
To nie odpowiada na pytanie i dlatego nie powinno być zaakceptowaną odpowiedzią. Pytanie dotyczyło „konkretnego użytkownika”, a nie „bieżącego użytkownika”.
jlh
i aby ukryć błędy dodać uprawnien 2>&1 | grep -v "Permission denied"byćfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Możesz utworzyć skrypt Perla ( writable.pl) w następujący sposób:

#!/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]);

a następnie użyj tego skryptu jako root w następujący sposób:

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

wypełnianie USERNAMEi DIRECTORYodpowiednio.

Eddie
źródło
Świetny. Dziękuję Ci. $ ARGV [0] jest traktowany jako pusty w powłoce bash na CentOS 6.2. Nie pewny dlaczego. Zmodyfikowałem skrypt, aby czytał z pliku.
doon
1

Czy jesteś pewien, że to naprawdę pytanie, które chcesz zadać?

Powiedzenie „Chcę zobaczyć wszystkie pliki, do których konto X może zapisywać” oznacza każdy plik należący do nich za pomocą u + w, każdy plik należący do dowolnej grupy, do której należą, który jest ustawiony g + w, i każdy świat plików do zapisu (o + w).

Nie zapisanie byłoby jeszcze trudniejsze. Lepiej byłoby zrobić listę wszystkich plików, a następnie wykluczyć te, do których mogą pisać.

Matt Simmons
źródło
3
Oczywiście jest to jeszcze bardziej skomplikowane, jeśli system ma włączone listy ACL.
Zoredache,
2
Nie licząc plików chattr + i
Matt Simmons
1

Na odpowiedź Eddiego, jeśli wrzucisz:

my $path = quotemeta shift;

Następnie przejdzie do katalogów ze spacjami w ich nazwie.


źródło
1

W tym przykładzie użyję składni find gnu dla flagi -perm:

Zasadniczo - jeśli wyrzucasz zwariowane rozszerzenia, takie jak ACL, masz 3 chocies - właściciela, grupy i „inne” prawa zapisu. Brzmi jak praca w pętli.

Jest mnóstwo miejsca na zoptymalizowanie tego, ale zostawię to komuś innemu ... Poza tym nigdy nie pamiętam wszystkich szczegółów dotyczących znajdowania i przekraczania systemów plików i tego rodzaju bzdur. Upewnij się także, że wyjście grup jest takie samo jak w moim testowym systemie Linux

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

To jest przybliżony przykład tego, jak użytkownik może zapisywać pliki do zapisu. Będzie to działać jako dowolny użytkownik, ale jeśli uruchomisz go jako użytkownik inny niż uid0, znajdziesz tylko te rzeczy, które znajdują się w katalogach, do których użytkownik uruchamiający skrypt ma zarówno uprawnienia do odczytu, jak i wykonywania.

#!/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
źródło
1

To polecenie powinno znaleźć wszystkie zapisywalne katalogi, możesz zmienić uprawnienia według własnego uznania:

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

Nie jestem pewien, czy to najlepszy sposób, ale powinienem zrobić to, o co prosisz:

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

Klawisz jest oczywiście w -wprzełączniku, który można również zanegować

EDYCJA: Zastanawiając się nad tym, ten skrypt wypisuje to, co jest możliwe do zapisania przez bieżącego użytkownika, oczywiście nie zadziałałoby dla danego użytkownika.

Slartibartfast
źródło
Oczywiście musisz uruchomić ten skrypt jako ten użytkownik.
Eddie
tak, wymyślił ...
Slartibartfast
jak napisałbyś to w perlu?
ealeon