С таким сценарием вы всегда соблюдёте права доступа, которые вы почему-то забыли.
Непосредственно редактируется безопасная копия,
что предотвращает конфликт на работающей машине, когда вы сохраняете промежуточный результат.
Для каждой цели (sudo, www,ftp, ...) сделайте файл с характерным именем и пропишите заранее права.
ОПИСАНИЕ РАБОТЫ СЦЕНАРИЯ
НАСТРОЙКИ: В этой части задаются глобальные переменные. Вы можете изменить DEST_DIR для смены папки назначения или PERMS для управления доступом.
ИНИЦИАЛИЗАЦИЯ: Скрипт принимает ровно один параметр — имя файла. Если параметр пуст, выполнение прекращается.
ПРОВЕРКА_SUDO: Скрипт проверяет идентификатор пользователя (EUID). Если это не 0 (root), работа прерывается, так как установка владельца и запись в системные папки требуют высших прав.
ПОДГОТОВКА_КОПИИ: С помощью конструкции case проверяется код возврата команды test -f. При успехе (0) содержимое оригинала копируется в /tmp, при отсутствии (1) создается пустой временный файл.
РЕДАКТИРОВАНИЕ: Запускается выбранный редактор для правки именно временной копии. Это защищает оригинальный файл от повреждения в процессе записи.
ВАЛИДАЦИЯ: Проверка флагом -s. Если после выхода из редактора файл оказался пустым, скрипт считает это ошибкой и не заменяет оригинал.
ЗАВЕРШЕНИЕ: Финальный этап. Скрипт принудительно устанавливает владельца и права на временный файл, после чего атомарно перемещает его в целевую директорию.
#!/bin/bash
##COMMENTBLOCK
## Имя файла, версия, назначение кратко
### Можно вшить любые действия прямо в тело или чз include другого сценария.
## Параметром служит целевой файл.
## ------------ОГЛАВЛЕНИЕ:
## 1. [НАСТРОЙКИ] ......... Конфигурация путей и прав;
## 2. [ИНИЦИАЛИЗАЦИЯ] ..... Проверка аргументов;
## 3. [ПРОВЕРКА_SUDO] ..... Контроль привилегий;
## 4. [ПОДГОТОВКА_КОПИИ] .. Работа с временным файлом (case);
## 5. [РЕДАКТИРОВАНИЕ] .... Запуск редактора;
## 6. [ВАЛИДАЦИЯ] ......... Проверка на пустоту;
## 7. [ЗАВЕРШЕНИЕ] ........ Права, владелец и деплой.
##COMMENTBLOCK
## 1. [НАСТРОЙКИ];
OWNER="root:root"
DEST_DIR="/etc/sudoers.d/" # Пример защищенной директории, укажите свою.
PERMS="0440" # укажите права здесь
EDITOR_BIN="nano" # ваш любимый редактор nano, vim, orbiton, mcedit, helix, ...
## 2. [ИНИЦИАЛИЗАЦИЯ];
TARGET_FILE="$1"
DEST_PATH="$DEST_DIR/$TARGET_FILE"
[[ -z "$TARGET_FILE" ]] && { echo "Использование: $0 имя_файла"; exit 1; }
## 3. [ПРОВЕРКА_SUDO];
if [[ $EUID -ne 0 ]]; then
echo "Ошибка: Требуются права root."
exit 1
fi
## 4. [ПОДГОТОВКА_КОПИИ];
TMP_FILE=$(mktemp /tmp/workfile.XXXXXX)
case $(test -f "$DEST_PATH"; echo $?) in
0) cp "$DEST_PATH" "$TMP_FILE" ;;
1) touch "$TMP_FILE" ;;
esac
## 5. [РЕДАКТИРОВАНИЕ];
$EDITOR_BIN "$TMP_FILE"
## 6. [ВАЛИДАЦИЯ];
if [[ ! -s "$TMP_FILE" ]]; then
echo "Ошибка: Файл пуст. Отмена."
rm -f "$TMP_FILE"
exit 1
fi
## 7. [ЗАВЕРШЕНИЕ].
mkdir -p "$DEST_DIR"
chown "$OWNER" "$TMP_FILE"
chmod "$PERMS" "$TMP_FILE"
mv "$TMP_FILE" "$DEST_PATH"
echo "Успешно: $DEST_PATH"
Инструкция по использованию
Инструкция по использованию
*Для каждой цели (sudoers, www, ftp, ssh, email, ...)
сделайте файл с характерным именем и ;
*Измените путь и права в скрипте, имя скрипта, если у вас другая папка;*К примеру, вы редактируете что0то в /etc/sudoers.d/ :
*Обзовите его sudo-edit.sh или как нравится , дайте права на исполнение chmod +x ./sudo-edit.sh ;*Общепринятое место для таких вещей /usr/local/bin/ , тогда вам не надо указывать путь при запуске, только имя;
*Имя скрипта руками в терминал вводите и сразу после имени скрипта
укажите желаемое имя файла вот так,Код:sudo-edit 05_proxy, жмите enter кнопку;
*Если вам непременно надо pkexec, то допишите его в скрипте ;
*Если вам необходим автоматический запуск, то пригодится задание cron или сервис systemd .
Если кому-то интересно, давайте сделаем более продвинутый
и красиво оформленный вариант с документацией,
улучшения предлагайте пожалуйста
Отредактировано Avenir.Sirgun (Чт, 23 Апр 2026 20:46:38)
- Подпись автора
Подпись: С уважением, Максим.
мой jabber id : maksim.nk@jabber.ru ;