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.