Alle Benutzer auflisten

19

Wie kann ich alle von mir erstellten Benutzer auflisten? Ich habe es versucht cat /etc/passwdund es listet nur eine Menge Sachen auf.

anatoly techtonik
quelle

Antworten:

18

Menschliche Benutzer haben UIDs ab 1000, sodass Sie diese Tatsache verwenden können, um die Nicht-Menschen herauszufiltern:

cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1

Dies schneidet das erste (Benutzername) und dritte (UID) durch Doppelpunkte getrennte Feld ab /etc/passwd, filtert nach den resultierenden Zeilen, die mit einem Doppelpunkt und vier Ziffern enden, schneidet dann das erste (Benutzername) Feld ab und hinterlässt eine Liste von Benutzer mit UIDs zwischen 1000 und 9999.

Wenn Sie mehr als neuntausend Benutzer auf Ihrem System haben, nobodyschlägt dies fehl - es ist jedoch erforderlich, das Ergebnis auf vierstellige UIDs zu beschränken, um nicht zu fangen (UID 65534).


quelle
15

Das macht so ziemlich das, was die akzeptierte Antwort macht, nur in einem Befehl statt in drei:

awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd

Und dank Karel in den Kommentaren wird der nobodyUser auch herausgefiltert.

Oli
quelle
@karel Ja, vielleicht. Anstatt nach UID zu filtern, filtere ich diesen Benutzernamen explizit heraus. Es kann einen Grund dafür geben, einen legitimen Benutzer mit einer so hohen UID zu haben ... Wer weiß;)
Oli
9

Ich persönlich benutze gerne nur:

ls /home

Zugegebenermaßen ist dies keine Liste der Benutzer, sondern eine Liste ihrer Home-Verzeichnisse. Derzeit vorhandene Benutzer auf dem System verfügen über /homeBasisverzeichnisse. Möglicherweise werden jedoch auch die Basisverzeichnisse früherer Benutzer angezeigt, die entfernt wurden.

Dies funktioniert für meine Zwecke und möglicherweise auch für Ihre. Wenn Sie beispielsweise ein Benutzerkonto löschen möchten, das nicht mehr vorhanden ist ( nonexistent-user), führen Sie den Befehl aus

sudo deluser nonexistent-user

Es wird Ihnen lediglich mitgeteilt, dass dieser Benutzer nicht existiert.

Sam Hamblin
quelle
+1 Dieser Weg ist einfach, und er wird von den meisten erfahrenen Benutzern durchgeführt. Ich denke, er ist nicht weniger robust als Methoden, mit denen eine Reihe von UIDs überprüft werden. Es ist weniger wahrscheinlich, dass ein menschlicher Benutzer ein /homeexternes Basisverzeichnis hat (das nicht mit einem Symbol verknüpft ist /home), als dass ein menschlicher Benutzer eine UID von unter 1000 hat (schließlich ist dies die häufigste Methode, um die Auflistung eines Display-Managers zu verhindern einen Benutzer auf dem Anmeldebildschirm (was manchmal für einen menschlichen Benutzer gemacht werden kann). Der einzige, relativ geringfügige Nachteil besteht darin, dass er lost+foundauf Systemen mit separaten /homePartitionen aufgeführt wird.
Eliah Kagan
Kleines Problem: Was passiert, wenn ein Benutzer mit erstellt wurde useradd --no-create-home username?
Sergiy Kolodyazhnyy
@ Serg Ich denke es kommt auf die inhärente Mehrdeutigkeit in der Problembeschreibung an. Stellt ein Konto ohne Home-Verzeichnis wirklich einen menschlichen Benutzer dar? In der Praxis werden solche Konten normalerweise - wenn auch nicht immer - für hochspezialisierte Aufgaben (normalerweise von Personen mit eigenen separaten Konten) oder für Benutzer verwendet, die nur über bestimmte, eingeschränkte Dienste auf das System zugreifen möchten. Natürlich gibt es einen anderen Anwendungsfall für - das useradd --no-create-homeBasisverzeichnis könnte bereits vorhanden sein oder kurz danach erstellt werden -, aber die ls /homeMethode funktioniert in diesen Fällen einwandfrei .
Eliah Kagan
4

Während es wie eine klare Idee scheinen mag, gibt es tatsächlich Mehrdeutigkeiten in der Bedeutung des menschlichen Benutzers . Ist ein Benutzerkonto absichtlich vor dem Anmeldebildschirm verborgen, weil es nur für spezielle Zwecke (aber von Menschen) als menschlicher Benutzer verwendet wird? Wie wäre es mit dem ubuntuBenutzer (UID 999) auf der Live-CD? Und Gastkonten in Ubuntu werden sofort erstellt und nach dem Abmelden gelöscht. sind sie menschliche Benutzer? Weitere Beispiele könnten ausgearbeitet werden.

Daher ist es angemessen, dass mehrere, nicht äquivalente Antworten gegeben wurden. Saige Hamblins Lösung für das Laufen ls /homeist das, was die Leute tatsächlich tun, und wenn Sie kein Skript schreiben, sollten Sie das wahrscheinlich nur verwenden.

Herstellung ls /homerobuster

Aber vielleicht haben Sie Benutzer, die entfernt wurden, in denen jedoch noch private Verzeichnisse vorhanden sind /home, und Sie müssen vermeiden, sie aufzulisten. Oder Sie müssen aus einem anderen Grund sicherstellen, dass nur die Einträge aufgeführt werden /home, die den tatsächlichen Konten entsprechen.

In diesem Fall empfiehlt vorbei ich die Namen von allem , was in /homezu getent(zum Abrufen der passwdEinträge der Nutzer mit diesen Namen), dann Isolat und Anzeige nur den Benutzernamen Feld (mit grep, sedoder awk, wie pro Ihre Präferenz). Jeder von diesen wird tun:

getent passwd $(ls /home) | grep -o '^[^:]*'
getent passwd $(ls /home) | sed 's/:.*//'
getent passwd $(ls /home) | awk -F: '{print $1}'

Dies sollte gut funktionieren, da Sie keine Benutzerkonten mit Leerzeichen oder Steuerzeichen im Namen haben sollten. kann nicht, ohne Ubuntu neu zu konfigurieren, um es zu erlauben ; und wenn Sie dies tun, haben Sie größere Probleme. Daher sind die üblichen Probleme beim Parsen lsnicht anwendbar. Aber auch wenn es hier wirklich in Ordnung ist, wenn Sie Befehlssubstitutionen als lsästhetisch unangenehm oder nur als schlechte Angewohnheit ansehen, können Sie Folgendes bevorzugen:

getent passwd $(basename -a /home/*) | grep -o '^[^:]*'
getent passwd $(basename -a /home/*) | sed 's/:.*//'
getent passwd $(basename -a /home/*) | awk -F: '{print $1}'

Diese unterstützen auch keine Leerzeichen oder Steuerzeichen. Ich biete sie nur an, weil sie $(ls /home)falsch aussieht, auch wenn sie richtig ist, und so viele Benutzer in die falsche Richtung reibt. In den meisten Situationen gibt es gute Gründe, das Parsen zu vermeidenls , und in diesen Situationen ist das Parsen basename -anormalerweise nur geringfügig weniger schlecht. In dieser Situation sind beide Zeichen jedoch in Ordnung , da die Anzahl der in Benutzernamen vorkommenden Zeichen begrenzt ist .

Erklärung, Vor- und Nachteile

Ich benutze es getenthauptsächlich, weil es Benutzernamen als Argumente akzeptiert, um seine Ausgabe einzuschränken, aber auch, weil es etwas universeller ist als /etc/passwddirekt zu untersuchen , falls Authentifizierungsmöglichkeiten und die Passwortdatenbank von Netzwerkdiensten bereitgestellt werden.

Diese Methode hat den zusätzlichen Vorteil, ls /homedass sie auf Systemen mit einer separaten /homePartition lost+foundnormalerweise in der Ausgabe von angezeigt wird ls /home.

  • Mit der oben dargestellten robusteren Methode lost+foundwird nur angezeigt, wenn zufällig ein Benutzer (menschlich oder nicht) angerufen wird lost+found, was unwahrscheinlich ist.
  • Aber wenn Sie Befehle interaktiv eingeben, anstatt ein Skript zu schreiben, ls /homeist das in Ordnung - Sie wissen, dass Sie keinen menschlichen Benutzer haben, der angerufen wird lost+found.

In seltenen Fällen führt diese Methode (in einer der oben genannten Varianten) zu einer unbefriedigenden Ausgabe:

  • Wenn das Home-Verzeichnis eines Benutzers außerhalb /homeoder gar nicht vorhanden ist, bedeutet dies, dass das Konto keinen menschlichen Benutzer darstellt. Diese Methode listet nur Benutzer auf, in denen sich ein Verzeichnis mit demselben Namen befindet /home.
  • Wenn Sie weitere Verzeichnisse angelegt haben , in /homedem Home - Verzeichnis nicht eigentlich niemandes sind, und sie zufällig die gleichen Namen wie ein bestehenden nicht-menschlichen Benutzer haben - oder aus Worten bestehen durch Leerzeichen getrennt, ein oder mehrere davon haben den gleichen Namen als vorhandener nichtmenschlicher Benutzer - dann können einige nichtmenschliche Benutzer in die Ausgabe einbezogen werden.
    (Diese Methode kann mit einer Schleife und separaten getentAufrufen implementiert werden , sodass die Wortteilung keine falschen Ausgaben erzeugt. Die Komplexität ist jedoch nicht gewährleistet. Grundsätzlich /homegilt diese Methode , wenn Sie sie nicht als Speicherort für die privaten Verzeichnisse der Benutzer verwenden keine zuverlässige Ausgabe erzeugen.)

Vereinfachen der UID-Überprüfung

Wenn Sie sich für eine Methode entscheiden, die Benutzer-IDs überprüft, um sicherzustellen, dass sie für Konten, die Menschen darstellen, im wahrscheinlichen Bereich liegen, wie in der akzeptierten Antwort oder der Antwort von Oli , dann schlage ich dies der Kürze halber vor:

getent passwd | grep -oP '^[^:]+(?=:x:\d{4}:)'

Dies verwendet einen regulären Perl-Ausdruck ( -P), um Folgendes anzuzeigen :

  • Text am Anfang einer Zeile ( ^), die kein :s ( [^:]+) enthält - dies ist das erste Feld, ebenso :wie das Feldtrennzeichen inpasswd
  • das geht voraus, enthält aber nicht ( (?= )) das Passwortfeld x- es sollte immer so sein x, da in Ubuntu Passwort-Hashes in der shadowDatenbank gespeichert werden, nicht in der weltlesbaren passwdDatenbank
  • und ein UID-Feld, bestehend aus genau 4 Ziffern ( :\d{4}:).

Dies ist somit eine deutlich kürzere und etwas einfachere Variante der Technik in der akzeptierten Antwort . (Die dort beschriebene Technik funktioniert auch einwandfrei und hat den Vorteil, dass sie auf Nicht-GNU / Linux-Systeme portierbar ist, grepdie nicht unterstützt werden -P.)

Überprüfung des "menschlichen" UID-Bereichs

Wenn Sie sehr hohe UIDs berücksichtigen und nobodyexplizit nachsehen möchten , können Sie die Methode in Olis Antwort verwenden . Möglicherweise möchten Sie jedoch überlegen, ob Benutzer mit sehr hohen UIDs tatsächlich als Benutzer angenommen werden sollten oder ob es wahrscheinlicher ist, dass es sich bei ihnen um einen anderen nicht-menschlichen Spezialbenutzer handelt (z. B. nobody). In der Praxis sind solche Benutzer - abgesehen nobodydavon - ungewöhnlich, so dass dies in Wirklichkeit ein Urteilsspruch von Ihrer Seite ist.

Ein möglicher Kompromiss besteht darin, Benutzer in dem Bereich von UIDs aufzulisten , die tatsächlich neu erstellten Nicht-Systembenutzern zugewiesen werden. Sie können dies überprüfen inadduser.conf :

$ grep -E '^(FIRST|LAST)_UID' /etc/adduser.conf
FIRST_UID=1000
LAST_UID=29999

Es gibt zwei Möglichkeiten, Benutzer aufzulisten, deren UIDs zwischen 1000 und 29999 liegen:

getent passwd | grep -oP '^[^:]+(?=:x:[12]?\d{4}:)'
getent passwd | awk -F: '999<$3 && $3<30000 {print $1}'
Eliah Kagan
quelle
Wer stilistisch ansprechend sein wollte, basenameist hässlich. Es ist nicht besser als ls. Der Hauptgrund, den wir nicht analysieren, ist, dass es sich um eine Arbeit handelt, die mit anderen Werkzeugen viel sicherer und sauberer erledigt werden kann, nicht mit Stil. In diesem Fall wird die Schale: cd /home; getent passwd *.
muru
Ich bin damit einverstanden, dass Sie zu Hause unzuverlässig sind (es ist für mich nutzlos, siehe meine Antwort). Ich sage nur, wenn du über Stil predigen willst, dann erwarte Nitpicking.
muru
@muru Ich sehe, wie meine ursprüngliche Formulierung die Leute irreführen könnte, zu denken, dass es beim Vermeiden des Parsens lsnormalerweise um Stil geht. Der zweite Aufzählungspunkt über "unbefriedigende Ausgabe" behandelte das Problem, aber er erscheint in einem späteren Abschnitt. Ich habe umformuliert, um zu verdeutlichen, warum das Parsen in dieser Situationls angemessen ist . Obwohl eine nehmen Form oft Anzeichen für einen solidere Ansatz habe ich es vermieden , um nicht die Leser zu führen , den Inhalt zu glauben , Verzeichnisse, mit seltsamen Eintragungen nicht zu echten Benutzern entsprechen, könnte noch irgendwie auf als Leitfaden herangezogen werden, was Benutzer existieren. cd /home; getent passwd */home
Eliah Kagan
1

TL; DR : Nur menschliche Benutzer haben SystemAccount = false

Eine andere Möglichkeit besteht darin, die Ausgabe von unter Ignorierung von root aufzulisten ls /var/lib/AccountsService/users/ | grep -v root. Jetzt gibt es eine Besonderheit - gdm, ein Begrüßungs- / Anmeldebildschirm (oder formal Desktop Manager) wird ebenfalls als Benutzer aufgeführt. Aus der Auflistung können wir also nicht ersehen, ob GDM ein Mensch ist oder nicht.

Ein effizienterer und korrekterer Ansatz besteht darin, die Dateien in diesem Ordner zu durchsuchen und herauszufinden, welche Benutzer als solche aufgeführt sind SystemAccount=false. Das schafft der Einzeiler-Balg

grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'

Sergiy Kolodyazhnyy
quelle
1
Obwohl dies manchmal praktisch ist, schlägt dies in einigen relativ häufigen Szenarien fehl. Zum Beispiel habe ich auf meinem Ubuntu 15.04-Minimalsystem (installiert von mini.isound ohne Display Manager oder X11) ein Benutzerkonto - /var/lib/AccountsService/usersist aber ein leeres Verzeichnis. Ich gehe davon aus, dass dies bei einer sofort einsatzbereiten Ubuntu Server-Installation ebenfalls nicht funktioniert. Wenn dies funktioniert, geschieht dies außerdem unter einer einigermaßen restriktiven Vorstellung, was ein Benutzerkonto "menschlich" macht: Wenn ein Benutzer mit useraddoder ohne erstellt wird --system , wird keine Datei in erstellt AccountsService/users.
Eliah Kagan
1

Als Mitglied der /homeGruppe überwache ich ein Netzwerksystem, das LDAP verwendet, und habe Home-Verzeichnisse außerhalb und UIDs (aufgrund eines Skriptfehlers) in Millionenhöhe. Keine der aktuellen Antworten funktioniert daher. Der Test, der für mich funktioniert, überprüft, ob der Benutzer eine gültige Login-Shell hat. Eine gültige Shell ist eine, die in aufgeführt ist /etc/shells. Die einfachste Form:

getent passwd | grep -wFf /etc/shells

Die Datei kann Kommentare (oder leere Zeilen) enthalten, so dass Sie diese möglicherweise herausfiltern müssen:

getent passwd | grep -wFf <(grep '^/' /etc/shells)
muru
quelle
+1 Dies ist möglicherweise der robusteste Ansatz, der bisher vorgeschlagen wurde. Obwohl es den Nachteil hat, dass es angezeigt wird root(was wahrscheinlich nicht als menschlicher Benutzer angesehen werden sollte, da Menschen in der Regel vorübergehend und für bestimmte Zwecke root werden, anstatt es für ihre reguläre Arbeit zu verwenden), scheint es das am wenigsten wahrscheinliche Versagen zu sein irgendein wichtiger Weg. Die Verfahren in anderen Antworten (einschließlich mir) fehlschlagen können, abhängig von der Methode, wenn die Home - Verzeichnisse sind nicht in /homeanderem Müll ist in /home, UIDs sind seltsam, oder das System keine DM verwenden. Diese Antwort funktioniert in all diesen Szenarien ziemlich gut.
Eliah Kagan
1

Auf Buntu-Systemen haben reguläre Benutzer (dh menschliche Benutzer) UIDs, die mit 1000 beginnen und ihnen bei der ersten Erstellung ihrer Konten nacheinander zugewiesen werden. Alles läuft darauf hinaus, dass der erste auf einem buntu-System erstellte Account eine UID von 1000 hat. Der nächste erstellte Account hat eine UID von 1001. Und so weiter und so fort.

Die einfachste Möglichkeit, alle auf dem System vorhandenen Benutzerkonten aufzulisten, besteht meiner Meinung nach darin, zu überprüfen, ob die dritte Spalte in der /etc/passwdDatei, die die Benutzer-UID enthält, größer oder gleich 1000 und kleiner als beispielsweise 2000 ist (Es ist sehr unwahrscheinlich, dass ein typischer Desktop-PC mehr als tausend Benutzerkonten hat, oder?):

$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
Mischa
quelle
Vielen Dank für die Erklärung von Olis Antwort mit Details. Sie müssen auch herausfiltern nobody. =)
anatoly techtonik
1
Das müssen Sie nicht, da niemand eine UID von 65534 hat und daher automatisch wie alle anderen nichtmenschlichen Benutzerkonten herausgefiltert wird.
Mischa