更正我以下的註記:get_current_user() 並*沒有* 取得執行腳本的使用者名稱。相反地,它「取得目前 PHP 腳本擁有者的名稱」——也就是檔案的擁有者,而不是程序的擁有者。
要正確取得執行中的使用者,請測試 function_exists('posix_getpwuid') 是否存在,如果不存在,則假設您在 Windows 上執行並呼叫 getenv('USERNAME')。
(PHP 4, PHP 5, PHP 7, PHP 8)
posix_getpwuid — 透過使用者 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" )
更正我以下的註記:get_current_user() 並*沒有* 取得執行腳本的使用者名稱。相反地,它「取得目前 PHP 腳本擁有者的名稱」——也就是檔案的擁有者,而不是程序的擁有者。
要正確取得執行中的使用者,請測試 function_exists('posix_getpwuid') 是否存在,如果不存在,則假設您在 Windows 上執行並呼叫 getenv('USERNAME')。
我只想要使用者名稱,而不是其他資訊。我正在遞迴迴圈遍歷一個目錄,並且需要每個檔案或目錄的使用者名稱。我使用 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 系統下可運作.. 其他環境未經測試。
如果系統同時也是郵件伺服器,且系統使用者具有支援 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 的使用者名稱作為陣列的第一個鍵值返回。
如果您使用核心安全模組,例如 LIDS、GrSec 或 Selinux,它只有在執行 PHP/Apache 的使用者可讀取 '/etc/passwd' 時才會運作,否則您會得到 FALSE。
要取得檔案擁有者的名稱,您可以使用以下程式碼:
<?php
$startscript="/var/log/hello.log";
$fileowneruid=fileowner($startscript);
$fileownerarray=posix_getpwuid($fileowneruid);
$fileowner=$fileownerarray['name'];
echo "擁有者是 $fileowner";
?>
(我相信有很多方法可以達成這個目的,這是我理解的一種方式,也希望對您有所幫助 :-))。
Rolf
以下是一種即使未安裝 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;
}
?>