Con GNU id
, puoi eseguire:
id -un -- "$cheruid"
Ciò interrogherà il database dell'account (se è memorizzato in /etc/passwd
, LDAP, NIS+, un RDBMS...) per il primo nome utente con quell'uid.
In genere, c'è un solo nome utente per uid, ma non è garantito, la chiave nel database degli account utente è il nome utente, non l'ID utente.
Se vuoi conoscere tutti i nomi utente per un dato uid, puoi fare:
getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'
Ma questo potrebbe non funzionare per alcuni database di account che non sono enumerabili (come a volte accade per quelli grandi basati su LDAP).
$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself
(c'è un myself
utente con UID 1001 sul mio sistema)
Questo interrogherebbe il passwd
database per l'UID dato, rimuovi il nome utente da quella risposta e usa il risultato come argomento per printf
. Questo non funzionerebbe su macOS.
Per catturare UID sconosciuti:
$ 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
Come uno script che accetta un numero qualsiasi di UID sulla riga di comando (con output leggermente modificato):
#!/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
Test (questo passerebbe attraverso gli UID di alcuni account di servizio sul mio sistema 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
Aiuto con lo shellscript originale
Il test nell'istruzione if sta causando il problema. Suggerisco il seguente 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:ho aggiunto un ^
nel test per cercare solo le corrispondenze all'inizio della riga.
Edit2:dal :
è un separatore, puoi rimuoverlo e tutto ciò che segue e utilizzare il risultato direttamente nel echo
line, se accettata nel test, e semplifica lo shellscript in
#!/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
Questo ti aiuta a creare un buon shellscript bash.
Metodo efficiente e più generale per trovare ID utente con id
Se vuoi un modo efficiente per controllare se esiste un particolare nome utente, <test-name>
, puoi utilizzare id
, come indicato in un'altra risposta alla tua domanda di Stéphane Chazelas:
id -un -- <test-name>
ad esempio
id -un -- mehdi
id
troverà non solo gli ID utente memorizzati in /etc/passwd
ma anche quelli gestiti e archiviati in altri modi, ad esempio LDAP, comune nei sistemi server professionali come commentato da Matteo Italia.
Se desideri eseguire la scansione di tutti gli utenti
-
utenti di sistema, in molti sistemi Linux con numeri utente <1000
-
utenti "umani", in molti sistemi Linux con numero di utenti>=1000
-
e supponendo che tutti gli utenti abbiano un numero <2000 (modifica se necessario)
puoi usare il seguente bash
one-liner, che utilizza un loop con id
,
for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done
Se vuoi vedere solo gli utenti "umani" e supponi che nessun numero ID utente venga ignorato (nessun utente eliminato), il seguente bash
oneliner è molto veloce,
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
ma è più attendibile presumere che alcuni numeri ID possano essere saltati (utenti cancellati),
for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done
Ci sono anche users
e who
che stampano i nomi utente degli utenti attualmente connessi all'host corrente.