Was ist der einfachste Weg, ein Benutzer vollständigen Namen auf einem Linux / POSIX-System zu bekommen?

StackOverflow https://stackoverflow.com/questions/833227

Frage

Ich kann grep durch / etc / passwd, aber das scheint beschwerlich. ‚Finger‘ nicht installiert ist, und ich möchte diese Abhängigkeit vermeiden. Dies ist für ein Programm, so dass es schön wäre, wenn es ein Befehl ist, dass wir Ihnen den Zugriff nur Benutzer Info.

War es hilfreich?

Lösung

Sie geben keine Programmiersprache, also werde ich annehmen, dass Sie die Shell verwenden möchten; hier ist eine Antwort für Posix Schalen .

Zwei Schritte dazu. Den entsprechenden Datensatz bekommen, dann bekommen Sie das Feld aus dem Datensatz wollen

Als erstes immer die Kontoaufzeichnung erfolgt durch Abfrage 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

Für hysterische Rosinen, der vollständige Name des Benutzers in einem Feld aufgezeichnet wird aufgerufen, die „ GECOS“Feld ; Erschwerend kommt hinzu, hat dieses Feld oft seine eigene Struktur mit den vollständigen Namen als nur ein von mehreren optionalen Unterfeldern . Also alles, was den vollständigen Namen des Kontodatensatz erhalten möchte, muss 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

Programmiersprache hat wahrscheinlich eine Bibliotheksfunktion dies in weniger Schritten zu tun. In C, dann würden Sie die ‚getpwnam‘ Funktion verwenden und dann das GECOS-Feld analysieren.

Andere Tipps

Auf einem modernen glibc-System, verwenden Sie diesen Befehl:

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

Das wird Ihr den passwd Eintrag des angegebenen Benutzers erhalten, unabhängig von dem 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 ein pw_gecos Element, das den vollständigen Namen des Benutzers enthalten soll.

Lesen Sie die manpage von getpwnam() .


Beachten Sie, dass viele Systeme verwenden Sie dieses Feld für mehr als den vollständigen Namen des Benutzers. Die häufigste Konvention ist ein Komma (,) als Trennzeichen im Feld zu verwenden und zunächst die Benutzer in Echtnamen.

Nur falls Sie dies von C tun wollen, versuchen, etwas wie folgt aus:

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

Die Kombination von anderen Antworten, getestet auf minimale Debian / Ubuntu-Installationen:

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

Versuchen Sie folgendes:

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

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

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

Mein Code funktioniert in bash und ksh, aber nicht schleudern oder alt Bourne-Shell. Es liest die anderen Felder auch, falls Sie könnten sie wollen.

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

Sie könnten auch scannen die gesamte / etc / passwd-Datei. Dies funktioniert in einfach Bourne-Shell in 1 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

Auf der anderen Seite, Werkzeuge ist gut. Und C ist auch gut.

Die Art und Weise, dass ich es auf Linux rechnete den vollständigen Namen in eine Variable zu bekommen war:

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

Dann nur einfache Verwendung der Variable, ex: $ echo $uname

Nehmen Sie 1:

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

Allerdings passwd-Datenbank unterstützt Sonderzeichen ‚&‘ in den gecos, die mit aktivierten Wert des Benutzernamens ersetzt sollte:

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

Die meisten Antworten hier (mit Ausnahme der Finger-Lösung) nicht respektieren &. Wenn Sie diesen Fall unterstützen wollen, dann werden Sie eine kompliziertere Skript benötigen.

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

Die gute alte Finger kann auch helfen: -)

finger $USER |head -n1 |cut -d : -f3
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top