Quiero crear un script 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 se muestra 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 VERDADERA y dice que el usuario existe?
¿A dónde me estoy yendo mal?
ACTUALIZAR:
Después de leer todas las respuestas, encontré el problema en mi script. El problema era la forma en que estaba redirigiendo la getent
salida. Así que eliminé todas las cosas de redirección e hice que la getent
línea se viera así:
getent passwd $user > /dev/null
Ahora mi script está funcionando bien.
$?
usas obtienes el código de retorno deltest
comando. Ver la respuesta a continuación.getent
y suif
declaración? Eso haría$?
que verifique el estado de salida deecho
, no su llamada agetent
.2>&1
lugar de2&>1
.$1
no se establece, la instrucción if devolverá verdadero. De mis pruebas, la solución sería para envolver$1
entre comillas dobles:getent passwd "$1" > /dev/null 2&>1
.Respuestas:
También puede verificar el usuario por
id
comando.id -u name
te da la identificación de ese usuario. si el usuario no existe, obtiene el valor de retorno del comando ($?
)1
fuente
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Eso, más o menos devuelve 1 si el usuario existe, o 0 si no existe.¿Por qué no simplemente usas
Devolverá 1 (ya que un usuario tiene un máximo de 1 entrada) si el usuario existe y 0 si no existe.
fuente
getent passwd | grep -c '^username:'
:
después del nombre de usuario protegen contra la coincidencia de subcadenas haciendo coincidir con el separador de campo, por lo que el efecto que describas no sucederá.No hay necesidad de verificar el código de salida explícitamente. Tratar
Si eso no funciona, hay algo mal con usted
getent
o tiene más usuarios definidos de lo que cree.fuente
Esto es lo que terminé haciendo en un
Freeswitch
script de inicio bash:fuente
Sugiero usar el comando id, ya que prueba la existencia válida del usuario wrt passwd entrada de archivo que no es necesariamente significa lo mismo:
Nota: 0 es root uid.
fuente
Lo estaba usando de esa manera:
fuente
Con mucho, la solución más simple:
El
>/dev/null 2>&1
puede ser acortado&>/dev/null
en Bash.fuente
Script para verificar si el usuario de Linux existe o no
Script Para verificar si el usuario existe o no
fuente
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Respuesta tardía pero
finger
también muestra más información sobre el usuariofuente
En realidad no puedo reproducir el problema. El script tal como está escrito en la pregunta funciona bien, excepto en el caso de que $ 1 esté vacío.
Sin embargo, hay un problema en el script relacionado con la redirección de
stderr
. Aunque existen las dos formas&>
y>&
existen, en su caso desea utilizarlas>&
. Ya redirigióstdout
, por eso el formulario&>
no funciona. Puede verificarlo fácilmente de esta manera:Verá un archivo nombrado
1
en el directorio actual. Desea usar2>&1
en su lugar, o use esto:Esto también redirige
stdout
ystderr
hacia/dev/null
.Advertencia Redireccionar
stderr
a/dev/null
podría no ser una buena idea. Cuando las cosas van mal, no tendrás idea de por qué.fuente
la información del usuario se almacena en / etc / passwd, por lo que puede usar "grep 'usename' / etc / passwd" para verificar si existe el nombre de usuario. mientras tanto, puede usar el comando de shell "id", imprimirá el id del usuario y el id del grupo, si el usuario no existe, imprimirá el mensaje "no existe ese usuario".
fuente
Inicie sesión en el servidor. grep "nombre de usuario" / etc / passwd Esto mostrará los detalles del usuario si están presentes.
fuente
if grep -q "^username:" /etc/passwd; then ...
Usando sed:
fuente
Dependiendo de su implementación de shell (por ejemplo, Busybox vs. adulto), el
[
operador puede comenzar un proceso, cambiando$?
.Tratar
fuente
$?
me da la misma salida. Esta es la versión bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
se expandiría antes de las[
ejecuciones, por lo que no es un problema.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
A continuación se muestra el script para verificar la distribución del sistema operativo y crear un usuario si no existe y no hacer nada si el usuario existe.
fuente
Crear usuario del sistema
some_user
si no existefuente
Me gusta esta buena solución de una línea
y en script:
utilizar:
fuente