如何在Unix中获取登录用户的真实姓名?

时间:2011-07-08 02:16:25

标签: unix

我正在寻找登录用户的真实(全名),以避免在我正在构建的应用程序中提示他们。我看到finger命令将输出一个包含此列的数据列表,并且想知道grep是否有意义或是否有更简单的方法?我发现的手指开关都没有输出真实姓名。任何想法都会非常感激。

7 个答案:

答案 0 :(得分:13)

getent passwd `whoami` | cut -d : -f 5

getent通常比grepping /etc/passwd更好。

答案 1 :(得分:3)

您可以使用getpwent()获取每个连续的密码,直到找到与当前登录用户匹配的密码,然后解析gecos字段。

更好的是,您可以使用getpwuid()直接获取当前用户的uid条目。

在任何一种情况下,

  1. 您必须先获取当前用户的登录名或ID,
  2. 无法保证gecos字段实际上包含用户的真实全名或任何内容。

答案 2 :(得分:2)

getent passwd "$USER" | cut -d: -f5 | cut -d, -f1

首先从passwd数据库(也可能存储在 NIS LDAP )中获取当前用户的行

在获取的行中,字段由:分隔符分隔。 GECOS 条目是第5个字段,因此第一个cut条目提取。

GECOS 条目本身可能由多个项目组成 - 以,分隔 - 其中全名是第一项。这是第二个cut提取的内容。如果 GECOS 条目缺少逗号,这也适用。在这种情况下,整个条目是第一个项目。

您还可以将结果分配给变量:

fullname=$( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 )

或直接进一步处理:

echo "$( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 )'s home is $HOME."
cat <<EOF
Hello, $( getent passwd "$USER" | cut -d: -f5 | cut -d, -f1 ).
How are you doing?
EOF

答案 3 :(得分:1)

特定于macOS,没有getent命令;相反,你必须使用id -F

答案 4 :(得分:0)

对于macOS和Linux:

if [ "Darwin" = $(uname) ]; then FULLNAME=$(id -P $USER | awk -F '[:]' '{print $8}') else FULLNAME=$(getent passwd $USER | cut -d: -f5 | cut -d, -f1) fi echo $FULLNAME

答案 5 :(得分:-1)

我用

grep "^$USER:" /etc/passwd | awk -F: '{print $5}'

解释:

  • $ USER包含当前用户的登录信息
  • 第一部分(grep)从/etc/passwd提取有关该用户的行
  • 第二部分(awk)将此行与分隔符':'分开并打印第五个组件, 这是全名

如果您不想依赖$USER设置,可以改用:

grep "^`whoami`:" /etc/passwd | awk -F: '{print $5}'

答案 6 :(得分:-2)

如何尝试whoami或logname