【发布时间】:2011-02-23 09:05:50
【问题描述】:
我正在寻找一种使用 Perl 将 uid(代表系统用户的唯一数字)映射到用户名的方法。
请不要建议greping /etc/passwd :)
编辑
澄清一下,我并不是在寻找涉及显式读取/etc/passwd 的解决方案。我意识到任何解决方案最终都会这样做,但我正在寻找一个库函数来为我做这件事。
【问题讨论】:
我正在寻找一种使用 Perl 将 uid(代表系统用户的唯一数字)映射到用户名的方法。
请不要建议greping /etc/passwd :)
编辑
澄清一下,我并不是在寻找涉及显式读取/etc/passwd 的解决方案。我意识到任何解决方案最终都会这样做,但我正在寻找一个库函数来为我做这件事。
【问题讨论】:
标准函数getpwuid,和同一个C函数一样,根据自己的ID获取用户信息。不需要uses:
my ($name) = getpwuid(1000);
print $name,"\n";
虽然它最终会读取/etc/passwd文件,但使用标准接口对其他用户来说更清楚,更不用说它为你节省了一些击键。
【讨论】:
getpwuid(1000); 5 次。 字面上连续。然后我 strace 并 grep 输出。这是什么 ?会不会是它调用了“open”5 次?是的!那是针对同一用户的。现在我明白了,额外的 4 个 I/O 调用完全值得额外的击键。
getpwuid 不能假设 /etc/passwd 文件自上次调用以来没有更改,但这种情况不太可能发生。
/etc/passwd 可以随时更改。如果您担心用户查找的性能,只需记住 getpwuid 的结果(并准备好接受后果!)
读取 /etc/passwd 并将 UID 哈希为登录名。
编辑:
$uid = getpwnam($name);
$name = getpwuid($num);
$name = getpwent();
$gid = getgrnam($name);
$name = getgrgid($num);
$name = getgrent();
如您所见,无论您选择哪一个,系统调用都从 /etc/passwd 读取(请参阅 this 以供参考)
【讨论】:
grep以你自己的方式文件,然后你想知道How did Perl gain a reputation for being a write-only language?
/etc/passwd 作为可能的优化。另外:告诉人们如何投票?可笑。
实际上我建议基于 /etc/passwd 构建一个哈希 :-) 这应该很好用,因为用户 ID 必须是唯一的。
【讨论】:
/etc/passwd。并非所有系统都是独立的。