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);

Спасибо!

8
задан James Moore 30 June 2010 в 08:31
поделиться

3 ответа

Я заметил, что большинство основных утилит, которые добавляют и изменяют пользователей, делают это напрямую, часто разными способами. Функции, которые вы можете использовать для изменения passwd и теневых файлов, представлены в и в и они являются частью glibc .

fgetpwent , getpwnam , getpw , getpwent_r , putpwent , set Wepwent

в качестве примера, как это делает busybox (через TinyLogin ). В busybox / loginutils / adduser.c они помещают пользователя в файл passwd, создавая структуру passwd, а затем вызывают putpwent . Для добавления пароля пользователя в теневой файл они просто вызывают fprintf и напрямую записывают строку.

Для аутентификации пользователей современным способом существует Linux-PAM . Но что касается добавления пользователей, вы можете увидеть в pam_unix_passwd.c , что они вызывают unix_update_db () , который вызывает различные функции в libpwdb , которые вы должны необходимо добавить в качестве зависимости к вашему проекту, если вы его используете.

При этом я виноват в том, что написал пару утилит для анализа паролей и теневых баз данных и их непосредственного изменения. Он работал нормально, но это было во встроенной системе, где я мог все жестко контролировать. Мне не приходилось беспокоиться о таких вещах, как условия гонки с другими программами, изменяющими passwd db.

Если вам нужно добавить группу, то же самое относится и к базе данных групп .

6
ответ дан 5 December 2019 в 12:07
поделиться

Вы можете попробовать использовать библиотеку libuser .

Одним из приложений, распространяемых с libuser, является luseradd , программа, которая выглядит как кроссплатформенная утилита useradd . По своей сути luseradd использует функцию libuser lu_user_add для физического создания пользователя.

См. Документацию в папке docs / html в исходном дистрибутиве.

5
ответ дан 5 December 2019 в 12:07
поделиться

Добавление пользователя слишком высокоуровнево для того, чтобы для него мог быть системный вызов. Насколько мне известно, для этого тоже нет широко используемых библиотек. Лучше всего, вероятно, будет использовать системный вызов для вызова программы useradd с соответствующими параметрами.

3
ответ дан 5 December 2019 в 12:07
поделиться