在UNIX类型的操作系统中获取当前用户帐户的显示名称

问题描述:

在Windows中,用户帐户具有帐户名称和与该帐户关联的“真实姓名”。这可以通过GetUserNameEx()检索。类似地,在UNIX类型的操作系统中,存在“手指信息”(由chfn等设置,以及通过桌面上的各种GUI工具UNIXen)。 UNIX类型的操作系统(例如macOS和Linux)中的用户进程如何检索此信息?在UNIX类型的操作系统中获取当前用户帐户的显示名称

理想的解决方案是使用libc API,而不依赖于产生finger进程等。

+2

这是否帮助? http://*.com/questions/6619277/how-to-get-the-logged-in-users-real-name-in-unix – Sundeep

+0

@Sundeep是的! 'getpwent'似乎是在正确的方向。谢谢。此外,这个问题应该被关闭为重复:) – fluffy

+0

嗯,至少在OSX上,'getpwent'实际上并没有返回我需要的信息,但问题仍然是重复的。 :) – fluffy

在Unix类系统上,我可能会打电话getuid,然后getpwuidgetpwuid_r

喜欢的东西:

#include <pwd.h> 
#include <stdio.h> 
#include <unistd.h> 

int 
main(void) 
{ 
    struct passwd *pw; 

    pw = getpwuid(getuid()); 

    if (pw == 0) { 
     perror("getpwuid failed"); 
     return 1; 
    } 

    printf("username: %s; realname: '%s'\n", pw->pw_name, pw->pw_gecos); 

    return 0; 
} 
+0

不幸的是(或者在Ubuntu上,'pw_gecos'字段没有在macOS上提供实名)。 – fluffy

+0

登录需要使用可以找到的真实姓名创建,大概是这样,但是上面的代码在Mac OS X 10.11.6(El Capitan)中原样使用,其中“cc”是“Apple LLVM 7.3版”。 0(clang-703.0.31)“,在Ubuntu 16.04上,”cc“是”cc(Ubuntu 5.4.0-6ubuntu1〜16.04.2)5.4.0 20160609“。 你是怎么试图让它在Mac和Ubuntu上工作的? – sjnarv

+0

哦,有趣!我使用过'getpwent()'而不是'getpwuid(getuid())',这就是它失败的原因。 getpwuid在两台机器上工作正常(macOS 10.12和Ubuntu 15.10)。谢谢! – fluffy

壳脚本解决方案:

在Linux中,可以在一个子过程使用getent passwd,然后解析出实名字段(它应该是逗号之间的五分之一)。

在macOS上,您可以使用id -f