【问题标题】:Getting the current user account's display name in UNIX-type operating systems获取当前用户帐户在 UNIX 类型操作系统中的显示名称
【发布时间】:2017-02-02 15:07:45
【问题描述】:

在 Windows 中,用户帐户同时具有帐户名和与该帐户关联的“真实姓名”。这可以通过GetUserNameEx()检索。

类似地,在 UNIX 类型的操作系统中,存在“手指信息”(由 chfn 等设置,以及通过桌面 UNIXen 上的各种 GUI 工具设置)。在 UNIX 类型的操作系统(例如 macOS 和 Linux)中,用户进程如何检索这些信息?

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

【问题讨论】:

标签: linux macos unix cross-platform


【解决方案1】:

在类 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;
}

【讨论】:

  • pw_gecos 字段在 macOS 上不提供实名,不幸的是(或者在 Ubuntu 上,就此而言)。
  • 登录需要使用可以找到的真实姓名创建,大概,但上面的代码在 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 上运行的?
  • 哦,有趣!我使用了getpwent() 而不是getpwuid(getuid()),这就是它失败的原因。 getpwuid 在两台机器(macOS 10.12 和 Ubuntu 15.10)上都运行良好。谢谢!
  • 啊,原来我也误解了getpwent() 的实际作用。我应该更仔细地查看它的联机帮助页,以及它的其余输出。 :)
【解决方案2】:

Shell 脚本解决方案:

在Linux上,可以在子进程中使用getent passwd,然后解析出realname字段(应该是逗号之间的第五个)。

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

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2013-05-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多