Scopri se esiste il nome utente


68

Come posso scoprire, in uno script di shell, se un determinato nome utente esiste sul sistema attuale?


/etc/passwde /etc/shadowsono incompleti. Prendi in considerazione i Servizi di directory di OS X o Linux con l'integrazione di Allo stesso modo Active Directory.

Risposte:


103

Uno degli strumenti più basilari da utilizzare per questo è probabilmente id.

#!/bin/bash
if id "$1" >/dev/null 2>&1; then
        echo "user exists"
else
        echo "user does not exist"
fi

Quale produce

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist

2
Non hai bisogno dei backquotes qui - usa solo if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson il

1
@Gordon, ovviamente, certo. Grazie :)
barbaz,

Anche "-u" sembra superfluo
palacsint,

Cosa succede se avessi bisogno solo ifdi un controllo del risultato negativo?
Yura Shinkarev,

id -u $1 1>/dev/null 2>&1; echo $?può essere usato per pipe
JasonWayne

20

getent

Questo comando è progettato per raccogliere voci per i database che possono essere supportati da file / etc e vari servizi remoti come LDAP, AD, NIS / Pagine gialle, DNS e simili.

Per capire se un nome utente è conosciuto da uno dei servizi di denominazione delle password, eseguire semplicemente:

getent passwd username

Funziona anche con gruppi, host e altri, a seconda del sistema operativo e dell'implementazione.


1
Mentre Solaris e Linux, e più recentemente anche la maggior parte dei BSD getent, non ce n'è getentsu Mac OS X
barbaz,

In effetti, mi mancava Mac OS / X mancante getent.
jlliagre,

Tuttavia è abbastanza utile sui sistemi che supporta.
Daniel Beck

1
getent è utile perché è possibile eseguire query su più nomi utente in cui id supporta solo un singolo nome utente.
nall

6

finger

Analizzare l'output di finger -m <username>. Nessun codice di errore se nessun utente è stato trovato, purtroppo, ma se non trovato, verrà scritto l'output dell'errore. Nessun inconveniente finora.

finger -ms <username> 2>&1 1>/dev/null | wc -l

Stampa 0se viene trovato l'utente (perché non viene generato alcun errore), altrimenti numeri più grandi.

chown

Esegui (come qualsiasi utente, sorprendentemente):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

In caso contrario root, il nome dell'account non è valido.

Se fallisce come non rootutente, analizzare l'output eventualmente localizzato per Operazione non consentita o utente non valido (o equivalenti). Impostare in LANGanticipo per farlo in modo affidabile.


0

Direi che vorresti fare affidamento su /etc/passwde simili (ad esempio /etc/shadowper i sistemi basati su Shadow; su una nota laterale fuori tema, alcuni sistemi simili potrebbero utilizzare /etc/master.passwdo altri file simili).

In /etc/passwdgenere viene considerata la decisione autorevole assoluta sull'esistenza o meno di un utente. Se si utilizza uno degli altri metodi descritti in questa pagina e se tali altri metodi puntano a un utente esistente ma /etc/passwdnon lo fanno, direi che l'utente non esiste correttamente sul sistema, per definizione dello standard più comune che il software probabilmente farebbe affidamento.

Detto questo, lancerò in un altro modo per aggiungere al mix di alcune altre opzioni che potrebbero essere utilizzate.

ls -l /home | grep ^customUserName$<BR> echo $?

Chiaramente, sostituire "customuserName" con il nome dell'utente che si desidera verificare. Sostituisci / home con / users se è quello che usa il tuo sistema. Questo potrebbe non trovare tutti gli utenti in / etc / passwd se non è stata creata alcuna home directory per quel particolare utente, il che potrebbe verificarsi se si importano semplicemente utenti (ovvero righe di testo in / etc / passwd) e se le home directory non lo fanno essere fatto a meno che / fino a quando una persona non accede.


Non capisco perché dichiari un utente che non ha alcuna voce nel file / etc / password ma è segnalato per essere valido da uno dei due ido getentnon esiste "correttamente" sul sistema, soprattutto quando l'OP indica chiaramente che i servizi di denominazione sono essere considerato.
jlliagre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.