Вопрос или проблема
Например, о группах. Я хочу получить 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
имеет структурированный формат.
Шаги для программы
- Подготовка структуры
group
для новой группы. - Запись этой информации в файл
/etc/group
. - (Опционально) Добавление нового пользователя в созданную группу.
Пример кода для добавления группы
#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;
}
Объяснение кода
- Открываем файл
/etc/group
в режиме добавления ("a"
). Это необходимо для того, чтобы не перезаписывать существующие данные. - Формируем строку, соответствующую новому формату группы. Строка содержит: имя группы, пароль (обычно ‘x’), GID и завершающий символ новой строки.
- Используем
fputs()
для записи строки в файл. - Закрываем файл и возвращаем статус успешного выполнения операции.
Добавление нового пользователя (опционально)
С помощью аналогичного подхода можно программно добавлять пользователей, однако вам нужно будет модифицировать файл /etc/passwd
и, возможно, /etc/shadow
. Это требует уверенности в вашем коде, так как ошибочная запись может сделать систему небезопасной или даже недоступной.
Для создания нового пользователя вам нужно будет следовать той же структуре данных, что и для групп, добавляя запись в /etc/passwd
и /etc/shadow
, используя аналогичный подход.
Обратите внимание
- Убедитесь, что у вашего приложения есть достаточные привилегии (например, запустите от имени суперпользователя).
- Всегда делайте резервные копии системных файлов перед их изменением.
- В большинстве современных систем есть API или библиотеки (например,
libuser
илиuseradd
), которые могут упростить эти операции и гарантировать их безопасность.
Этот подход требует аккуратного обращения и понимания механизмов управления пользователями и группами в Unix-подобных операционных системах.