41 votes

Quel est le moyen le plus simple d'obtenir le nom complet d'un utilisateur sur un système Linux/POSIX ?

Je pourrais parcourir /etc/passwd mais cela me semble onéreux. finger n'est pas installé et j'aimerais éviter cette dépendance. C'est pour un programme et ce serait bien s'il y avait une commande qui vous permette d'accéder aux informations de l'utilisateur.

54voto

bignose Points 6573

Vous ne précisez pas de langage de programmation, je suppose donc que vous voulez utiliser l'interpréteur de commandes. une réponse pour les shells Posix .

Il y a deux étapes : obtenir l'enregistrement approprié, puis obtenir le champ que vous voulez de cet enregistrement.

Tout d'abord, l'obtention de l'enregistrement du compte se fait par en interrogeant le passwd tableau :

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

Pour les raisins secs hystériques, le nom complet de l'utilisateur est enregistré dans un champ appelé le "Champ "GECOS ; pour compliquer les choses, ce champ a souvent sa propre structure avec les nom complet comme l'un des nombreux sous-champs facultatifs . Ainsi, tout ce qui veut obtenir le nom complet de l'enregistrement du compte doit analyser ces deux niveaux.

$ 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

Votre Le langage de programmation dispose probablement d'une fonction de bibliothèque pour faire ça en moins d'étapes. En C, vous utiliseriez la fonction "getpwnam", puis vous analyseriez le champ GECOS.

21 votes

Des raisins secs hystériques ?

2 votes

Ça n'a pas marché pour moi. Mais ça, oui : getent passwd | grep "$USER" | cut -d":" -f5 | cut -d"," -f1

2 votes

Utilisez grep "^$USER :" ou getent passwd $USER pour ne pas faire correspondre tous les noms d'utilisateur contenant le nom de l'utilisateur actuel

33voto

David Schmitt Points 29384

Sur un système glibc moderne, utilisez cette commande :

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

Cela vous permettra d'obtenir le passwd de l'utilisateur spécifié, indépendamment du module NSS sous-jacent.

Lire l'article page de manuel de getent .


Si vous êtes déjà en train de programmer, vous pouvez utiliser la fonction getpwnam() Fonction C :

struct passwd *getpwnam(const char *name);

El passwd La structure a un pw_gecos qui doit contenir le nom complet de l'utilisateur.

Lire l'article page de manuel de getpwnam() .


Sachez que de nombreux systèmes utilisent ce champ pour autre chose que le nom complet de l'utilisateur. La convention la plus courante consiste à utiliser une virgule ( , ) comme séparateur dans le champ et placez le nom réel de l'utilisateur en premier.

2 votes

Donc, typiquement, la commande pour obtenir seulement le nom réel de l'utilisateur est getent passwd $USER | cut -d ':' -f 5 | cut -d ',' -f 1

1 votes

Avec des guillemets autour de $USER dans le cas où il contient des caractères spéciaux, et sans guillemets autour de : y , : getent passwd "$USER" | cut -d: -f5 | cut -d, -f1

9voto

Lars Wirzenius Points 12197

Au cas où vous voudriez le faire à partir de C, essayez quelque chose comme ceci :

#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;
}

7voto

Rob L Points 61

Essayez ça :

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

4voto

AstroFloyd Points 146

Les deux premières réponses peuvent être combinées en une seule ligne :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X