Je souhaite créer un script pour vérifier si un utilisateur existe. J'utilise la logique ci-dessous:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Donc, si l'utilisateur existe, alors nous avons du succès, sinon l'utilisateur n'existe pas. J'ai mis la commande ci-dessus dans le script bash comme ci-dessous:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Maintenant, mon script dit toujours que l'utilisateur existe quoi qu'il arrive:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Pourquoi la condition ci-dessus évalue-t-elle toujours VRAI et indique-t-elle que l'utilisateur existe?
Où vais-je mal?
METTRE À JOUR:
Après avoir lu toutes les réponses, j'ai trouvé le problème dans mon script. Le problème était la façon dont je redirigeais la getent
sortie. J'ai donc supprimé tous les éléments de redirection et j'ai fait getent
ressembler la ligne à ceci:
getent passwd $user > /dev/null
Maintenant, mon script fonctionne correctement.
$?
vous obtenez le code retour de latest
commande. Voir la réponse ci-dessous.getent
et votreif
instruction? Cela entraînerait la$?
vérification de l'état de sortie deecho
, pas de votre appel àgetent
.2>&1
au lieu de2&>1
.$1
n'est pas défini, l'instruction if retournera true. De mes tests, la solution serait d'envelopper$1
dans des guillemets doubles:getent passwd "$1" > /dev/null 2&>1
.Réponses:
vous pouvez également vérifier l'utilisateur par
id
commande.id -u name
vous donne l'identifiant de cet utilisateur. si l'utilisateur n'existe pas, vous avez la valeur de retour de la commande ($?
)1
la source
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Cela renvoie à peu près 1 si l'utilisateur existe, ou 0 s'il n'existe pas.Pourquoi n'utilisez-vous pas simplement
Il renverra 1 (car un utilisateur a au maximum 1 entrée) si l'utilisateur existe et 0 dans le cas contraire.
la source
getent passwd | grep -c '^username:'
:
après le nom d'utilisateur protège contre la correspondance de sous-chaîne en faisant correspondre le séparateur de champ, de sorte que l'effet que vous décrivez ne se produira pas.Il n'est pas nécessaire de vérifier explicitement le code de sortie. Essayer
Si cela ne fonctionne pas, il y a un problème avec votre
getent
, ou vous avez défini plus d'utilisateurs que vous ne le pensez.la source
C'est ce que j'ai fini par faire dans un
Freeswitch
script de démarrage bash:la source
Je suggère d'utiliser la commande id car elle teste l'existence d' un utilisateur valide avec l'entrée de fichier passwd qui n'est pas nécessaire signifie la même chose:
Remarque: 0 est l'uid racine.
la source
Je l'utilisais de cette façon:
la source
De loin la solution la plus simple:
Le
>/dev/null 2>&1
peut être raccourci en&>/dev/null
dans Bash.la source
Script pour vérifier si l'utilisateur Linux existe ou non
Script Pour vérifier si l'utilisateur existe ou non
la source
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Réponse tardive mais
finger
affiche également plus d'informations sur l'utilisateurla source
En fait, je ne peux pas reproduire le problème. Le script tel qu'écrit dans la question fonctionne correctement, sauf dans le cas où $ 1 est vide.
Cependant, il existe un problème dans le script lié à la redirection de
stderr
. Bien que les deux formes&>
et>&
existent, dans votre cas, vous souhaitez utiliser>&
. Vous avez déjà redirigéstdout
, c'est pourquoi le formulaire&>
ne fonctionne pas. Vous pouvez facilement le vérifier de cette façon:Vous verrez un fichier nommé
1
dans le répertoire courant. Vous souhaitez utiliser à la2>&1
place, ou utilisez ceci:Cela redirige également
stdout
etstderr
vers/dev/null
.Avertissement La redirection
stderr
vers/dev/null
n'est peut-être pas une si bonne idée. Lorsque les choses tournent mal, vous ne saurez pas pourquoi.la source
les informations sur l'utilisateur sont stockées dans / etc / passwd, vous pouvez donc utiliser "grep 'usename' / etc / passwd" pour vérifier si le nom d'utilisateur existe. en attendant, vous pouvez utiliser la commande shell "id", elle affichera l'identifiant de l'utilisateur et l'identifiant du groupe, si l'utilisateur n'existe pas, elle affichera le message "aucun utilisateur de ce type".
la source
Connectez-vous au serveur. grep "username" / etc / passwd Ceci affichera les détails de l'utilisateur s'il est présent.
la source
if grep -q "^username:" /etc/passwd; then ...
Utilisation de sed:
la source
En fonction de votre implémentation shell (par exemple Busybox vs adulte), l'
[
opérateur peut démarrer un processus, en changeant$?
.Essayer
la source
$?
me donne le même résultat. Ceci est la version bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
serait développé avant l'[
exécution, ce n'est donc pas un problème.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Vous trouverez ci-dessous le script pour vérifier la distribution du système d'exploitation et créer un utilisateur s'il n'existe pas et ne rien faire si l'utilisateur existe.
la source
Créer un utilisateur système
some_user
s'il n'existe pasla source
J'aime cette belle solution en une ligne
et en script:
utilisation:
la source