79 votes

Vérifier si le nom d'utilisateur existe

Comment puis-je savoir, dans un Shell Shell, si un nom d'utilisateur donné existe sur le système actuel ?


/etc/passwd y /etc/shadow sont incomplètes. Pensez aux services d'annuaire d'OS X, ou à Linux avec une intégration similaire à Active Directory.

118voto

barbaz Points 2896

L'un des outils les plus fondamentaux à utiliser pour cela est probablement id .

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

Ce qui produit

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

2 votes

Vous n'avez pas besoin des guillemets ici - utilisez simplement if id -u "$1" >/dev/null 2>&1; then ...

1 votes

@Gordon a tout à fait raison bien sûr. Merci :)

1 votes

"-u" semble également inutile

27voto

jlliagre Points 13539

getent

Cette commande est conçue pour rassembler les entrées des bases de données qui peuvent être sauvegardées par les fichiers /etc et divers services distants comme LDAP, AD, NIS/Yellow Pages, DNS et autres.

Pour savoir si un nom d'utilisateur est connu par l'un des services de désignation des mots de passe, il suffit d'exécuter :

getent passwd username

Cela fonctionne également avec les groupes, les hôtes et autres, selon le système d'exploitation et l'implémentation.

1 votes

Alors que Solaris et Linux, et plus récemment la plupart des BSD, ont getent , il n'y a pas de getent sur Mac OS X

0 votes

En effet, j'ai raté Mac OS/X qui manque de getent.

1 votes

Néanmoins, il est très utile sur les systèmes qu'il prend en charge.

7voto

Daniel Beck Points 105590

finger

Analyser la sortie de finger -m <username> . Pas de code d'erreur si aucun utilisateur n'a été trouvé, malheureusement, mais s'il n'est pas trouvé, une 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 de sortie d'erreur), de plus grands nombres sinon.

chown

Exécuter (comme n'importe quel utilisateur, étonnamment) :

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

S'il échoue comme root le nom du compte n'est pas valide.

S'il échoue comme non root utilisateur, analyser la sortie éventuellement localisée pour Opération non autorisée ou utilisateur non valide (ou équivalents). Définir LANG au préalable pour le faire de manière fiable.

1voto

frooyo Points 658

Je dirais que vous voulez vous appuyer sur /etc/passwd et similaires (par exemple /etc/shadow pour les systèmes basés sur l'ombre ; en marge du sujet, certains systèmes similaires pourraient utiliser /etc/master.passwd ou d'autres fichiers de ce type).

El /etc/passwd est généralement considéré comme la décision faisant autorité 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 autres méthodes indiquent un utilisateur existant mais que /etc/passwd ne le fait pas, alors je dirais que l'utilisateur n'existe pas correctement sur le système, par définition de la norme la plus courante sur laquelle les logiciels sont susceptibles de s'appuyer.

Cela dit, je vais ajouter une autre façon de faire pour compléter les autres options qui pourraient être utilisées.

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

En clair, remplacez "customuserName" par le nom de l'utilisateur que vous voulez 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 l'utilisateur particulier, ce qui pourrait se produire si vous avez simplement importé des utilisateurs (c'est-à-dire des lignes de texte dans /etc/passwd) et si les répertoires de base ne sont pas créés tant qu'une personne ne se connecte pas.

0 votes

Je ne comprends pas pourquoi vous déclarez un utilisateur qui n'a pas d'entrée dans le fichier /etc/password mais qui est déclaré valide par l'un ou l'autre des systèmes suivants id o getent n'existe pas "correctement" sur le système, en particulier lorsque le PO indique clairement que les services de dénomination doivent être pris en considération.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X