Wie kann ich alle von mir erstellten Benutzer auflisten? Ich habe es versucht cat /etc/passwd
und es listet nur eine Menge Sachen auf.
Wie kann ich alle von mir erstellten Benutzer auflisten? Ich habe es versucht cat /etc/passwd
und es listet nur eine Menge Sachen auf.
Antworten:
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, nobody
schlägt dies fehl - es ist jedoch erforderlich, das Ergebnis auf vierstellige UIDs zu beschränken, um nicht zu fangen (UID 65534).
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 nobody
User auch herausgefiltert.
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 /home
Basisverzeichnisse. 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.
/home
externes 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+found
auf Systemen mit separaten /home
Partitionen aufgeführt wird.
useradd --no-create-home username
?
useradd --no-create-home
Basisverzeichnis könnte bereits vorhanden sein oder kurz danach erstellt werden -, aber die ls /home
Methode funktioniert in diesen Fällen einwandfrei .
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 ubuntu
Benutzer (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 /home
ist das, was die Leute tatsächlich tun, und wenn Sie kein Skript schreiben, sollten Sie das wahrscheinlich nur verwenden.
ls /home
robusterAber 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 /home
zu getent
(zum Abrufen der passwd
Einträge der Nutzer mit diesen Namen), dann Isolat und Anzeige nur den Benutzernamen Feld (mit grep
, sed
oder 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 ls
nicht 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 -a
normalerweise nur geringfügig weniger schlecht. In dieser Situation sind beide Zeichen jedoch in Ordnung , da die Anzahl der in Benutzernamen vorkommenden Zeichen begrenzt ist .
Ich benutze es getent
hauptsächlich, weil es Benutzernamen als Argumente akzeptiert, um seine Ausgabe einzuschränken, aber auch, weil es etwas universeller ist als /etc/passwd
direkt zu untersuchen , falls Authentifizierungsmöglichkeiten und die Passwortdatenbank von Netzwerkdiensten bereitgestellt werden.
Diese Methode hat den zusätzlichen Vorteil, ls /home
dass sie auf Systemen mit einer separaten /home
Partition lost+found
normalerweise in der Ausgabe von angezeigt wird ls /home
.
lost+found
wird nur angezeigt, wenn zufällig ein Benutzer (menschlich oder nicht) angerufen wird lost+found
, was unwahrscheinlich ist.ls /home
ist 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:
/home
oder 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
./home
dem 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. getent
Aufrufen implementiert werden , sodass die Wortteilung keine falschen Ausgaben erzeugt. Die Komplexität ist jedoch nicht gewährleistet. Grundsätzlich /home
gilt diese Methode , wenn Sie sie nicht als Speicherort für die privaten Verzeichnisse der Benutzer verwenden keine zuverlässige Ausgabe erzeugen.)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 :
^
), die kein :
s ( [^:]+
) enthält - dies ist das erste Feld, ebenso :
wie das Feldtrennzeichen inpasswd
(?=
)
) das Passwortfeld x
- es sollte immer so sein x
, da in Ubuntu Passwort-Hashes in der shadow
Datenbank gespeichert werden, nicht in der weltlesbaren passwd
Datenbank:\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, grep
die nicht unterstützt werden -P
.)
Wenn Sie sehr hohe UIDs berücksichtigen und nobody
explizit 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 nobody
davon - 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}'
basename
ist 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 *
.
ls
normalerweise 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
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}'
mini.iso
und ohne Display Manager oder X11) ein Benutzerkonto - /var/lib/AccountsService/users
ist 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 useradd
oder ohne erstellt wird --system
, wird keine Datei in erstellt AccountsService/users
.
Als Mitglied der /home
Gruppe ü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)
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 /home
anderem Müll ist in /home
, UIDs sind seltsam, oder das System keine DM verwenden. Diese Antwort funktioniert in all diesen Szenarien ziemlich gut.
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/passwd
Datei, 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
nobody
. =)