Savoir si le nom d'utilisateur existe

68

Comment savoir, dans un script shell, si un nom d'utilisateur donné existe sur le système actuel?


/etc/passwdet /etc/shadowsont incomplets. Considérons les services de répertoire de OS X ou Linux avec une intégration similaire à Active Directory.

Daniel Beck
la source

Réponses:

103

L’un des outils les plus élémentaires à utiliser à cet effet est probablement id.

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

Qui produit

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
Barbaz
la source
2
Vous n'avez pas besoin des citations arrières - utilisez simplement if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson, le
1
@ Gordon absolument raison bien sûr. Merci :)
barbaz
"-u" semble également inutile
palacsint
Qu'en est-il si j'avais besoin uniquement ifd'un vérificateur de résultat négatif?
Yura Shinkarev
id -u $1 1>/dev/null 2>&1; echo $?peut être utilisé pour pipe
JasonWayne
20

getent

Cette commande est conçue pour regrouper les entrées des bases de données pouvant être sauvegardées par des fichiers / etc et divers services distants tels que LDAP, AD, NIS / Pages jaunes, DNS et autres.

Pour déterminer si un nom d'utilisateur est connu par l'un des services de nommage des mots de passe, exécutez simplement:

getent passwd username

Cela fonctionne également avec le groupe, les hôtes et autres, en fonction du système d'exploitation et de la mise en œuvre.

jlliagre
la source
1
Alors que Solaris et Linux, et plus récemment, la plupart des BSD l’ont été getent, il n’en existe pas getentsur Mac OS X
Barbaz
En effet, Mac OS / X me manque, il manque un getent.
Juillet
Néanmoins, il est très utile sur les systèmes qu’il supporte.
Daniel Beck
1
getent est agréable parce que vous pouvez interroger plusieurs noms d'utilisateurs, où id ne prend en charge qu'un seul nom d'utilisateur.
nall
6

finger

Analyser la sortie de finger -m <username>. Aucun code d'erreur si aucun utilisateur n'a été trouvé, malheureusement, mais si ce n'est pas le cas, la sortie d'erreur sera écrite. Aucun inconvénient jusqu'à présent.

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

Imprimera 0si l'utilisateur est trouvé (car il n'y a pas d'erreur), sinon, des nombres plus grands.

chown

Exécutez (comme tout utilisateur, étonnamment):

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

Si cela échoue root, le nom du compte est invalide.

S'il échoue en tant que non- rootutilisateur, analysez la sortie éventuellement localisée pour une opération non autorisée ou non valide (ou des équivalents). Réglez LANGau préalable pour le faire de manière fiable.

Daniel Beck
la source
0

Je dirais que vous voudriez vous appuyer sur des éléments /etc/passwdsimilaires (par exemple, /etc/shadowpour les systèmes basés sur Shadow; sur une note secondaire hors sujet, certains systèmes similaires pourraient utiliser /etc/master.passwdou autres fichiers similaires).

Le /etc/passwdest généralement traité comme la décision absolue absolue selon laquelle un utilisateur existe ou non. Si vous utilisez l'une des autres méthodes décrites sur cette page et si ces méthodes renvoient à un utilisateur existant mais /etc/passwdne le font pas, je dirais alors que l'utilisateur n'existe pas correctement sur le système, par définition du standard le plus courant le logiciel compterait probablement sur.

Cela dit, je vais ajouter un autre moyen d’ajouter à la combinaison d’autres options qui pourraient être utilisées.

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

Clairement, remplacez "customuserName" par le nom de l'utilisateur que vous souhaitez vérifier. Remplacez / home par / users si c'est ce que votre système utilise. Cela pourrait ne pas trouver tous les utilisateurs dans / etc / passwd si aucun répertoire de base n'a été créé pour cet utilisateur, ce qui pourrait se produire si vous importiez simplement des utilisateurs (c'est-à-dire des lignes de texte dans / etc / passwd) et si les répertoires de base ne le sont pas. se faire à moins que / jusqu'à ce qu'une personne se connecte.

TOOGAM
la source
Je ne comprends pas pourquoi vous indiquez un utilisateur qui n'a aucune entrée dans le fichier / etc / password mais qui est censé être valide idou qui getentn'existe pas "correctement" sur le système, en particulier lorsque l'OP indique clairement que les services de nommage sont à prendre en considération.
jlliagre