Podría grep a través de/etc/passwd, pero parece oneroso. 'finger' no está instalado y me gustaría evitar esa dependencia. Esto es para un programa, por lo que sería bueno si hubiera algún comando que le permitiera acceder a la información del usuario.¿Cuál es la forma más fácil de obtener el nombre completo de un usuario en un sistema Linux/POSIX?
¿Cuál es la forma más fácil de obtener el nombre completo de un usuario en un sistema Linux/POSIX?
Respuesta
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.
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.
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;
}
Prueba esto:
getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}'
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.
El buen viejo dedo también puede ayudar :-)
finger $USER |head -n1 |cut -d : -f3
El dedo OP ya mencionado no se instaló al menos un año antes de que publicado esta respuesta;) –
Los dos mejores respuestas se pueden combinar en una línea:
getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1
combinación de otras respuestas, probado en Debian mínimo/Ubuntu instalaciones:
getent passwd `whoami` | cut -d ':' -f 5 | cut -d ',' -f 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
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
- 1. ¿Cuál es la forma más fácil de detectar el sistema operativo del usuario en Rails 3?
- 2. ¿Cuál es la forma más fácil de obtener datos espaciales de sql 08 en un mapa?
- 3. ¿Cuál es la forma más fácil de obtener la ubicación actual de un iPhone?
- 4. ¿Cuál es la forma más fácil de obtener una clave con el valor más alto de un hash en Perl?
- 5. ¿Cuál es la forma más fácil de leer un archivo DBF de FoxPro desde Python?
- 6. La forma más fácil de comprobar si una Cadena arbitraria es un nombre de archivo válido
- 7. ¿Cuál es la forma más fácil de acceder a un micrófono de una computadora en Python?
- 8. ¿Cuál es la forma más fácil de animar una línea?
- 9. La forma más fácil de obtener el código postal del nombre de la ciudad
- 10. ¿Cuál es la forma más eficiente de crear un sistema de bombilla de foro (no leída)?
- 11. C#: ¿cuál es la forma más fácil de restar tiempo?
- 12. ¿Cuál es la forma más eficiente de crear un sistema de permisos?
- 13. ¿Cuál es la mejor forma de obtener el nombre de etiqueta de un elemento en JS?
- 14. ¿Cuál es la forma más fácil de eliminar todos los atributos de un XML en C#?
- 15. ¿Cuál es la forma más fácil de obtener una OutOfMemoryException en C#?
- 16. En Java, ¿cuál es la forma más rápida de obtener la hora del sistema?
- 17. ¿Cuál es la forma más eficiente de mover/cambiar el nombre de un nodo en NetworkX?
- 18. ¿Cuál es la forma más fácil de analizar un archivo INI en Java?
- 19. ¿Cuál es la forma más fácil de crear un sitio web de reserva de citas?
- 20. ¿Cuál es la forma más fácil de usar el comando HEAD de HTTP en PHP?
- 21. ¿Cuál es la forma más fácil de duplicar un registro de registro activo?
- 22. ¿Cuál es la forma más fácil de eliminar NSStrings vacíos de un NSArray?
- 23. ¿Cuál es la forma más fácil de usar reify (obtener un AST de) una expresión en Scala?
- 24. ¿Cuál es la forma más fácil de configurar un servidor de subversión local?
- 25. ¿Cuál es la forma más fácil de extraer datos de un PDF?
- 26. ¿Cuál es la forma más fácil de obtener datos de seguimiento de un simple lector de tarjeta magnética USB HID?
- 27. ¿Cuál es la forma más fácil de manejar el evento SelectedItem con MVVM?
- 28. ¿Cuál es la forma más fácil de "separar/demonizar" un script Bash?
- 29. ¿Cuál es la mejor y más fácil forma de crear un formulario UITableView?
- 30. ¿Cuál es la forma más fácil de ordenar un EF4 EntityCollection <T>?
pasas histéricas? – dat
@dat, ver http://catb.org/jargon/html/H/hysterical-reasons.html – bignose
No funcionó para mí. Pero esto lo hizo: 'getent passwd | grep "$ USER" | cut -d ":" -f5 | cut -d "," -f1' –