Я заметил, что большинство основных утилит, которые добавляют и изменяют пользователей, делают это напрямую, часто по-разному.Функции, которые вы можете использовать для изменения passwd и теневых файлов, доступны в <pwd.h>
, а также в <sys/types.h>
и они являются частью glibc .
fgetpwent , getpwnam , getpw , getpwent_r , putpwent , setpwent
Мы можем посмотреть, как busybox (через TinyLogin ), в качестве примера.В busybox/loginutils/adduser.c
они помещают пользователя в файл passwd, создавая структуру passwd, а затем вызывают putpwent
.Для добавления пароля пользователя в теневой файл, они просто вызывают fprintf
и пишут строку напрямую.
Для аутентификации пользователей современным способом есть Linux-PAM .Но что касается добавления пользователей, вы можете видеть в pam_unix_passwd.c , что они вызывают unix_update_db () , который вызывает различные функции в libpwdb , которые выЯ должен добавить его в ваш проект как зависимость.
При этом я виновен в том, что написал пару утилит для анализа баз данных passwd и shadow и их прямого изменения.Это работало нормально, но это было на встроенной системе, где я мог жестко контролировать все.Мне не пришлось беспокоиться о таких вещах, как условия гонки, когда другие программы модифицировали базу данных passwd.
Если вам нужно добавить группу, то же самое касается базы данных group .