Viele Systeme haben einen getentBefehl 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 ~uservon abrufen. In den usermeisten 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) ~$userfunktionieren 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 -uGibt die Liste der Benutzer in Datenbanken zurück, die aufgelistet werden können.
zsh: Das $userdirsassoziative Array ordnet Benutzernamen ihrem Ausgangsverzeichnis zu (auch beschränkt auf Datenbanken, die aufgelistet werden können. Wenn Sie jedoch eine ~userErweiterung 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 zshes interaktiv ist .
tcsh, fishund yashsind 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.