С таким сценарием вы всегда соблюдёте права доступа, которые вы почему-то забыли.
Непосредственно редактируется безопасная копия,
что предотвращает конфликт на работающей машине, когда вы сохраняете промежуточный результат.
Для каждой цели (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 ;