GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere il nome dell'utente da uid

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.


Linux
  1. Come ottengo il nome utente in un Makefile?

  2. Come faccio a leggere sed dall'input standard?

  3. Come ottenere il nome host dall'IP (Linux)?

  4. Come ottenere il PID in base al nome del processo?

  5. Come ottenere la data di scadenza della password dell'utente da Active Directory?

Che cos'è l'UID in Linux, come trovarlo e modificarlo

Come ottenere notizie istantaneamente dalla riga di comando in Linux

Come ottenere l'elenco degli account utente MySQL in Linux

Come generare CSR da WHM?

Come trovare il nome del processo dal suo PID

Come ottenere il nome di dominio in Windows usando il comando?