2015-11-11 3 views
2

Можно ли добавить пользователя в группу Linux, программно, когда я запускаю свою программу? Я использую C++. Я знаю, что это можно сделать с помощью оболочки, но мне нужно сделать это в моей программе на C++, но я не знаю, что использовать.C++ Как я могу добавить пользователя linux в группу программно

+0

Поскольку вы используете Linux, большинство инструментов пространства пользователя являются open-source, а исходный источник доступен, например, инструмент командной строки 'adduser'. Вы можете узнать, из какого пакета он пришел, и проверить источник, как это делается. –

ответ

0

Эта задача решена многими программами управления конфигурацией. 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

Вы могли бы принять 2 подхода:

  1. Используйте систему() для выполнения команды оболочки, чтобы сделать работу.
  2. Непосредственно модифицируйте файл/etc/group. Должно быть довольно легко найти строку, содержащую группу, которую вы хотите добавить, а затем добавить пользователя, который вы хотите добавить в конец (обязательно добавьте запятую, если уже есть член группы).

Учитывая выбор, я бы, вероятно, использовал первый вариант из вышеперечисленного.

EDIT: Как отметил @DevSolar в своем комментарии, этот ответ предполагает, что ваша система использует стандартную локальную аутентификацию с использованием файлов passwd/shadow/group в/etc. Если ваша система НЕ использует локальную аутентификацию, то это совершенно другая игра в мяч.

+0

Обратите внимание, что членство в группе не * обязательно * обрабатывается '/ etc/group'. (Настройки LDAP auth настроены на ум.) Кроме того, для редактирования '/ etc/group' требуется root-доступ, в то время как, например, 'adduser' может быть доступен через' sudoers'. – DevSolar

+0

К сожалению, для этого требуется ** sudo **, однако у моего приложения нет носителя, в котором пользователь может добавить пароль для ** sudo **. Есть ли обходной путь для этого? –

+0

Возможно, вы можете использовать libexpect для передачи пароля sudo: [ссылка] (http://linux.die.net/man/3/libexpect) –

0

Возможны два варианта 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 

Если вы хотите осуществить это самостоятельно, то вы можете проверить, как работает их функция.