2009-05-07 10 views

Respuesta

40

No especifica un lenguaje de programación, así que supongo que desea utilizar el shell; aquí está una respuesta para las conchas de Posix.

Dos pasos para esto: obtenga el registro apropiado, luego obtenga el campo que desea de ese registro.

En primer lugar, para obtener el registro de la cuenta se realiza por consultar la tabla passwd:

$ user_name=foo 
$ user_record="$(getent passwd $user_name)" 
$ echo "$user_record" 
foo:x:1023:1025:Fred Nurk,,,:/home/foo:/bin/bash 

Para las pasas histéricos, el nombre completo del usuario se registra en un campo llamado el “GECOS” field; para complicar las cosas, este campo a menudo tiene su propia estructura con el nombre completo como uno de varios subcampos opcionales. Entonces, cualquier cosa que quiera obtener el nombre completo del registro de la cuenta necesita analizar ambos niveles.

$ user_record="$(getent passwd $user_name)" 
$ user_gecos_field="$(echo "$user_record" | cut -d ':' -f 5)" 
$ user_full_name="$(echo "$user_gecos_field" | cut -d ',' -f 1)" 
$ echo "$user_full_name" 
Fred Nurk 

Su lenguaje de programación probablemente tiene una función de biblioteca hacer esto en menos pasos. En C, usaría la función 'getpwnam' y luego analizaría el campo GECOS.

+3

pasas histéricas? – dat

+1

@dat, ver http://catb.org/jargon/html/H/hysterical-reasons.html – bignose

+2

No funcionó para mí. Pero esto lo hizo: 'getent passwd | grep "$ USER" | cut -d ":" -f5 | cut -d "," -f1' –

20

En un sistema moderno de glibc, utilice este comando:

getent passwd "username" | cut -d ':' -f 5 

que ponerlas a la entrada passwd del usuario especificado, independientemente del módulo NSS subyacente.

Lea el manpage of getent.


Si ya está programando, se puede utilizar el getpwnam() C-Función:

struct passwd *getpwnam(const char *name); 

La estructura passwd tiene un miembro de pw_gecos que debe contener el nombre completo del usuario.

Lea el manpage of getpwnam().


Tenga en cuenta que muchos sistemas utilizan este campo para más del nombre completo del usuario. La convención más común es usar una coma (,) como separador dentro del campo y colocar primero el nombre real de los usuarios.

8

Sólo en caso de que quieres hacer esto desde C, intentar algo como esto:

#include <sys/types.h> 
#include <pwd.h> 
#include <errno.h> 
#include <stdio.h> 
#include <string.h> 

/* Get full name of a user, given their username. Return 0 for not found, 
    -1 for error, or 1 for success. Copy name to `fullname`, but only up 
    to max-1 chars (max includes trailing '\0'). Note that if the GECOS 
    field contains commas, only up to to (but not including) the first comma 
    is copied, since the commas are a convention to add more than just the 
    name into the field, e.g., room number, phone number, etc. */ 
static int getfullname(const char *username, char *fullname, size_t max) 
{ 
    struct passwd *p; 
    size_t n; 

    errno = 0; 
    p = getpwnam(username); 
    if (p == NULL && errno == 0) 
     return 0; 
    if (p == NULL) 
     return -1; 
    if (max == 0) 
     return 1; 
    n = strcspn(p->pw_gecos, ","); 
    if (n > max - 1) 
     n = max - 1; 
    memcpy(fullname, p->pw_gecos, n); 
    fullname[n] = '\0'; 
    return 1; 
} 

int main(int argc, char **argv) 
{ 
    int i; 
    int ret; 
    char fullname[1024]; 

    for (i = 1; i < argc; ++i) { 
     ret = getfullname(argv[i], fullname, sizeof fullname); 
     if (ret == -1) 
      printf("ERROR: %s: %s\n", argv[i], strerror(errno)); 
     else if (ret == 0) 
      printf("UNKONWN: %s\n", argv[i]); 
     else 
      printf("%s: %s\n", argv[i], fullname); 
    } 
    return 0; 
} 
6

Prueba esto:

getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}' 
2

Mi código funciona en bash y ksh, pero no salpicadero o de edad Bourne Shell. También lee los otros campos, en caso de que los desee.

IFS=: read user x uid gid gecos hm sh < <(getent passwd $USER) 
name=${gecos%%,*} 
echo "$name" 

También se puede escanear todo el archivo/etc/passwd. Esto funciona en shell Bourne simple, en 1 proceso, pero no tanto con LDAP o qué.

while IFS=: read user x uid gid gecos hm sh; do 
    name=${gecos%%,*} 
    [ $uid -ge 1000 -a $uid -lt 60000 ] && echo "$name" 
done < /etc/passwd 

Por otro lado, usar herramientas es bueno. Y C también es bueno.

-2

El buen viejo dedo también puede ayudar :-)

finger $USER |head -n1 |cut -d : -f3 
+1

El dedo OP ya mencionado no se instaló al menos un año antes de que publicado esta respuesta;) –

5

Los dos mejores respuestas se pueden combinar en una línea:

getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1 
7

combinación de otras respuestas, probado en Debian mínimo/Ubuntu instalaciones:

getent passwd `whoami` | cut -d ':' -f 5 | cut -d ',' -f 1 
-1

Take 1:

$ user_name=sshd 
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd 
Secure Shell Daemon 

Sin embargo, la base de datos passwd es compatible con carácter especial '&' en los gecos, que debe reemplazado con el valor capitalizado de nombre de usuario:

$ user_name=operator 
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd 
System & 

La mayoría de respuestas aquí (excepto para la solución de los dedos) no lo hacen respecto &. Si quiere apoyar este caso, necesitará un script más complicado.

Take 2:

$ user_name=operator 
$ awk -F: "\$1 == \"$user_name\" { u=\$1; sub(/./, toupper(substr(u,1,1)), u); 
    gsub(/&/, u, \$5); print \$5 }" /etc/passwd 
System Operator 
0

La forma en que pensé que en Linux para obtener el nombre completo en una variable fue:

u_id=`id -u` 
uname=`awk -F: -vid=$u_id '{if ($3 == id) print $5}' /etc/passwd` 

uso A continuación, sólo sencilla la variable, por ejemplo: $ echo $uname

Cuestiones relacionadas