PHP 日本會議 2024

posix_getpwnam

(PHP 4、PHP 5、PHP 7、PHP 8)

posix_getpwnam依使用者名稱傳回使用者資訊

描述

posix_getpwnam(字串 $username): 陣列|false

傳回關於指定使用者的資訊陣列

參數

username

字母數字使用者名稱。

傳回值

成功時,會傳回一個包含下列元素的陣列;否則會傳回 false

使用者資訊陣列
元素 描述
name name 元素包含使用者的使用者名稱。這是一個簡短的,通常少於 16 個字元的「handle」使用者,而不是真實的完整名稱。這應該與呼叫函式時使用的 username 參數相同,因此是多餘的。
passwd passwd 元素包含使用者加密格式的密碼。通常,例如在採用「陰影」密碼的系統上,會傳回星號代替。
uid 使用者的使用者 ID,以數字形式表示。
gid 使用者的群組 ID。使用 posix_getgrgid() 函式來解析群組名稱及其成員清單。
gecos GECOS 是一個過時的術語,指的是 Honeywell 批次處理系統上的 finger 資訊欄位。但是,該欄位仍然存在,其內容已由 POSIX 正規化。該欄位包含一個以逗號分隔的清單,其中包含使用者的完整姓名、辦公室電話、辦公室號碼和家庭電話號碼。在大多數系統上,只有使用者的全名可用。
dir 此元素包含使用者主目錄的絕對路徑。
shell shell 元素包含使用者預設 shell 可執行檔的絕對路徑。

範例

範例 #1 posix_getpwnam() 的範例用法

<?php

$userinfo
= posix_getpwnam("tom");

print_r($userinfo);
?>

以上範例將輸出類似的內容

Array
(
    [name]    => tom
    [passwd]  => x
    [uid]     => 10000
    [gid]     => 42
    [gecos]   => "tom,,,"
    [dir]     => "/home/tom"
    [shell]   => "/bin/bash"
)

請參閱

  • posix_getpwuid() - 依使用者 ID 傳回使用者資訊
  • POSIX 手冊頁 GETPWNAM(3)

新增註解

使用者貢獻的註解 9 則註解

2
darryl at pointclark dot net
23 年前
如果您需要在使用陰影密碼的系統上驗證 *真實* 的 Unix 密碼,則 PHP 中的 posix_getpwnam() 函式將無法運作(如上所述,「x」或「*」將會位於密碼欄位中)。

我需要在 PHP 中驗證使用者/密碼(使用 SSL!)。我不知道這是否是最好的方法,但這是我目前正在做的事情(效果很好!)。

首先,您需要來自作業系統的一些協助。我編寫了一個微小的 C 實用程式來為我進行陰影查找... 它需要 root 權限才能讀取 /etc/shadow。因此,在編譯(gcc -O2 -s -o spasswd -lcrypt spasswd.c)後,您需要使用 sudo 來執行它,或者

# chown root spasswd && chmod u+s spasswd

我用來從 PHP 驗證使用者/密碼的程式碼看起來像

function Authenticate($realm)
{
global $PHP_AUTH_USER;
global $PHP_AUTH_PW;

if(!isset($PHP_AUTH_USER))
{
header("WWW-Authenticate: Basic realm=\"$realm\"");
header("HTTP/1.0 401 Unauthorized");

return false;
}
else
{
if(($fh = popen("/usr/sbin/spasswd", "w")))
{
fputs($fh, "$PHP_AUTH_USER $PHP_AUTH_PW");
$r = pclose($fh);

if(!$r)
return true;
}
}

header("WWW-Authenticate: Basic realm=\"$realm\"");
header("HTTP/1.0 401 Unauthorized");

return false;
}

spasswd.c 的 C 原始碼

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crypt.h>
#include <shadow.h>

static char salt[12], user[128], pass[128];

void die(void)
{
memset(salt, '\0', 12);
memset(user, '\0', 128);
memset(pass, '\0', 128);
}

int main(int argc, char *argv[])
{
struct spwd *passwd;

atexit(die); die();

if(fscanf(stdin, "%127s %127s", user, pass) != 2)
return 1;

if(!(passwd = getspnam(user)))
return 1;

strncpy(salt, passwd->sp_pwdp, 11);
strncpy(pass, crypt(pass, salt), 127);

if(!strncmp(pass, passwd->sp_pwdp, 127))
return 0;

return 1;
}

希望這對某人有幫助...
1
perreal at lyon dot cemagref dot fr
22 年前
若要在 Unix 盒上檢查密碼,請查看 Apache 的 mod_auth_external 模組,它會使用外部程式來執行實際工作。伺服器永遠不會讀取加密的密碼。

其中一個 pwauth 可以設定為使用 PAM 或系統上使用的任何其他程式。可以執行此程式的使用者會在編譯時設定。並且可以使用 exec(...) 從 PHP 呼叫此程式。
0
bau at kg-fds dot de
18 年前
如果您正在執行 pop3 精靈,則可以透過使用 fsockopen :-) 並檢查它是否傳回 +OK 或 -ERR,在 pop3 上執行身份驗證
0
corychristison at lavacube dot net
20 年前
對於那些使用 PHP 編寫精靈且重視安全性的您。如果您已呼叫 PHP 的 chroot() 函式,則此函式將不會傳回任何資訊。

我花了幾分鐘才弄清楚為什麼它找不到正在搜尋的使用者。
0
marcus at nospamsynchromedia dot co dot uk
22 年前
給定一個不存在的使用者名稱,此函式會傳回布林值 FALSE。
0
vision_1967 at hotmail dot com
23 年前
我需要存取使用者資訊,以透過 SSL 連線執行登入/驗證,並且遇到了密碼欄位中收到 '*' 的相同問題。在檢查 posix_getpwnam 的文件後,我看到了一個涉及編寫 C 程式的先前解決方案。這對我來說有點笨重,所以我提出了我自己的解決方案。

此主題的變體可能會被用來使解決方案對程式設計師/讀者更友善,但我所做的方式完成了我需要完成的任務。

如果從 posix_getpwnam 取得的資訊來自參與 NIS 網路的主機,則可以使用以下命令完成相同的操作


$autharray = split(":",`ypmatch $USER passwd`);


(對於如此簡短的解決方案而言,解釋相當長,對吧?)

您必須使用此方法依索引號 ($autharray[0], $autharray[1], ...) 存取欄位。

若要建立與 posix_getpwnam 函式外掛程式相容的關聯陣列,您可能需要使用 'list' 指定符來執行指派。

希望這對某人有幫助。

--S
0
sezery at damla dot net
23 年前
由於這些函式基於 /etc/group 檔案,但新的 Redhat 不會將群組成員清單放入此檔案中,因此使用者和群組函式無法在最近的 Redhat 系統上運作。相反地,您需要檢查 /etc/passwd 檔案,並透過檢查群組 ID 來尋找群組的成員。
-1
bau at kg-fds dot de
18 年前
您好,我嘗試了一種比檢查 pop3 伺服器更簡單的方法來檢查密碼。如果您正在執行 samba 伺服器或 Windows PDC,則可以嘗試使用您想要檢查的使用者名稱/密碼連線到此伺服器的 netlogon

if (exec('echo "exit"|smbclient //server/netlogon -U'.$user.' '.$pass)=="") { ... }

如果使用者名稱/密碼不符,則 LINUX 下的 exec 命令會傳回錯誤。

祝你好運
Baumg?rtner
-2
bau at kg-fds dot de
18 年前
噢,我忘記了以下內容

若要透過 PHP 變更使用者密碼,
您可以使用以下程式碼(在已安裝 Samba 的 Linux 下)

exec('echo -e "'.$oldpassword.'\n'.$newpassword.'\n'.$newpassword.'
"|smbpasswd -U'.$user.' -s')

exec 命令會傳回 ""
如果發生錯誤(然後請參閱網路伺服器的 error_log)
或訊息「密碼已變更」。

祝你好運。
Baumg?rtner
To Top