41

我可以通过 /etc/passwd grep 但这似乎很麻烦。'finger' 没有安装,我想避免这种依赖。这是一个程序,所以如果有一些命令可以让您访问用户信息,那就太好了。

4

11 回答 11

54

你没有指定编程语言,所以我假设你想使用 shell;这是Posix shells 的答案

两个步骤:获取适当的记录,然后从该记录中获取您想要的字段。

首先,通过查询passwd来获取账户记录:

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

对于歇斯底里的葡萄干,用户的全名记录在一个名为“GECOS”的字段中;更复杂的是,这个字段通常有自己的结构,全名只是几个可选子字段之一。所以任何想要从账户记录中获取全名的东西都需要解析这两个级别。

$ 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

您的编程语言可能有一个库函数,可以用更少的步骤完成此操作。在 C 中,您将使用“getpwnam”函数,然后解析 GECOS 字段。

于 2009-05-07T07:07:03.593 回答
33

在现代 glibc 系统上,使用以下命令:

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

这将为您passwd提供指定用户的条目,与底层 NSS 模块无关。

阅读. _getent


如果您已经在编程,则可以使用getpwnam()C-Function:

struct passwd *getpwnam(const char *name);

passwd结构有一个pw_gecos成员,该成员应包含用户的全名。

阅读. _getpwnam()


请注意,许多系统使用此字段的目的不仅仅是用户的全名。最常见的约定是,在字段中使用逗号 () 作为分隔符,并将用户的真实姓名放在首位。

于 2009-05-07T06:58:54.313 回答
9

万一您想从 C 中执行此操作,请尝试以下操作:

#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;
}
于 2009-05-07T07:13:42.297 回答
8

其他答案的组合,在最小的 Debian/Ubuntu 安装上进行了测试:

getent passwd "$USER" | cut -d ':' -f 5 | cut -d ',' -f 1
于 2013-09-18T15:37:57.057 回答
7

试试这个:

getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}'
于 2011-07-07T09:11:14.690 回答
4

前两个答案可以合并为一行:

getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1
于 2013-08-02T11:43:31.247 回答
2

我的代码适用于 bash 和 ksh,但不适用于 dash 或旧的 Bourne shell。它也会读取其他字段,以防您可能需要它们。

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

您还可以扫描整个 /etc/passwd 文件。这在普通的 Bourne shell 中工作,在 1 个进程中,但与 LDAP 或其他的没有那么多。

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

另一方面,使用工具是好的。C也不错。

于 2012-08-15T09:20:24.400 回答
1

最近的 Linux/POSIX 发行版包括返回用户身份的id实用程序。如果使用该选项调用,-F它将返回全名:

$ id -F
Mickey Mouse

与往常一样,BSD 变体比 GNU 变体更节俭。

于 2021-10-05T06:50:48.947 回答
0

我在 Linux 上将全名放入变量中的方法是:

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

然后只需简单地使用变量,例如:$ echo $uname

于 2017-07-31T06:25:57.317 回答
-1

取1:

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

但是,passwd 数据库支持 gecos 中的特殊字符 '&',应将其替换为用户名的大写值:

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

这里的大多数答案(除了手指解决方案)都不尊重 &。如果你想支持这种情况,那么你需要一个更复杂的脚本。

取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
于 2013-11-10T11:56:50.617 回答
-3

好的老手指也可能有帮助:-)

finger $USER |head -n1 |cut -d : -f3
于 2012-09-13T00:35:52.180 回答