
Я создаю игрушечный системный монитор, для которого я анализирую несколько файлов из /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, такие какgetpwuid()илиgetgrgid()для поиска имен пользователей и UID, а также из скриптов оболочки следует использовать инструменты CLI getent
или id
.
В общем, вы также никогда не должны падать, если сопоставление не удается, так как возможно, что учетная запись была удалена, или что процесс принадлежит контейнеру, который имеет свой собственный диапазон UID. Просто покажите UID, когда это произойдет.