
Estou construindo um monitor de sistema de brinquedo para o qual analiso vários arquivos do /proc
. Entre outros valores, analiso o uid
para cada processo de /proc/$pid/status
. Mais tarde, mapeio o uid do processo para o nome de usuário do qual analisei /etc/passwd
. Mas, em alguns casos raros, meu programa trava porque não consegue encontrar o nome de usuário. Preciso analisar outros arquivos também para obter um mapeamento completo de uid -> nome de usuário?
Responder1
Linux oferece suporte a bancos de dados de contas modulares. Além do banco de dados de 'arquivos' (/etc/passwd), as contas de usuário podem ser armazenadas em SSSD, em BDB, em um banco de dados de rede (LDAP, YP, NIS, Hesiod, Active Directory, SQL), ou podem até mesmo ser gerado dinamicamente pelo próprio módulo de banco de dados (systemd DynamicUsers).
Para fazer isso funcionar, você devenuncaanalise /etc/passwd e outros arquivos diretamente (bem, a menos que você esteja criando especificamente uma ferramenta de gerenciamento de usuário local).
Você deve usar as funções fornecidas pela libc, comogetpwuid()ougetgrgid()para procurar nomes de usuários e UIDs, e a partir de shellscripts você deve usar as ferramentas CLI getent
ou id
para realizar pesquisas.
Em geral, você também nunca deve travar se o mapeamento falhar, pois é possível que a conta tenha sido excluída ou que o processo pertença a um contêiner que possui seu próprio intervalo de UID. Basta mostrar o UID quando isso acontecer.