C++ добавить пользователя Linux
Какой лучший способ добавить пользователя / группу в Linux с помощью C++, есть ли библиотека, к которой я могу обратиться? Я не хочу начинать делать такие вещи, как:
fopen("/etc/passwd", "a");
fprintf(tmp, "%s:x:%d:1:%s:/%s/%s:/bin/ksh\n", username, usernumber, commentfield, userdir, username);
fclose(tmp);
fopen("/etc/shadow", "a");
fprintf(stmp, "%s:*LK*:::::::\n", username);
fclose(stmp);
Спасибо!
3 ответа
Я заметил, что большинство основных утилит, которые добавляют и изменяют пользователей, делают это напрямую, часто по-разному. Функции, которые вы можете использовать для изменения файлов passwd и shadow, доступны в <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.
Если вам нужно добавить группу, то же самое касается базы данных группы.
Вы можете попробовать использовать библиотеку libuser.
Одним из приложений, распространяемых вместе с libuser, является luseradd
программа, которая кажется кроссплатформенной useradd
полезность. В его ядре, luseradd
использует libuser's lu_user_add
функция для физического создания пользователя.
Увидеть docs/html
папка в исходном дистрибутиве для документации.
Добавление пользователя является слишком высоким уровнем для системного вызова. Насколько я знаю, для этого также нет широко используемых библиотек. Лучше всего будет использовать system
призыв, чтобы вызвать useradd
Программа с соответствующими настройками.