it-swarm.com.de

Was ist der einfachste Weg, um den vollständigen Namen eines Benutzers auf einem Linux/POSIX-System zu erhalten?

Ich könnte durch/etc/passwd grep, aber das scheint beschwerlich zu sein. 'finger' ist nicht installiert und ich möchte diese Abhängigkeit vermeiden. Dies ist für ein Programm, also wäre es schön, wenn es einen Befehl gibt, mit dem Sie einfach auf Benutzerinformationen zugreifen können.

33
Josh Gibson

Sie geben keine Programmiersprache an, also gehe ich davon aus, dass Sie die Shell verwenden möchten. Hier ist eine Antwort für Posix-Muscheln.

Zwei Schritte dazu: Holen Sie sich den entsprechenden Datensatz und dann das gewünschte Feld aus diesem Datensatz.

Zuerst erhalten Sie den Kontendatensatz von Abfragen der passwd-Tabelle:

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

Bei hysterischen Rosinen wird der vollständige Name des Benutzers in einem Feld namens "GECOS" -Feld aufgezeichnet. Zur Vereinfachung hat dieses Feld oft eine eigene Struktur mit dem vollständiger Name als nur eines von mehreren optionalen Unterfeldern. Daher müssen alle Ebenen, die den vollständigen Namen aus dem Kontodatensatz erhalten möchten, diese beiden Ebenen analysieren.

$ 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

Ihre Programmiersprache hat wahrscheinlich eine Bibliotheksfunktion, um dies in weniger Schritten durchzuführen. In C würden Sie die Funktion 'getpwnam' verwenden und dann das GECOS-Feld analysieren.

42
bignose

Verwenden Sie auf einem modernen glibc-System den folgenden Befehl:

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

Damit erhalten Sie den passwd-Eintrag des angegebenen Benutzers, unabhängig vom zugrunde liegenden NSS-Modul.

Lesen Sie die manpage von getent .


Wenn Sie bereits programmieren, können Sie die getpwnam() C-Funktion verwenden:

struct passwd *getpwnam(const char *name);

Die passwd-Struktur hat einen pw_gecos-Member, der den vollständigen Namen des Benutzers enthalten sollte.

Lesen Sie die manpage von getpwnam() .


Beachten Sie, dass viele Systeme dieses Feld für mehr als den vollständigen Namen des Benutzers verwenden. Die gebräuchlichste Konvention ist, ein Komma (,) als Trennzeichen innerhalb des Feldes zu verwenden und den tatsächlichen Namen des Benutzers zuerst zu setzen.

24
David Schmitt

Nur für den Fall, dass Sie dies von C aus tun möchten, versuchen Sie Folgendes:

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

Kombination anderer Antworten, getestet auf minimalen Debian/Ubuntu-Installationen:

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

Versuche dies:

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

Die ersten beiden Antworten können in einer Zeile kombiniert werden:

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

Mein Code funktioniert in bash und ksh, aber nicht in der Bourne-Shell. Es liest auch die anderen Felder, falls Sie sie möchten.

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

Sie können auch die gesamte Datei/etc/passwd scannen. Dies funktioniert in einfacher Bourne-Shell in einem Prozess, aber nicht so sehr mit LDAP oder was.

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

Andererseits ist die Verwendung von Werkzeugen gut. Und C ist auch gut.

2
Sam Watkins

Ich fand es unter Linux so, dass der vollständige Name in eine Variable umgewandelt wurde:

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

Dann verwenden Sie einfach die Variable, zB: $ echo $uname

0
TheTechCode