Можно ли добавить пользователя в группу Linux, программно, когда я запускаю свою программу? Я использую C++. Я знаю, что это можно сделать с помощью оболочки, но мне нужно сделать это в моей программе на C++, но я не знаю, что использовать.C++ Как я могу добавить пользователя linux в группу программно
ответ
Эта задача решена многими программами управления конфигурацией. For example in Salt:
def adduser(name, username):
on_redhat_5 = __grains__.get('os_family') == 'RedHat' and __grains__.get('osmajorrelease') == '5'
if __grains__['kernel'] == 'Linux':
if on_redhat_5:
cmd = 'gpasswd -a {0} {1}'.format(username, name)
else:
cmd = 'gpasswd --add {0} {1}'.format(username, name)
else:
cmd = 'usermod -G {0} {1}'.format(name, username)
retcode = __salt__['cmd.retcode'](cmd, python_shell=False)
return not retcode
Как вы можете видеть, используются команды операционной системы. Какой из них зависит от того, какая операционная система это :)
Вы могли бы принять 2 подхода:
- Используйте систему() для выполнения команды оболочки, чтобы сделать работу.
- Непосредственно модифицируйте файл/etc/group. Должно быть довольно легко найти строку, содержащую группу, которую вы хотите добавить, а затем добавить пользователя, который вы хотите добавить в конец (обязательно добавьте запятую, если уже есть член группы).
Учитывая выбор, я бы, вероятно, использовал первый вариант из вышеперечисленного.
EDIT: Как отметил @DevSolar в своем комментарии, этот ответ предполагает, что ваша система использует стандартную локальную аутентификацию с использованием файлов passwd/shadow/group в/etc. Если ваша система НЕ использует локальную аутентификацию, то это совершенно другая игра в мяч.
Обратите внимание, что членство в группе не * обязательно * обрабатывается '/ etc/group'. (Настройки LDAP auth настроены на ум.) Кроме того, для редактирования '/ etc/group' требуется root-доступ, в то время как, например, 'adduser' может быть доступен через' sudoers'. – DevSolar
К сожалению, для этого требуется ** sudo **, однако у моего приложения нет носителя, в котором пользователь может добавить пароль для ** sudo **. Есть ли обходной путь для этого? –
Возможно, вы можете использовать libexpect для передачи пароля sudo: [ссылка] (http://linux.die.net/man/3/libexpect) –
Возможны два варианта Jared Sutton, но я хотел бы указать, что вам не нужно самостоятельно выполнять редактирование /etc/group
, если вы используете существующую библиотеку.
Я знаю, по крайней мере, busybox, который реализовал это. Там есть функция, определенная в libbb/update_passwd.c
int update_passwd(const char *filename, // /etc/group
const char *name, // username
const char *new_passwd, // nullptr
const char *member) // groupname
Если вы хотите осуществить это самостоятельно, то вы можете проверить, как работает их функция.
Поскольку вы используете Linux, большинство инструментов пространства пользователя являются open-source, а исходный источник доступен, например, инструмент командной строки 'adduser'. Вы можете узнать, из какого пакета он пришел, и проверить источник, как это делается. –