C ++ добавить пользователя Linux - PullRequest
8 голосов
/ 21 июня 2010

Какой лучший способ добавить пользователя / группу в 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 ]

6 голосов
/ 21 июня 2010

Я заметил, что большинство основных утилит, которые добавляют и изменяют пользователей, делают это напрямую, часто по-разному.Функции, которые вы можете использовать для изменения 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 .

5 голосов
/ 21 июня 2010

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

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

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

3 голосов
/ 21 июня 2010

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

...