
我正在建立一個玩具系統監視器,我從中解析多個檔案/proc
。除了其他值之外,我還解析了uid
來自 的每個進程/proc/$pid/status
。後來我將進程的 uid 映射到我從中解析的用戶名/etc/passwd
。但在極少數情況下,我的程式會崩潰,因為它找不到用戶名。我是否還需要解析其他文件才能獲得完整的 uid -> 用戶名映射?
答案1
Linux 支援模組化帳戶資料庫。除了「檔案」資料庫 (/etc/passwd) 之外,使用者帳戶還可以儲存在 SSSD、BDB、網路資料庫(LDAP、YP、NIS、Hesiod、Active Directory、SQL)中,甚至可以是由資料庫模組本身動態產生(systemd DynamicUsers)。
為了使這項工作有效,你應該絕不直接解析 /etc/passwd 和其他檔案(好吧,除非你專門製作本機使用者管理工具)。
您應該使用 libc 提供的函數,例如取得pwuid()或者getgrgid()要查找使用者名稱和 UID,您應該使用getent
或id
CLI 工具從 shell 腳本中執行查找。
一般來說,如果映射失敗,您也不應該崩潰,因為帳戶可能已被刪除,或者進程屬於具有自己的 UID 範圍的容器。發生這種情況時只需顯示 UID 即可。