GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erhalten Sie den Benutzernamen von uid

Mit GNU id , können Sie Folgendes tun:

id -un -- "$cheruid"

Dadurch wird die Kontodatenbank abgefragt (ob sie in /etc/passwd gespeichert ist , LDAP, NIS+, ein RDBMS...) für den ersten Benutzernamen mit dieser uid.

Im Allgemeinen gibt es nur einen Benutzernamen pro UID, aber das ist nicht garantiert, der Schlüssel in der Benutzerkontodatenbank ist der Benutzername, nicht die Benutzer-ID.

Wenn Sie alle Benutzernamen für eine bestimmte UID wissen möchten, können Sie Folgendes tun:

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'

Aber das funktioniert möglicherweise nicht für einige Kontodatenbanken, die nicht aufzählbar sind (wie es manchmal bei großen LDAP-basierten der Fall ist).


$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself

(es gibt einen myself Benutzer mit UID 1001 auf meinem System)

Dies würde die passwd abfragen Datenbank für die angegebene UID, entfernen Sie den Benutzernamen aus dieser Antwort und verwenden Sie das Ergebnis als Argument für printf . Dies würde unter macOS nicht funktionieren.

So fangen Sie unbekannte UIDs ab:

$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER

Als Skript mit beliebig vielen UIDs auf der Kommandozeile (mit leicht veränderter Ausgabe):

#!/bin/sh

for uid do
    printf 'User with UID %d is %s\n' "$uid" \
        "$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done

Testen (dies würde die UIDs einiger Dienstkonten auf meinem OpenBSD-System durchlaufen):

$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd

Hilfe zum ursprünglichen Shellscript

Der Test in der if-Anweisung verursacht das Problem. Ich schlage das folgende Shellscript vor,

#!/bin/bash

read -p "donner l UID " cheruid

 if [ "$(grep -w "^$cheruid" /etc/passwd)" != "" ]
 then
    grep -w "$cheruid" /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"
fi

Edit1:Ich habe ein ^ hinzugefügt im Test nur nach Übereinstimmungen am Anfang der Zeile zu suchen.

Edit2:seit : ein Trennzeichen ist, können Sie es und alles danach entfernen und das Ergebnis direkt in echo verwenden Zeile, falls im Test akzeptiert, und vereinfache das Shellscript zu

#!/bin/bash

read -p "donner l UID " cheruid

cheruid=${cheruid%%:*}
user=$(grep -wo "^$cheruid" /etc/passwd)

if [ "$user" != "" ]
then
    echo "user is : $user"
else
    echo "user not found"
fi

Dies hilft Ihnen, ein gutes Bash-Shellscript zu erstellen.

Effiziente und allgemeinere Methode, um Benutzer-IDs mit id zu finden

Wenn Sie auf effiziente Weise überprüfen möchten, ob ein bestimmter Benutzername existiert, <test-name> , können Sie id verwenden , wie in einer anderen Antwort auf Ihre Frage von Stéphane Chazelas angegeben:

id -un -- <test-name>

zum Beispiel

id -un -- mehdi

id findet nicht nur Benutzer-IDs, die in /etc/passwd gespeichert sind aber auch solche, die auf andere Weise verwaltet und gespeichert werden, zum Beispiel LDAP, das in professionellen Serversystemen üblich ist, wie von Matteo Italia kommentiert.

Wenn Sie alle Benutzer scannen möchten

  • Systembenutzer, in vielen Linux-Systemen mit Benutzernummern <1000

  • 'menschliche' Benutzer, in vielen Linux-Systemen mit Benutzerzahlen>=1000

  • und unter der Annahme, dass alle Benutzer die Nummer <2000 haben (bei Bedarf ändern)

Sie können den folgenden bash verwenden Einzeiler, der eine Schleife mit id verwendet ,

for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Wenn Sie nur die „menschlichen“ Benutzer sehen möchten und davon ausgehen, dass keine Benutzer-ID-Nummer übersprungen wird (kein gelöschter Benutzer), verwenden Sie den folgenden bash oneliner ist sehr schnell,

i=1000;while true;do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$name" ;else break;fi;i=$((i+1));done

Es ist jedoch zuverlässiger anzunehmen, dass einige ID-Nummern möglicherweise übersprungen werden (gelöschte Benutzer),

for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Es gibt auch users und who die die Benutzernamen der aktuell eingeloggten Benutzer ausgeben zum aktuellen Host.


Linux
  1. Wie erhalte ich eine Ausgabe von gdb.execute in PythonGDB (GDB 7.1)?

  2. So erhalten Sie einen untergeordneten Prozess aus einem übergeordneten Prozess

  3. Wie bekomme ich PID nach Prozessname?

  4. Wie erhalte ich das Ablaufdatum des Benutzerkennworts aus Active Directory?

  5. Wie bekomme ich Elemente aus der Liste in Bash?

Was ist UID in Linux, wie man es findet und ändert

So erhalten Sie Nachrichten sofort von der Befehlszeile in Linux

So erhalten Sie eine Liste der MySQL-Benutzerkonten unter Linux

Wie generiert man CSR aus BGM?

So finden Sie den Prozessnamen anhand seiner PID

Wie bekomme ich den Domainnamen in Windows mit dem Befehl?