内容

名称

用户::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_”部分,即 namepasswduidgidchangeagequotacommentclassgecosdirshellexpire。在启用 taint 模式下运行时,passwdgecosshell 字段会被标记为 taint。

您还可以使用 :FIELDS 导入标签将所有结构字段直接导入到您的命名空间中,作为常规变量。(请注意,这仍然会覆盖您的核心函数。)将这些字段访问为以 pw_ 开头的变量,其名称在方法名称之前。因此,$passwd_obj->shell 对应于 $pw_shell,如果您导入了这些字段。

getpw() 函数是一个简单的前端,它将数字参数转发给 getpwuid(),将其余参数转发给 getpwnam()。

要访问此功能而不使用核心覆盖,请传递一个空的导入列表到use,然后使用其完全限定名称访问函数。 内置函数始终可以通过CORE::伪包访问。

系统细节

Perl 认为,任何机器最多只有一个changeagequota实现,或者最多只有一个commentclass实现。 一些机器不支持expiregecos,据称也不支持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

历史

2000 年 3 月 18 日

重构内部结构以支持比普通 Perl 函数提供的更好的接口来躲避不稳定的字段。添加了 pw_has() 字段。改进了文档。