GNU/Linux >> Znalost Linux >  >> Linux

Jak získat uživatelské jméno z uid

S GNU id , můžete udělat:

id -un -- "$cheruid"

Tím dojde k dotazu na databázi účtu (zda je uložena v /etc/passwd , LDAP, NIS+, RDBMS...) pro první uživatelské jméno s tímto uid.

Obecně platí, že na každé uid existuje pouze jedno uživatelské jméno, ale to není zaručeno, klíčem v databázi uživatelských účtů je uživatelské jméno, nikoli uživatelské id.

Pokud chcete znát všechna uživatelská jména pro dané uid, můžete:

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

To však nemusí fungovat u některých databází účtů, které nejsou vyčíslitelné (jako někdy v případě velkých sítí založených na LDAP).


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

(existuje myself uživatel s UID 1001 v mém systému)

To by se dotazovalo na passwd databáze pro dané UID, odstraňte uživatelské jméno z této odpovědi a použijte výsledek jako argument pro printf . V systému macOS by to nefungovalo.

Chcete-li zachytit neznámá UID:

$ 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

Jako skript s libovolným počtem UID na příkazovém řádku (s mírně pozměněným výstupem):

#!/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

Testování (to by šlo přes UID některých servisních účtů v mém systému OpenBSD):

$ 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

Nápověda k původnímu shellscriptu

Problém způsobuje test v příkazu if. Navrhuji následující shellscript,

#!/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:Přidal jsem ^ v testu hledat shody pouze na začátku řádku.

Edit2:od : je oddělovač, můžete jej odstranit a vše po něm a použít výsledek přímo v echo řádek, pokud bude v testu přijat, a zjednodušte shellscript na

#!/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

To vám pomůže vytvořit dobrý bash shellscript.

Efektivní a obecnější metoda k nalezení ID uživatelů s id

Pokud chcete efektivní způsob, jak zkontrolovat, zda určité uživatelské jméno existuje, <test-name> , můžete použít id , jak je uvedeno v jiné odpovědi na vaši otázku od Stéphana Chazelase:

id -un -- <test-name>

například

id -un -- mehdi

id najde nejen ID uživatelů uložená v /etc/passwd ale také ty spravované a uložené jinými způsoby, například LDAP, který je běžný v profesionálních serverových systémech, jak uvedl Matteo Italia.

Pokud chcete zkontrolovat všechny uživatele

  • uživatelé systému, v mnoha linuxových systémech s čísly uživatelů <1000

  • 'lidští' uživatelé, v mnoha linuxových systémech s uživatelskými čísly>=1000

  • a za předpokladu, že všichni uživatelé mají číslo <2000 (v případě potřeby změňte)

můžete použít následující bash one-liner, který používá smyčku s id ,

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

Pokud chcete vidět pouze „lidské“ uživatele a předpokládáte, že není přeskočeno žádné ID uživatele (žádný smazaný uživatel), následující bash oneliner je velmi rychlý,

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

ale je spolehlivější předpokládat, že některá ID čísla mohou být přeskočena (smazaní uživatelé),

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

Existuje také users a who které tisknou uživatelská jména uživatelů aktuálně přihlášených aktuálnímu hostiteli.


Linux
  1. Jak získat výstup z gdb.execute v PythonGDB (GDB 7.1)?

  2. Jak získat podřízený proces z rodičovského procesu

  3. Jak získat název hostitele z IP (Linux)?

  1. jak získat prvky ze seznamu v bash?

  2. Jak zruším nastavení nebo se zbavím funkce bash?

  3. Jak získat masku sítě z bash?

  1. Jak přidat nebo odebrat uživatele ze skupiny v Linuxu

  2. Jak získám svou IP adresu z příkazového řádku?

  3. Jak mohu získat binární soubor ze souboru .py