用户::pwent - Perl 内置 getpw*() 函数的按名称接口
use User::pwent;
my $pw = getpwnam('daemon') || die "No daemon user";
if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?\z#s ) {
print "gid 1 on root dir";
}
my $real_shell = $pw->shell || '/bin/sh';
for (my ($fullname, $office, $workphone, $homephone) =
split /\s*,\s*/, $pw->gecos)
{
s/&/ucfirst(lc($pw->name))/ge;
}
use User::pwent qw(:FIELDS);
getpwnam('daemon') || die "No daemon user";
if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?\z#s ) {
print "gid 1 on root dir";
}
my $pw = getpw($whoever);
use User::pwent qw/:DEFAULT pw_has/;
if (pw_has(qw[gecos expire quota])) { .... }
if (pw_has("name uid gid passwd")) { .... }
print "Your struct pwd has: ", scalar pw_has(), "\n";
此模块的默认导出覆盖了核心 getpwent()、getpwuid() 和 getpwnam() 函数,用返回 User::pwent
对象的版本替换它们。此对象具有返回来自 pwd.h 中 C 的 passwd 结构的同名结构字段名称的方法,这些名称已去除其开头的“pw_”部分,即 name
、passwd
、uid
、gid
、change
、age
、quota
、comment
、class
、gecos
、dir
、shell
和 expire
。在启用 taint 模式下运行时,passwd
、gecos
和 shell
字段会被标记为 taint。
您还可以使用 :FIELDS 导入标签将所有结构字段直接导入到您的命名空间中,作为常规变量。(请注意,这仍然会覆盖您的核心函数。)将这些字段访问为以 pw_
开头的变量,其名称在方法名称之前。因此,$passwd_obj->shell
对应于 $pw_shell,如果您导入了这些字段。
getpw() 函数是一个简单的前端,它将数字参数转发给 getpwuid(),将其余参数转发给 getpwnam()。
要访问此功能而不使用核心覆盖,请传递一个空的导入列表到use
,然后使用其完全限定名称访问函数。 内置函数始终可以通过CORE::
伪包访问。
Perl 认为,任何机器最多只有一个change
、age
或quota
实现,或者最多只有一个comment
或class
实现。 一些机器不支持expire
、gecos
,据称也不支持passwd
。 你可以在任何机器上调用这些方法,但如果未实现,它们将返回undef
。
你可以通过询问可导入的pw_has
函数来了解这些方法是否在构建 Perl 的系统上实现。 如果所有参数都是构建平台上的支持字段,则此函数返回真值;如果一个或多个参数不是支持字段,则返回假值;如果你询问 Perl 从未知道如何提供的字段,则会引发异常。 参数可以是空格分隔的字符串,也可以是单独的参数。 如果你不传递任何参数,则该函数将以列表上下文返回构建平台的 C 库支持的struct pwd
字段列表,或以标量上下文返回空格分隔的字符串。 请注意,即使你的 C 库包含某个字段,也不一定意味着该字段在该系统上完全实现。
gecos
字段的解释因系统而异,但传统上包含 4 个逗号分隔的字段,分别包含用户的全名、办公室位置、工作电话号码和家庭电话号码。 gecos
字段中的&
应该替换为用户正确大写的登录name
。 如果shell
字段为空,则应假定为/bin/sh。 Perl 不会为你执行此操作。 passwd
是单向哈希混淆,而不是明文,并且可能无法通过暴力破解猜测来取消哈希。 安全系统使用比 DES 更安全的哈希算法。 在支持影子密码系统的系统上,即使你底层的供应商提供的 C 库过于短视,无法意识到应该这样做,Perl 也会在由具有适当权限的用户调用时自动返回影子密码条目。
有关详细信息,请参阅 passwd(5) 和 getpwent(3)。
虽然此类目前使用 Class::Struct 模块来构建类似结构的类,但你不应该依赖于此。
Tom Christiansen
重构内部结构以支持比普通 Perl 函数提供的更好的接口来躲避不稳定的字段。添加了 pw_has() 字段。改进了文档。