Comment savoir, dans un script Shell, si un nom d'utilisateur donné existe sur le système actuel?
/etc/passwd
et /etc/shadow
sont incomplets. Considérons les services de répertoire de OS X ou Linux avec une intégration similaire à Active Directory.
L’un des outils les plus élémentaires à utiliser 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
getent
Cette commande est conçue pour rassembler 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.
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 0
si l'utilisateur est trouvé (car il n'y a pas d'erreur en sortie), sinon, des nombres plus grands.
chown
Exécutez (comme tout utilisateur, étonnamment):
T=$( mktemp -t foo.XXX ) ; chown <username> $T
Si cela échoue en tant que root
, le nom du compte n'est pas valide.
S'il échoue en tant qu'utilisateur non -root
, analysez la sortie éventuellement localisée pour Opération non autorisée ou utilisateur non valide (ou des équivalents). Réglez LANG
à l'avance pour le faire de manière fiable.
Je dirais que vous voudriez vous appuyer sur /etc/passwd
et similaire (par exemple, /etc/shadow
pour les systèmes basés sur Shadow; sur une note secondaire, certains systèmes similaires pourraient utiliser /etc/master.passwd
ou d’autres fichiers du même type).
Le /etc/passwd
est généralement traité comme une décision faisant autorité absolue pour déterminer si 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 que /etc/passwd
ne le soit pas, je dirais que l'utilisateur n'existe pas correctement sur le système, par définition du standard le plus courant. ce 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 particulier, ce qui peut se produire si vous importez 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.