2024 年日本 PHP 研討會

posix_getpwuid

(PHP 4, PHP 5, PHP 7, PHP 8)

posix_getpwuid透過使用者 ID 返回使用者資訊

說明

posix_getpwuid(int $user_id): array|false

返回一個包含指定使用者 ID 之使用者資訊的 陣列

參數

user_id

使用者識別碼。

回傳值

返回一個包含以下元素的關聯式陣列

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

範例

範例 #1 posix_getpwuid() 的使用範例

<?php

$userinfo
= posix_getpwuid(10000);

print_r($userinfo);
?>

上述範例的輸出會類似於

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

另請參閱

  • posix_getpwnam() - 透過使用者名稱返回使用者的資訊
  • POSIX 手冊頁 GETPWNAM(3)

新增註記

使用者貢獻的註記 6 則註記

ddascalescu at gmail dot com
16 年前
更正我以下的註記:get_current_user() 並*沒有* 取得執行腳本的使用者名稱。相反地,它「取得目前 PHP 腳本擁有者的名稱」——也就是檔案的擁有者,而不是程序的擁有者。

要正確取得執行中的使用者,請測試 function_exists('posix_getpwuid') 是否存在,如果不存在,則假設您在 Windows 上執行並呼叫 getenv('USERNAME')。
匿名
11 年前
我只想要使用者名稱,而不是其他資訊。我正在遞迴迴圈遍歷一個目錄,並且需要每個檔案或目錄的使用者名稱。我使用 stat 來取得我需要的檔案屬性,它會提供 uid。在包含許多檔案的目錄中,使用 posix_getpwuid() 查詢每個檔案會佔用大量時間。我想出了一種快取機制(我認為應該內建)。每次發現新的 uid 時都需要新的查詢,而這個函式會降低速度,但是,更有可能的是您需要多次使用少數幾個 uid,所以每次遇到相同的 uid 時,都不會進行耗時的查詢。

這是我的程式碼,請隨意使用等等。

<?php
$arr_uname
= 陣列();
函式
file_owner_cached($uid)
{
全域
$arr_uname;
if (!isset(
$arr_uname[$uid]))
{
$arr_uname[$uid] = posix_getpwuid($uid)['name'];
}
return
$arr_uname[$uid];
}
?>
在 PHP 5.3.19 版本、Linux 系統下可運作.. 其他環境未經測試。
mehmet at karakaya dot us
18 年前
如果系統同時也是郵件伺服器,且系統使用者具有支援 PHP 的使用者目錄,則此函式可能會導致系統使用者濫用而發送垃圾郵件。

<?php

/* 設定起始點和終止點 */
$start=0;//第一個使用者 ID
$interval=1000;//每次讀取的行數
$finishline=3000;//最後一個使用者 ID

$first=(isset($_GET['first'])?$_GET['first']:$start);
$last=(isset($_GET['last'])?$_GET['last']:$interval);

/* 逐行讀取並寫入使用者資訊 */
$fp=fopen('copiedpasswd','a');
//copiedpasswd 檔案必須可被 Apache 寫入
for ($user=$first;$user<=$last;$user++)
{
$list=posix_getpwuid($user);
if (
$list['name']=='') { continue; }
$line=implode(':',$list)."\n";
fputs($fp,$line);
}
//迴圈結束
fclose($fp);

/* 控制或轉發以防止逾時 */
if ($last>=$finishline)
{
header("Location: copiedpasswd");
}
//if 結束
else
{
$first += $interval;
$last += $interval;
header("Location: thenameofthisscript.php?first=$first&last=$last");
}
//else 結束

?>

因為 posix_getpwuid(1000) 會將 ID 為 1000 的使用者名稱作為陣列的第一個鍵值返回。
Nikolai-Zujev-(at)-Gmail-dot-Com
20 年前
如果您使用核心安全模組,例如 LIDS、GrSec 或 Selinux,它只有在執行 PHP/Apache 的使用者可讀取 '/etc/passwd' 時才會運作,否則您會得到 FALSE。
rolf dot winterscheidt at rowitech dot de
21 年前
要取得檔案擁有者的名稱,您可以使用以下程式碼:

<?php
$startscript
="/var/log/hello.log";

$fileowneruid=fileowner($startscript);
$fileownerarray=posix_getpwuid($fileowneruid);
$fileowner=$fileownerarray['name'];

echo
"擁有者是 $fileowner";
?>

(我相信有很多方法可以達成這個目的,這是我理解的一種方式,也希望對您有所幫助 :-))。

Rolf
martin at arp242 dot net
13 年前
以下是一種即使未安裝 posix 擴充功能也能安全地從 uid 取得使用者名稱的方法。

<?php
function GetUsernameFromUid($uid)
{
if (
function_exists('posix_getpwuid'))
{
$a = posix_getpwuid($uid);
return
$a['name'];
}
# 這個方法適用於 BSD,但不適用於 GNU
elseif (strstr(php_uname('s'), 'BSD'))
{
exec('id -u ' . (int) $uid, $o, $r);

if (
$r == 0)
return
trim($o['0']);
else
return
$uid;
}
elseif (
is_readable('/etc/passwd'))
{
exec(sprintf('grep :%s: /etc/passwd | cut -d: -f1', (int) $uid), $o, $r);
if (
$r == 0)
return
trim($o['0']);
else
return
$uid;
}
else
return
$uid;
}
?>
To Top