Averigüe si existe el nombre de usuario

68

¿Cómo puedo averiguar, en un script de shell, si existe un nombre de usuario dado en el sistema actual?


/etc/passwdy /etc/shadowestán incompletos Considere los servicios de directorio de OS X o Linux con la integración de Active Directory de Likewise.

Daniel Beck
fuente

Respuestas:

103

Probablemente, una de las herramientas más básicas que se utilizarán para eso id.

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

Que produce

$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
Barbaz
fuente
2
No necesita las comillas inversas aquí, solo use if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson
1
@ Gordon tiene toda la razón, por supuesto. Gracias :)
barbaz
"-u" también parece innecesario
palacsint
¿Qué pasa si solo lo necesitaba ifcon el verificador de resultados negativos?
Yura Shinkarev
id -u $1 1>/dev/null 2>&1; echo $?se puede usar para tubería
JasonWayne
20

Gerente

Este comando está diseñado para reunir entradas para las bases de datos que pueden ser respaldadas por archivos / etc y varios servicios remotos como LDAP, AD, NIS / Páginas amarillas, DNS y similares.

Para averiguar si uno de los servicios de nombres de contraseña conoce un nombre de usuario, simplemente ejecute:

getent passwd username

Esto funciona también con grupos, hosts y otros, dependiendo del sistema operativo y la implementación.

jlliagre
fuente
1
Mientras Solaris y Linux, y más recientemente también la mayoría de BSD tienen getent, no hay getenten Mac OS X
barbaz
De hecho, me perdí Mac OS / X falta getent.
jlliagre
Sin embargo, es bastante útil en los sistemas que admite.
Daniel Beck
1
getent es bueno porque puedes consultar varios nombres de usuario donde id solo admite un nombre de usuario único.
nall
6

finger

Analiza la salida de finger -m <username>. Sin código de error si no se encontró ningún usuario, desafortunadamente, pero si no se encuentra, se escribirá la salida de error. No hay inconvenientes hasta ahora.

finger -ms <username> 2>&1 1>/dev/null | wc -l

Se imprimirá 0si se encuentra el usuario (porque no hay salida de error), números más grandes de lo contrario.

chown

Ejecutar (como cualquier usuario, sorprendentemente):

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

Si falla como root, el nombre de la cuenta no es válido.

Si falla como no rootusuario, analice la salida posiblemente localizada para Operación no permitida o usuario no válido (o equivalentes). Establezca de LANGantemano para hacer esto de manera confiable.

Daniel Beck
fuente
0

Yo diría que usted querría confiar /etc/passwdy similares (por ejemplo, /etc/shadowpara sistemas basados ​​en Shadow; en una nota al margen del tema, algunos sistemas similares podrían usar /etc/master.passwdu otros archivos similares).

El /etc/passwdse trata típicamente como la decisión de autoridad absoluta de si existe un usuario o no. Si usa cualquiera de los otros métodos descritos en esta página, y si esos otros métodos apuntan a un usuario existente pero /etc/passwdno lo hace, entonces diría que el usuario no existe correctamente en el sistema, por definición del estándar más común que el software probablemente dependería de

Dicho esto, agregaré otra forma de agregar a la mezcla de algunas otras opciones que podrían usarse.

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

Claramente, reemplace "customuserName" con el nombre del usuario que desea verificar. Reemplace / home con / users si eso es lo que usa su sistema. Esto podría no encontrar a todos los usuarios en / etc / passwd si no se creó un directorio de inicio para el usuario en particular, lo que podría ocurrir si simplemente importó usuarios (es decir, líneas de texto a / etc / passwd) y si los directorios de inicio no hacerse a menos que / hasta que una persona inicie sesión.

TOOGAM
fuente
No entiendo por qué declaras un usuario que no tiene una entrada en el archivo / etc / password pero que se informa que es válido ido getentque no existe "correctamente" en el sistema, especialmente cuando el OP indica claramente que los servicios de nombres son para ser considerado.
jlliagre