【问题标题】:How can I map UIDs to user names using Perl library functions?如何使用 Perl 库函数将 UID 映射到用户名?
【发布时间】:2011-02-23 09:05:50
【问题描述】:

我正在寻找一种使用 Perl 将 uid(代表系统用户的唯一数字)映射到用户名的方法。

请不要建议greping /etc/passwd :)

编辑

澄清一下,我并不是在寻找涉及显式读取/etc/passwd 的解决方案。我意识到任何解决方案最终都会这样做,但我正在寻找一个库函数来为我做这件事。

【问题讨论】:

    标签: perl unix


    【解决方案1】:

    标准函数getpwuid,和同一个C函数一样,根据自己的ID获取用户信息。不需要uses:

    my ($name) = getpwuid(1000);
    print $name,"\n";
    

    虽然它最终会读取/etc/passwd文件,但使用标准接口对其他用户来说更清楚,更不用说它为你节省了一些击键。

    【讨论】:

    • 好吧,出于好奇,我做了一个小脚本。我连续拨打getpwuid(1000); 5 次字面上连续。然后我 strace 并 grep 输出。这是什么 ?会不会是它调用了“open5 次?是的!那是针对同一用户的。现在我明白了,额外的 4 个 I/O 调用完全值得额外的击键。
    • @nc3b 如果我对性能感兴趣,我会在 C 中执行此操作。我正在优化开发时间而不是资源使用。 (注意,在我当前的环境中,Perl 是最好的语言)
    • getpwuid 不能假设 /etc/passwd 文件自上次调用以来没有更改,但这种情况不太可能发生。
    • mobrule 是对的。 /etc/passwd 可以随时更改。如果您担心用户查找的性能,只需记住 getpwuid 的结果(并准备好接受后果!)
    • 您始终可以使用 /etc/passwd 的时间戳作为假设您的缓存已过时的基础
    【解决方案2】:

    读取 /etc/passwd 并将 UID 哈希为登录名。

    编辑:

    $uid   = getpwnam($name);
    $name  = getpwuid($num);
    $name  = getpwent();
    $gid   = getgrnam($name);
    $name  = getgrgid($num);
    $name  = getgrent();
    

    如您所见,无论您选择哪一个,系统调用都从 /etc/passwd 读取(请参阅 this 以供参考)

    【讨论】:

    • 不要投反对票。无论你做什么,最终你(或系统调用)都会从 /etc/passwd 读取和散列。
    • 不管你 grep 什么文件,CPU 最终都会执行汇编命令,那为什么不把所有的东西都写在汇编器中呢?所以你grep以你自己的方式文件,然后你想知道How did Perl gain a reputation for being a write-only language?
    • 是的,否决票:直接读取文件应该永远成为一个工具箱中的第一个工具。一个好的答案是将内置函数作为默认选项,并暗示阅读/etc/passwd 作为可能的优化。另外:告诉人们如何投票?可笑。
    【解决方案3】:

    实际上我建议基于 /etc/passwd 构建一个哈希 :-) 这应该很好用,因为用户 ID 必须是唯一的。

    【讨论】:

    • 有什么建设性的反馈吗?您还能如何获取有关用户/用户 ID 的信息?
    • 因为我正在寻找可以为我做这件事的 perl 库。我知道在某些时候它涉及从 /etc/password 读取。
    • 我看不出您在问题中的哪个位置提出了这个建议 :-) 我也没有完全从“图书馆”中获得这样做的好处。这是一个 file 人,你需要库来读取冒号分隔的值吗?
    • 而且,是的,拥有图书馆总是更有价值,即使任务微不足道。
    • 此外,库调用可以实现以使用其他数据库,如 YP/NIS/NIS+/LDAP/等。补充或代替/etc/passwd。并非所有系统都是独立的。
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多