Benutzerfreundlicher Befehl, um alle Benutzer auf Ubuntu-System aufzulisten?

22

Gibt es einen benutzerfreundlichen Befehl, mit dem ich Benutzer in einer Konsole auf einem Ubuntu-System auflisten kann?

Bei mir cat /etc/passwdbekomme ich eine schwer lesbare Benutzerliste. Es wäre schön, eine alphabetische Liste mit Einträgen in Spalten und Gruppennamen in Klammern neben den Gruppen-IDs zu sehen.

M. Dudley
quelle
2
Nun, / etc / passwd ist in Spalten angeordnet ... wenn Sie nur ein paar Spalten sehen möchten, verwenden Sie vielleicht cut. Für alphabetisch gibt es sort. Wenn Sie die Gruppennamen benötigen, spielen Sie mit Join (der möglicherweise nur eine Teilmenge der Spalten anzeigt, übrigens).
njsg

Antworten:

27

Guter Weg für eine gute Ausgabe der Datei / etc / passwd:

$ column -nts: /etc/passwd

Jetzt können Sie es sortieren:

$ column -nts: /etc/passwd | sort

Mit Gruppennamen in der letzten Spalte (ohne Klammer):

$ paste -d: /etc/passwd <(groups $(cut -d: -f1 /etc/passwd) | sed 's/.*: //') | column -nts: | sort
Nykakin
quelle
Danke, diese Befehle machen was ich will. Für einen Neuling ist das allerdings sehr entmutigend ... Ich denke, ich muss lernen, wie man einen Alias ​​für sie erstellt.
M. Dudley
Auf Centos Spalte hat die nOption nicht gefallen . column -ts: /etc/passwdhat gut funktioniert.
user1014251
9

Wenn Sie über Root-Zugriff auf dem Computer verfügen, können Sie folgende Aktionen ausführen:

sudo grep -vE '^[^*!]+:[*!]:' /etc/shadow | sort | cut -d: -f1 | while read user; do id $user; done | column -ts' ,' | vi '+set nowrap' -

Wie es funktioniert

Melden Sie sich als Root an, um die Schattendatei zu lesen. Sie benötigen nur Root-Rechte, wenn Sie überprüfen möchten, ob für den Benutzer ein Kennwort festgelegt wurde (menschlicher Benutzer), andernfalls können Sie nur cat /etc/passwdanstelle von sudo grep ...:

sudo 

Nur Benutzer anzeigen, für die ein Passwort festgelegt wurde:

grep -vE '^[^*!]+:[*!]:' /etc/shadow

Nach Benutzername sortieren:

sort 

Verwerfen Sie alle Informationen mit Ausnahme des Benutzernamens:

cut -d: -f1

Durchlaufen Sie die Benutzernamen und bereichern Sie sie mit Gruppeninformationen:

while read user; do id $user; done

Formatieren Sie die Eingabe in Spalten:

column -ts' ,'

Verwenden Sie vi, um das Ergebnis anzuzeigen:

vi '+set nowrap' - 

Wenn Sie keinen Root-Zugriff haben,

versuche so etwas:

cut -d: -f1 /etc/passwd | sort | while read user; do id $user; done | sed 's/\(\()\|^\)[^(]*(\|)\)/ /g' | column -t

Die Ausgabe ist etwas anders, aber ich überlasse es dem Leser als Übung, die beiden Teile in dieser Antwort zu etwas zu kombinieren, das voll und ganz in den Job passt. (Liebst du nicht einfach sed?)

jippie
quelle
"Ich überlasse es dem Leser als Übung ..." :)
Emanuel Berg
1

In Ubuntu kann es wie folgt sein:

Sieben Felder aus / etc / passwd, die in $ f1, f2 ..., $ f7 gespeichert sind

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
 echo "User $f1 use $f7 shell and stores files in $f6 directory."
done < /etc/passwd
Fatima Zohra
quelle
1

Etwas, das ich tue und das für meine Zwecke funktioniert, ist

ls /home

Zugegeben, das gibt Ihnen nicht wirklich eine Liste der Benutzer, sondern eine Liste der Home-Verzeichnisse des Benutzers und der Verzeichnisse früherer Benutzer, aber jeder Befehl, den Sie für einen Benutzer ausführen möchten, der kein Terminal hat, sagt es Ihnen und könnte ein Hinweis zum Entfernen sein die Home-Datei, die keinen Benutzer hat oder sie verschiebt!

Sam Hamblin
quelle
Ich mag das. Es wird die Arbeit auf einer grundlegenden Ebene erledigt.
Aalaap
0

Ich dachte, dass dies einfach wäre join, aber joinerfordert , dass die Dateien im Verknüpfungsfeld sortiert werden . Daher war eine Problemumgehung mit temporären Dateien erforderlich (?). Die Ausgabe ist nach Benutzer sortiert und zeigt Benutzer, Gruppe und Gruppen-ID an.

uag () {
  TEMP_GROUPS=/var/tmp/sorted_groups
  TEMP_USERS=/var/tmp/sorted_users
  cat /etc/group  | tr ":" " " | sort -k 3 -o $TEMP_GROUPS
  cat /etc/passwd | tr ":" " " | sort -k 4 -o $TEMP_USERS
  join -1 4 -2 3 -o 1.1,2.1,2.3 $TEMP_USERS $TEMP_GROUPS | sort
  rm $TEMP_GROUPS $TEMP_USERS
}

Übersetzen Sie ein Zeichen in ein anderes mit tr; sortentsprechend einem Schlüsselfeld mit -k, Ausgabe in Datei mit -o; Join in Bezug auf Felder in der ersten ( -1) und zweiten ( -2) Datei, Ausgabe bestimmter Felder in der ersten Datei ( -o 1.1) sowie der zweiten ( ,2.1,2.3).

Emanuel Berg
quelle
Beachten Sie, dass /tmpdies besser wäre, da FHS angibt, dass /var/tmpbei einem Neustart keine Daten gelöscht werden, die wir nicht wirklich benötigen.
Strugee