Uid

除了 /etc/passwd 之外是否還有包含/定義我的 UID 的文件?

  • May 13, 2022

嘗試了解 UID 和 GID。

各種線上閱讀使我相信我的 UID 保存在 中/etc/passwd,但在我工作的伺服器上似乎並非如此:

$ whoami
user1
$ cat /etc/passwd | grep user1
$

除此之外是否有(其他)文件/etc/passwd可以包含我的 UID?

(我假設 UID 與 GID 相似,因為在某處有一個文件包含它。我在文件中找到了我感興趣的 GID /etc/group

我知道我可以使用 command 獲取我的 UID id -u,但是對於這個問題,我特別有興趣了解是否存在包含它的文件。

Yes/etc/passwd是儲存和查詢使用者帳戶數據庫的多種方式之一。

在許多類 Unix 系統中,名稱服務開關(最初來自 Solaris)負責使用多種方法將一些系統名稱與 id 進行轉換。

它的配置通常儲存在/etc/nsswitch.conf.

在那裡,您會找到許多數據庫的條目以及它們的處理方式(組、密碼、服務、主機、網路……)。對於hosts用於將主機名轉換為網路協議地址的數據庫,您會發現除了/etc/hosts.

當程序請求有關使用者名的資訊時,例如使用getpwnam()標準函式,將在該文件中查找要使用的方法以獲取passwd條目。

如果這樣的方法是files方法,/etc/<db>將被查找。在 GNU 系統上,這通常由一些/lib/<system>/libnss_files.so.<version>動態載入的模組完成。

但是您可以擁有更多,例如 NIS+、LDAP、SQL。其中一些方法包含在 GNU libc 中,一些可以單獨安裝。在 Debian 或衍生產品上,請參閱apt-cache search 'NSS module'例如的輸出。

在使用者數據庫集中的企業環境中,最流行的中央數據庫是 NIS,然後是 NIS+,而如今,它更像是 LDAP 或 Microsoft 的 Active Directory(或它的 Unix 複製)。

如果存在,get{pw/host/grp}...()GNU libc 的函式還將查詢名稱服務記憶體守護程序/run/nscd/socket而不是呼叫整個 NSS 堆棧並直接查詢後端 DB。然後查詢將由完成nscd並記憶體以加快以後的查詢。一些 NSS 模組也可以自己進行記憶體。

在 GNU/Linux 系統上,一種流行的方法是使用系統安全服務( sss)。它帶有一個單獨的守護程序 ( sssd),它處理請求並將它們發送到其他數據庫(例如 LDAP / AD),同時還進行一些記憶體。然後/etc/nsswitch.conf會有一個sss適用於大多數數據庫的方法,並且在配置中sssd配置了後端。在這種情況下, PAM(負責身份驗證)通常也會進行查詢sssd

這應該有助於澄清為什麼在一般情況下從命令行查詢/etc/passwd(或/etc/group或…)以獲取帳戶(或組/主機…)資訊是錯誤的。/etc/hosts大多數現代系統都會有一個getent命令來代替它(也來自 Solaris),或者更便攜,您可以使用perl’ 介面來訪問所有標準get<db>*()功能。

$ getent passwd bin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
$ perl -le 'print for getpwnam("bin")'
bin
x
2
2


bin
/bin
/usr/sbin/nologin
$ getent services domain
domain                53/tcp
$ perl -le 'print for getservbyname("domain", "tcp")'
domain

53
tcp
$ perl -le 'print for getservbyname("domain", "udp")'
domain

53
udp

引用自:https://unix.stackexchange.com/questions/702221