Viele Systeme haben einen getent
Befehl zur Liste oder fragen Sie den Inhalt der Name Service - Datenbanken wie passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Würden Liste der Home - Verzeichnisse (die 6 th Kolon begrenzt Feld) alle Benutzer in Datenbanken, wird aufgezählt .
Der Benutzername selbst befindet sich im ersten Feld, also für die Liste der Benutzernamen:
getent passwd | cut -d: -f1
(Beachten Sie, dass diese Benutzer sich nicht beim System anmelden können oder dass ihr Basisverzeichnis erstellt wurde. Sie sind dem System jedoch bekannt und können in eine Benutzer-ID übersetzt werden.)
Bei Datenbanken, die nicht aufgelistet werden können, können Sie versuchen, jede mögliche Benutzer-ID einzeln abzufragen:
getent passwd {0..65535} | cut -d: -f1,6
(hier unter der Annahme, dass uids bei 65535 enden (einige Systeme unterstützen mehr) und eine Shell, die zshs {x..y}
Form der Klammererweiterung unterstützt ). Auf Systemen, auf denen die Benutzerdatenbank vernetzt ist (und es nur begrenztes lokales Caching gibt), wie z. B. LDAP, NIS +, SQL ..., sollten Sie dies jedoch nicht häufig tun, da dies viel Netzwerkverkehr bedeuten und den Verzeichnisserver belasten kann ), um all diese Fragen zu stellen.
Das bedeutet auch, dass Sie nur einen Eintrag für jede Benutzer-ID erhalten, wenn mehrere Benutzer dieselbe Benutzer-ID verwenden. Verpassen Sie also die anderen.
Wenn Sie nicht haben getent
, können Sie auf Folgendes zurückgreifen perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
für getent passwd
( $e[0]
für die Benutzernamen) oder:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
für getent passwd {0..65535}
mit den gleichen einschränkungen.
In Shells können Sie das Basisverzeichnis ~user
von abrufen. In den user
meisten Shells funktioniert dies jedoch nur für einen begrenzten Satz von Benutzernamen (die Liste der zulässigen Zeichen in Benutzernamen, die für diesen ~
Erweiterungsoperator unterstützt werden, variiert von Shell zu Shell) und mit Mehrere Shells (einschließlich bash
) ~$user
funktionieren nicht (Sie müssten darauf zurückgreifeneval
wenn der Name des Benutzers in einer Variablen dort gespeichert ist). Und Sie müssen noch einen Weg finden, um die Liste der Benutzernamen zu erhalten.
Einige Shells unterstützen diese Liste von Benutzernamen.
bash
: compgen -u
Gibt die Liste der Benutzer in Datenbanken zurück, die aufgelistet werden können.
zsh
: Das $userdirs
assoziative Array ordnet Benutzernamen ihrem Ausgangsverzeichnis zu (auch beschränkt auf Datenbanken, die aufgelistet werden können. Wenn Sie jedoch eine ~user
Erweiterung für einen Benutzer vornehmen, der sich in einer nicht aufzählbaren Datenbank befindet, wird ein Eintrag hinzugefügt $userdirs
). Sie können also Folgendes tun:
printf '%s => %s\n' "${(kv@)userdirs}"
um Benutzer mit ihrem Home-Verzeichnis aufzulisten.
Das funktioniert aber nur, wenn zsh
es interaktiv ist .
tcsh
, fish
und yash
sind drei weitere Shells, die Benutzernamen vervollständigen können (zum Beispiel beim Vervollständigen von ~<Tab>
Argumenten), aber es sieht nicht so aus, als würden Sie diese Liste von Benutzernamen programmgesteuert erhalten.