= 5) { $username = $parts[0]; $uid = (int)$parts[2]; $description = $parts[4]; // Выводим root (UID 0), системных и обычных пользователей (UID >= 1000) if (($uid === 0 || $uid >= 1000) && $username !== 'nobody' || $username === 'guest' || $username === 'admin') { // Сопоставление статуса активности учетной записи $status = 'Normal'; if ($username === 'guest') { $status = 'Deactivated'; } $usersList[] = [ 'name' => $username, 'email' => '', 'desc' => $description, 'tfa' => 'Disabled', 'status' => $status ]; } } } } echo json_encode($usersList, JSON_UNESCAPED_UNICODE); exit; } // Обработка действий создания/изменения/удаления (POST) if ($_SERVER['REQUEST_METHOD'] === 'POST') { $input = json_decode(file_get_contents('php://input'), true); if (!isset($input['action'])) { echo json_encode(['success' => false, 'error' => 'Отсутствует действие']); exit; } $action = $input['action']; $username = preg_replace('/[^a-z0-9_-]/', '', $input['username'] ?? ''); $description = escapeshellarg($input['description'] ?? ''); $password = $input['password'] ?? ''; if (empty($username)) { echo json_encode(['success' => false, 'error' => 'Некорректное имя пользователя']); exit; } switch ($action) { case 'create': if (empty($username)) { echo json_encode(['success' => false, 'error' => 'Некорректное имя пользователя']); exit; } // Генерируем хэш пароля $salt = '$1$' . substr(md5(uniqid(rand(), true)), 0, 8) . '$'; $hashed_password = crypt($password, $salt); $uid_gid = rand(1100, 1900); $passwd_line = "{$username}:x:{$uid_gid}:{$uid_gid}:{$description}:/home/{$username}:/bin/bash"; $shadow_line = "{$username}:{$hashed_password}:19500:0:99999:7:::"; $group_line = "{$username}:x:{$uid_gid}:"; // Собираем все команды в одну строку для запуска через bash $system_cmd = "echo '{$passwd_line}' >> /etc/passwd && " . "echo '{$shadow_line}' >> /etc/shadow && " . "echo '{$group_line}' >> /etc/group && " . "mkdir -p /home/{$username} && " . "chown -R {$uid_gid}:{$uid_gid} /home/{$username}"; // Вызываем встроенную службу systemd-run. Флаг -G заставляет её отработать от root наружу. $cmd = "sudo /usr/bin/systemd-run -G /usr/bin/bash -c " . escapeshellarg($system_cmd) . " 2>&1"; exec($cmd, $output, $return_var); if ($return_var !== 0) { $err = implode(' ', $output); echo json_encode(['success' => false, 'error' => "Ошибка запуска: {$err} (Код: {$return_var})"]); exit; } echo json_encode(['success' => true]); break; case 'update': // Читаем параметры из JSON-запроса от браузера $old_username = preg_replace('/[^a-z0-9_-]/', '', $input['old_username'] ?? ''); $new_description = $input['description'] ?? ''; $new_password = $input['password'] ?? ''; if (empty($old_username)) { echo json_encode(['success' => false, 'error' => 'Не указан пользователь для редактирования']); exit; } // Экранируем описание, чтобы оно не сломало синтаксис команды sed $clean_desc = str_replace('/', '\/', $new_description); // 1. Команда для обновления описания (GECOS) в /etc/passwd $update_cmd = "sed -i -E 's/^({$old_username}:[^:]*:[^:]*:[^:]*):[^:]*(:.*)/\\1:{$clean_desc}\\2/' /etc/passwd"; // 2. Если в форму ввели новый пароль — добавляем команду обновления хэша в /etc/shadow if (!empty($new_password)) { $salt = '$1$' . substr(md5(uniqid(rand(), true)), 0, 8) . '$'; $hashed_password = crypt($new_password, $salt); $clean_hash = str_replace('/', '\/', $hashed_password); $update_cmd .= " && sed -i -E 's/^({$old_username}:)[^:]*(:.*)/\\1{$clean_hash}\\2/' /etc/shadow"; } // Вызываем итоговую команду через systemd-run наружу от root $cmd = "sudo /usr/bin/systemd-run -G /usr/bin/bash -c " . escapeshellarg($update_cmd) . " 2>&1"; exec($cmd, $output, $return_var); if ($return_var === 0) { echo json_encode(['success' => true]); } else { $err = implode(' ', $output); echo json_encode(['success' => false, 'error' => "Ошибка обновления: {$err}"]); } break; case 'delete': if ($username === 'root') { echo json_encode(['success' => false, 'error' => 'Удаление root запрещено']); exit; } // Формируем команды для полной очистки записей из passwd, shadow, group и удаления папки $delete_cmd = "sed -i '/^{$username}:/d' /etc/passwd && " . "sed -i '/^{$username}:/d' /etc/shadow && " . "sed -i '/^{$username}:/d' /etc/group && " . "rm -rf /home/{$username}"; // Вызываем команду через systemd-run наружу от имени root $cmd = "sudo /usr/bin/systemd-run -G /usr/bin/bash -c " . escapeshellarg($delete_cmd) . " 2>&1"; exec($cmd, $output, $return_var); if ($return_var === 0) { echo json_encode(['success' => true]); } else { $err = implode(' ', $output); echo json_encode(['success' => false, 'error' => "Ошибка удаления: {$err}"]); } break; default: echo json_encode(['success' => false, 'error' => 'Неизвестная операция']); break; } exit; }