tutorial traduccion script comandos bash

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