
私は、 から複数のファイルを解析するおもちゃのシステム モニターを作成しています/proc
。他の値の中でも、uid
からすべてのプロセスの を解析します/proc/$pid/status
。その後、 から解析したユーザー名にプロセスの uid をマップします/etc/passwd
。しかし、ユーザー名が見つからないため、まれにプログラムがクラッシュすることがあります。完全な uid -> ユーザー名のマッピングを取得するには、他のファイルも解析する必要がありますか?
答え1
Linux はモジュール式のアカウント データベースをサポートしています。'files' データベース (/etc/passwd) に加えて、ユーザー アカウントは SSSD、BDB、ネットワーク データベース (LDAP、YP、NIS、Hesiod、Active Directory、SQL) に保存できます。また、データベース モジュール自体 (systemd DynamicUsers) によって動的に生成することもできます。
これを機能させるには、一度もない/etc/passwd やその他のファイルを直接解析します (ただし、ローカル ユーザー管理ツールを特に作成している場合を除きます)。
libcが提供する次のような関数を使用する必要があります。取得pwuid()またはgetgrgid()ユーザー名と UID を検索するには、getent
またはid
CLI ツールを使用してシェル スクリプトから検索を実行する必要があります。
一般に、マッピングが失敗した場合もクラッシュすることはありません。アカウントが削除されたか、プロセスが独自の UID 範囲を持つコンテナーに属している可能性があるためです。その場合は、UID を表示するだけです。