traduccion - bash ubuntu
Verifique si existe un usuario (10)
Última respuesta, pero el finger
también muestra más información sobre el usuario
sudo apt-get finger
finger "$username"
Quiero crear una secuencia de comandos para verificar si existe un usuario. Estoy usando la lógica a continuación:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Entonces, si el usuario existe, entonces tenemos éxito, de lo contrario, el usuario no existe. He puesto el comando anterior en el script bash como a continuación:
#!/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
Ahora, mi script siempre dice que el usuario existe sin importar qué:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
¿Por qué la condición anterior siempre se evalúa como VERDADERO y dice que el usuario existe?
¿Dónde estoy equivocado?
ACTUALIZAR:
Después de leer todas las respuestas, encontré el problema en mi script. El problema era la forma en que estaba redireccionando la salida getent
. Así que getent
todo el material de redirección e hice que la línea getent
se viera así:
getent passwd $user > /dev/null
Ahora mi script está funcionando bien.
¿Por qué no simplemente usas
grep -c ''^username:'' /etc/passwd
Devolverá 1 (ya que un usuario tiene una entrada máxima de 1) si el usuario existe y 0 si no lo hace.
Dependiendo de la implementación de su caparazón (por ejemplo, Busybox vs. grown-up) el [
operador podría iniciar un proceso, cambiando $?
.
Tratar
getent passwd $1 > /dev/null 2&>1
RES=$?
if [ $RES -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
En realidad, no puedo reproducir el problema. El guión tal como está escrito en la pregunta funciona bien, excepto en el caso en que $ 1 está vacío.
Sin embargo, hay un problema en el script relacionado con la redirección de stderr
. Aunque las dos formas &>
y >&
existen, en tu caso quieres usar >&
. Ya redirigió stdout
, es por eso que el formulario &>
no funciona. Puedes verificarlo fácilmente de esta manera:
getent /etc/passwd username >/dev/null 2&>1
ls
Verá un archivo llamado 1
en el directorio actual. Desea usar 2>&1
lugar, o use esto:
getent /etc/passwd username &>/dev/null
Esto también redirige stdout
y stderr
a /dev/null
.
Advertencia Redirigir stderr
a /dev/null
podría no ser una buena idea. Cuando las cosas van mal, no tendrás idea de por qué.
Esto es lo que terminé haciendo en un Freeswitch
inicio Freeswitch
bash:
# Check if user exists
if ! id -u $FS_USER > /dev/null 2>&1; then
echo "The user does not exist; execute below commands to crate and try again:"
echo " root@sh1:~# adduser --home /usr/local/freeswitch/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $FS_USER"
echo " ..."
echo " root@sh1:~# chown freeswitch:daemon /usr/local/freeswitch/ -R"
exit 1
fi
Inicia sesión en el servidor. grep "username" / etc / passwd Esto mostrará los detalles del usuario si están presentes.
Lo estaba usando de esa manera:
if [ $(getent passwd $user) ] ; then
echo user $user exists
else
echo user $user doesn/'t exists
fi
No es necesario verificar el código de salida explícitamente. Tratar
if getent passwd $1 > /dev/null 2>&1; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Si eso no funciona, su getent
tiene algún getent
, o tiene más usuarios definidos de lo que cree.
Sugiero usar el comando id, ya que prueba la existencia de un usuario válido . La entrada del archivo passwd, que no es necesaria, significa lo mismo:
if [ `id -u $USER_TO_CHECK 2>/dev/null || echo -1` -ge 0 ]; then
echo FOUND
fi
Nota: 0 es el uid de la raíz.
también puedes verificar el usuario por el comando id
.
id -u name
te da la identificación de ese usuario. si el usuario no existe, tiene el valor de retorno del comando ( $?
) 1