Wie finde ich alle Dateien und Verzeichnisse, die von einem bestimmten Benutzer geschrieben werden können?

10

Wie kann ich unter Linux alle Dateien und Verzeichnisse finden, die von einem bestimmten Benutzer beschreibbar (oder tatsächlich nicht beschreibbar) sind?

Bearbeiten: Zur Verdeutlichung habe ich unter einem bestimmten Unterverzeichnis gemeint, nicht systemweit. Und ja, das bedeutet alle Permutationen und Kombinationen von Benutzer-, Gruppen- und Weltschreibbarkeit, die es diesem Benutzer ermöglichen würden, zu schreiben. Ich weiß, was die Frage semantisch bedeutet. Ich hatte gehofft, dass ein oder mehrere Zeilen ausgeführt werden, um eine Liste dieser Dateien zu erhalten.

Pistos
quelle
Okay, danke an alle für die Antworten. Ich habe die "find" -Lösung bereits über Google gefunden, habe mich aber gefragt, ob es eine Möglichkeit gibt, sie generisch auf einen bestimmten Benutzer anzuwenden. Sieht so aus, als gäbe es keine andere Möglichkeit, als als Benutzer zu su und dann den Befehl find auszuführen - es sei denn, jemand anderes mischt sich ein? Ich werde Ophidians Antwort morgen irgendwann akzeptieren, sofern keine besseren Antworten vorliegen.
Pistos

Antworten:

18

Verwenden Sie den Befehl 'find', wenn Sie findutils Version 4.3.0 oder höher installiert haben:

Für alle Dateien im aktuellen Verzeichnis, die vom aktuellen Benutzer geschrieben werden können:

find . -writable

Für alle Dateien im aktuellen Verzeichnis, die vom aktuellen Benutzer nicht beschreibbar sind:

find . ! -writable

Laut Manpage:

Dieser Test verwendet den Systemaufruf access (2) und kann daher von NFS-Servern getäuscht werden, die UID-Mapping (oder Root-Squashing) durchführen, da viele Systeme den Zugriff (2) im Kernel des Clients implementieren und daher nicht verwenden können die auf dem Server gespeicherten UID-Zuordnungsinformationen.

Ophidian
quelle
4
Ich dachte nur, ich würde es zur weiteren Erbauung erwähnen: Ich musste dies tatsächlich mit einem Benutzer tun, der keine Login-Shell (/ sbin / nologin) hatte. Dazu habe ich sudo wie folgt verwendet: sudo -u niemand findet. ! -beschreibbar
Pistos
Dies beantwortet die Frage nicht und sollte daher nicht die akzeptierte Antwort sein. Die Frage betraf "einen bestimmten Benutzer", nicht den "aktuellen Benutzer".
jlh
und um die Erlaubnis verweigert Fehler zu verbergen, fügen Sie hinzu 2>&1 | grep -v "Permission denied", umfind . -writable 2>&1 | grep -v "Permission denied"
iolsmit
3

Sie können ein Perl-Skript ( writable.pl) wie folgt erstellen :

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

und verwenden Sie dieses Skript dann wie folgt als root:

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

Ausfüllen USERNAMEund DIRECTORYgegebenenfalls.

Eddie
quelle
Ausgezeichnet. Vielen Dank. Das $ ARGV [0] wird in der Bash-Shell unter CentOS 6.2 als leer genommen. Nicht sicher warum. Ich habe das Skript so geändert, dass es aus einer Datei gelesen werden kann.
Doon
1

Sind Sie sicher, dass dies wirklich die Frage ist, die Sie stellen möchten?

Zu sagen "Ich möchte alle Dateien sehen, in die das X-Konto schreiben kann" bedeutet, dass jede Datei, deren Eigentümer sie sind, mit u + w, jede Datei, die einer Gruppe gehört, zu der sie gehören, g + w festgelegt ist, und jede Dateiewelt beschreibbar ist (o +) w).

Nicht beschreibbar wäre noch schwieriger. Sie sollten besser eine Liste aller Dateien erstellen und dann diejenigen ausschließen, in die sie schreiben können.

Matt Simmons
quelle
3
Noch komplizierter ist es natürlich, wenn auf dem System ACLs aktiviert sind.
Zoredache
2
Chattr + i-Dateien nicht mitgerechnet
Matt Simmons
1

Für Eddies Antwort, wenn Sie einwerfen:

my $path = quotemeta shift;

Dann werden auch Verzeichnisse mit Leerzeichen in ihrem Namen durchlaufen.


quelle
1

In diesem Beispiel verwende ich die gnu find-Syntax für das Flag -perm:

Grundsätzlich - wenn Sie verrückte Erweiterungen wie ACLs wegwerfen, haben Sie 3 Chocies - Eigentümer, Gruppe und "andere" Schreibzugriff. Klingt nach einem Job für eine Schleife.

Es gibt viel Raum, um dies zu optimieren, aber ich überlasse das jemand anderem ... Außerdem kann ich mich nie an alle Details des Findens und Kreuzens von Dateisystemen und an diese Art von Unsinn erinnern. Stellen Sie außerdem sicher, dass die Ausgabe von Gruppen dieselbe ist wie auf meinem Test-Linux-System

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

Dies ist ein grobes Beispiel dafür, wie Sie Dateien finden, die von einem Benutzer geschrieben werden können. Dies wird ausgeführt, wenn Sie als ein beliebiger Benutzer ausgeführt werden. Wenn Sie es jedoch als Nicht-UID0-Benutzer ausführen, finden Sie nur Dinge in Verzeichnissen, für die der Benutzer, der das Skript ausführt, sowohl Lese- als auch Ausführungsberechtigungen hat.

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

Ich bin mir nicht sicher, ob dies der beste Weg ist, sollte aber tun, was Sie fragen:

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

Schlüssel ist natürlich im -wSchalter, der auch negiert werden kann

BEARBEITEN: Wenn Sie mehr darüber nachdenken, druckt dieses Skript, was vom aktuellen Benutzer geschrieben werden kann. Es würde offensichtlich für einen bestimmten Benutzer nicht funktionieren.

Slartibartfast
quelle
Natürlich müssen Sie dieses Skript als dieser Benutzer ausführen.
Eddie
Ja, dachte
mir
Wie würdest du das in Perl schreiben?
ealeon
0

Dieser Befehl sollte alle beschreibbaren Verzeichnisse finden. Sie können die Berechtigungen nach Belieben ändern:

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