Как создать пользователя/группу в C?

Вопрос или проблема

Например, о группах. Я хочу получить name группы, имея GID для группы:

struct group *grp = getgrgid(1);
printf("%d\n",grp->gr_name);

Вывод будет:

daemon

Хорошо.

Но если я попытаюсь получить несуществующую группу, getgrgid() вернёт NULL.

Как я могу добавить нового пользователя/группу, чтобы он вернул мою новую struct group?

П.С. Пожалуйста, не говорите о командах в bash, таких как adduser или groupadd. Я хочу увидеть ТОЛЬКО программное решение.

Ответ или решение

Создание пользователя или группы в C программно связано с манипуляцией с системными вызовами и структурами данных, которые управляют аккаунтами пользователей и группами в Unix-подобных операционных системах. Следует отметить, что для выполнения данных операций ваша программа должна иметь соответствующие привилегии.

Добавление новой группы

Для добавления новой группы вам необходимо создать запись в файле /etc/group, где хранятся данные о группах. В Unix-подобной системе файл group имеет структурированный формат.

Шаги для программы

  1. Подготовка структуры group для новой группы.
  2. Запись этой информации в файл /etc/group.
  3. (Опционально) Добавление нового пользователя в созданную группу.

Пример кода для добавления группы

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_LENGTH 1024

int main() {
    const char *group_name = "my_new_group";
    const char *group_passwd = "x";  // Обычно это 'x' или пустая строка
    gid_t group_gid = 1002;  // Убедитесь, что это GID не занят

    FILE *fp = fopen("/etc/group", "a");
    if (fp == NULL) {
        perror("Ошибка открытия файла /etc/group");
        return EXIT_FAILURE;
    }

    // Создаем строку для новой группы
    char line[MAX_LINE_LENGTH];
    snprintf(line, sizeof(line), "%s:%s:%d:\n", group_name, group_passwd, group_gid);

    // Записываем строку в файл
    if (fputs(line, fp) == EOF) {
        perror("Ошибка записи в файл /etc/group");
        fclose(fp);
        return EXIT_FAILURE;
    }

    fclose(fp);
    printf("Группа %s успешно добавлена!\n", group_name);
    return EXIT_SUCCESS;
}

Объяснение кода

  1. Открываем файл /etc/group в режиме добавления ("a"). Это необходимо для того, чтобы не перезаписывать существующие данные.
  2. Формируем строку, соответствующую новому формату группы. Строка содержит: имя группы, пароль (обычно ‘x’), GID и завершающий символ новой строки.
  3. Используем fputs() для записи строки в файл.
  4. Закрываем файл и возвращаем статус успешного выполнения операции.

Добавление нового пользователя (опционально)

С помощью аналогичного подхода можно программно добавлять пользователей, однако вам нужно будет модифицировать файл /etc/passwd и, возможно, /etc/shadow. Это требует уверенности в вашем коде, так как ошибочная запись может сделать систему небезопасной или даже недоступной.

Для создания нового пользователя вам нужно будет следовать той же структуре данных, что и для групп, добавляя запись в /etc/passwd и /etc/shadow, используя аналогичный подход.

Обратите внимание

  • Убедитесь, что у вашего приложения есть достаточные привилегии (например, запустите от имени суперпользователя).
  • Всегда делайте резервные копии системных файлов перед их изменением.
  • В большинстве современных систем есть API или библиотеки (например, libuser или useradd), которые могут упростить эти операции и гарантировать их безопасность.

Этот подход требует аккуратного обращения и понимания механизмов управления пользователями и группами в Unix-подобных операционных системах.

Оцените материал
Добавить комментарий

Капча загружается...