除了 /etc/passwd 之外是否還有包含/定義我的 UID 的文件?
嘗試了解 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