內容

名稱

User::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 欄位會受到污染。

您也可以使用 :FIELDS 匯入標籤,將所有結構欄位直接匯入您的命名空間作為一般變數。(請注意,這仍然會覆寫您的核心函式。)使用在它們的方法名稱前面加上 pw_ 的變數名稱來存取這些欄位。因此,如果您匯入這些欄位,$passwd_obj->shell 會對應到 $pw_shell。

getpw() 函式是一個簡單的前端,它會將數值引數轉發給 getpwuid(),並將其餘的轉發給 getpwnam()。

若要存取此功能而不覆寫核心,請將一個空的匯入清單傳遞給 use,然後使用它們的完整限定名稱來存取函式函式。內建函式仍然可透過 CORE:: 偽套件使用。

系統規格

Perl 認為沒有任何機器同時實作 changeagequota 中的兩個以上,也沒有同時實作 commentclass 中的兩個以上。有些機器不支援 expiregecos 或據稱的 passwd。無論您使用哪部機器,您都可以呼叫這些方法,但如果未實作,它們會傳回 undef

您可以詢問是否在 Perl 建置的系統上實作了其中一項,方法是詢問可匯入的 pw_has 函數。如果所有參數都是建置平台上的支援欄位,此函數會傳回 true;如果一個或多個不是,則傳回 false;如果您詢問 Perl 永遠不知道如何提供的欄位,則會引發例外。參數可以是空白分隔的字串,或作為個別引數。如果您沒有傳遞任何參數,則函數會傳回建置平台的 C 函式庫支援的 struct pwd 欄位清單,作為清單內容的清單,或作為純量內容的空白分隔字串。請注意,即使您的 C 函式庫有欄位,並不一定表示該欄位已在該系統上完全實作。

gecos 欄位的詮釋因系統而異,但傳統上包含 4 個以逗號分隔的欄位,其中包含使用者的全名、辦公室位置、工作電話號碼和住家電話號碼。gecos 欄位中的 & 應替換為使用者適當大寫的登入 名稱。如果 shell 欄位為空白,則必須假設為 /bin/sh。Perl 沒有為您執行此動作。passwd 是單向雜湊的亂碼,不是純文字,而且可能無法透過蠻力猜測來取消雜湊。安全的系統使用比 DES 更安全的雜湊。在支援影子密碼系統的系統上,即使您的底層供應商提供的 C 函式庫目光短淺到無法理解應該執行此動作,Perl 仍會在適當授權的使用者呼叫時自動傳回影子密碼條目。

有關詳細資訊,請參閱 passwd(5) 和 getpwent(3)。

注意

雖然目前使用 Class::Struct 模組實作此類別以建置類結構類別,但您不應依賴此類別。

作者

Tom Christiansen

歷史

2000 年 3 月 18 日

重新設計內部結構,以支援比一般 Perl 函式提供的更佳介面來躲避可疑欄位。新增 pw_has() 欄位。改善文件。