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.

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

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.


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.