Проверка sudoers

Системные сервисы и системы инициализации: systemd, sysvinit и другие


Ответить
rutgerg
Сообщения: 139
Зарегистрирован: 04.09.2022

#

Добрый вечер. Система работает нормально, но при проверке синтаксиса sudoers выдаёт:
~  sudo visudo -c
[sudo] пароль для ......
/etc/sudoers: успешно обработан
/etc/sudoers.d/05_proxy: некорректные права доступа, должны быть 0440


Настораживает последняя строка. Или можно проглотить это. sudo работает нормально.
Может кто сталкивался с этим явлением.
rutgerg
Сообщения: 139
Зарегистрирован: 04.09.2022

#

Извините, ложная тревога. Разобрался. В папке /etc/sudoers.d/ создался пустой текстовый файл 05_proxy. Видимо остаток от прошлых "танцев с бубном".
После его удаления всё нормализовалось.
BendalfRU
Сообщения: 334
Зарегистрирован: 07.07.2025

#

Во избежание ошибок в будущем делюсь двумя сценариями:
1. проверяет существование заданного файла;
2. если существует, то открывает его временную копию, ;
3. иначе создаёт целевой файл и открывает его временную копию ;
4. выставляет правильные права, перемещает в целевую директорию.

параметром служит целевой файл.
остальные переменные забиты в заголовке сценария.
#!/bin/bash

# --- Настройки ---
##/etc/sudoers.d/
DEST_DIR="/path/to/target"  # Целевая директория
PERMS="0440"                 # Права доступа
EDITOR_BIN="nano"           # Редактор (vim, nano, gedit)

# --- Логика ---
TARGET_FILE="$1"
DEST_PATH="$DEST_DIR/$TARGET_FILE"

if [ -z "$TARGET_FILE" ]; then
    echo "Ошибка: укажите имя файла."
    exit 1
fi

# Создаем временный файл
TMP_FILE=$(mktemp /tmp/workfile.XXXXXX)

# Проверяем существование оригинала
if [ -f "$DEST_PATH" ]; then
    cp "$DEST_PATH" "$TMP_FILE"
else
    touch "$TMP_FILE"
fi

# Открываем копию для редактирования
$EDITOR_BIN "$TMP_FILE"

# Установка прав и перемещение в целевую директорию
chmod "$PERMS" "$TMP_FILE"
mkdir -p "$DEST_DIR"
mv "$TMP_FILE" "$DEST_PATH"

echo "Готово: $DEST_PATH"

Последний раз редактировалось BendalfRU 23.04.2026 05:14, всего редактировалось 3 раза.

CPU AMD Phenom(tm) II X4 955 3200МГЦ, 10ГБ ДДР2, GA-MA770-UD3 (Rev. 2.0, bios fj),
АМД Sapphire Radeon HD 4670, hdd ide ata5 120GB+200GB, net rtl8169, audio Creative Labs CA0106.

BendalfRU
Сообщения: 334
Зарегистрирован: 07.07.2025

#

Более гибкий вариант и можно вшить любые действия прямо в тело или чз include другого сценария.

С таким сценарием вы всегда соблюдёте права доступа, которые вы почему-то забыли.
Непосредственно редактируется безопасная копия,
что предотвращает конфликт на работающей машине, когда вы сохраняете промежуточный результат.
Для каждой цели (sudoers, www, ftp, ssh, email, ...) сделайте файл с характерным именем и
укажите в нём заранее права и путь к папке.
#!/bin/bash
## Параметром служит целевой файл.
# --- Настройки ---
DEST_DIR="/etc/sudoers.d/"  # Пример защищенной директории, укажите свою.
PERMS="0440" # укажите права здесь
EDITOR_BIN="nano"  # ваш любимый редактор nano, vim, orbiton, mcedit, helix, ...

# --- Логика ---
TARGET_FILE="$1"
DEST_PATH="$DEST_DIR/$TARGET_FILE"

[[ -z "$TARGET_FILE" ]] && { echo "Использование: $0 имя_файла"; exit 1; }

TMP_FILE=$(mktemp /tmp/workfile.XXXXXX)

# Проверка существования через case
case $(test -f "$DEST_PATH"; echo $?) in
    0)
        cp "$DEST_PATH" "$TMP_FILE"
        ;;
    1)
        touch "$TMP_FILE"
        ;;
esac

# Редактируем (права sudo здесь не нужны, файл в /tmp принадлежит вам)
$EDITOR_BIN "$TMP_FILE"

# Устанавливаем права заранее
chmod "$PERMS" "$TMP_FILE"

# Проверка прав на запись в целевую директорию
if [ -w "$DEST_DIR" ] || [ ! -d "$DEST_DIR" ]; then
    mkdir -p "$DEST_DIR"
    mv "$TMP_FILE" "$DEST_PATH"
else
    echo "Требуются права суперпользователя для записи в $DEST_DIR"
    sudo mkdir -p "$DEST_DIR"
    sudo mv "$TMP_FILE" "$DEST_PATH"
    # Восстанавливаем владельца (опционально, обычно root при sudo)
    sudo chown root:root "$DEST_PATH" 
fi

echo "Выполнено: $DEST_PATH"
ОПИСАНИЕ РАБОТЫ СЦЕНАРИЯ
Cкрытый текст
ОПИСАНИЕ РАБОТЫ СЦЕНАРИЯ
НАСТРОЙКИ: В этой части задаются глобальные переменные.
Вы можете изменить DEST_DIR для смены папки назначения или PERMS для управления доступом.

ИНИЦИАЛИЗАЦИЯ: Скрипт принимает ровно один параметр — имя файла. Если параметр пуст, выполнение прекращается.

ПРОВЕРКА_SUDO: Скрипт проверяет идентификатор пользователя (EUID).
Если это не 0 (root), работа прерывается, так как установка владельца и запись в системные папки требуют высших прав.

ПОДГОТОВКА_КОПИИ: С помощью конструкции case проверяется код возврата команды test -f.
При успехе (0) содержимое оригинала копируется в /tmp, при отсутствии (1) создается пустой временный файл.

РЕДАКТИРОВАНИЕ: Запускается выбранный редактор для правки именно временной копии.
Это защищает оригинальный файл от повреждения в процессе записи.

ВАЛИДАЦИЯ: Проверка флагом -s. Если после выхода из редактора файл оказался пустым, скрипт считает это ошибкой и не заменяет оригинал.

ЗАВЕРШЕНИЕ: Финальный этап.
Скрипт принудительно устанавливает владельца и права на временный файл,
после чего атомарно перемещает его в целевую директорию.
Если кому-то интересно, давайте сделаем более продвинутый
и красиво оформленный вариант с документацией,
улучшения предлагайте пожалуйста
Последний раз редактировалось BendalfRU 23.04.2026 07:04, всего редактировалось 4 раза.

CPU AMD Phenom(tm) II X4 955 3200МГЦ, 10ГБ ДДР2, GA-MA770-UD3 (Rev. 2.0, bios fj),
АМД Sapphire Radeon HD 4670, hdd ide ata5 120GB+200GB, net rtl8169, audio Creative Labs CA0106.

rutgerg
Сообщения: 139
Зарегистрирован: 04.09.2022

#

BendalfRU, спасибо конечно за помощь, но я попробывал немного полегче вариант.
Создал пустой текстовый файл sysctl в /etc/sudoers.d/. Опять при проверке sudo visudo -c ошибка "некорректные права доступа, должны быть 0440".
Решил поробывать pkexec chmod 0440 /etc/sudoers.d/sysctl.
Помогло. Ошибка при проверке исчезла. Вопрос уже в другом: почему этот глюк с правами доступа происходит? Хотя система продолжает отлично работать и ошибка, по сути, видна только при проверке синтаксиса. Пока ответа в инете не нашёл.
BendalfRU
Сообщения: 334
Зарегистрирован: 07.07.2025

#

rutgerg:Решил поробывать pkexec chmod 0440 /etc/sudoers.d/sysctl.
Вам виднее,
со скриптом https://archlinux.com.ru/forum/viewtopi ... 326#p12326
вам не надо беспокоится или отдельные команды, он всё помнит и делает за вас,
когда вы сделали как написано.

CPU AMD Phenom(tm) II X4 955 3200МГЦ, 10ГБ ДДР2, GA-MA770-UD3 (Rev. 2.0, bios fj),
АМД Sapphire Radeon HD 4670, hdd ide ata5 120GB+200GB, net rtl8169, audio Creative Labs CA0106.

rutgerg
Сообщения: 139
Зарегистрирован: 04.09.2022

#

BendalfRU: со скриптом https://archlinux.com.ru/forum/viewtopi ... 326#p12326
вам не надо беспокоится или отдельные команды, он всё помнит и делает за вас,
когда вы сделали как написано.
А как обозвать скрипт, где его расположить, как запускать (автозагрузка при запуске, или ещё как)????? И наконец: Каков источник сего?
BendalfRU
Сообщения: 334
Зарегистрирован: 07.07.2025

#

rutgerg: А как обозвать скрипт, где его расположить, как запускать (автозагрузка при запуске, или ещё как)????? И наконец: Каков источник сего?
измените путь и права в скрипте, имя скрипта, если у вас другое место

К примеру, вы редактируете что0то в /etc/sudoers.d/, :
*обзовите его sudo-edit.sh или как нравится , дайте права на исполнение chmod +x ./sudo-edit.sh ;
*общепринятое место для таких вещей /usr/local/bin/ , тогда вам не надо указывать путь при запуске, только имя;
*имя скрипта руками в терминал вводите и сразу после имени скрипта
укажите желаемое имя файла вот так,
sudo-edit 05_proxy
, жмите enter кнопку;
*если вам непременно надо pkexec, то допишите его в скрипте ;
*если вам необходим автоматический запуск, то пригодится задание cron или сервис systemd ;
*источник я, сам написал;
Последний раз редактировалось BendalfRU 23.04.2026 07:34, всего редактировалось 3 раза.

CPU AMD Phenom(tm) II X4 955 3200МГЦ, 10ГБ ДДР2, GA-MA770-UD3 (Rev. 2.0, bios fj),
АМД Sapphire Radeon HD 4670, hdd ide ata5 120GB+200GB, net rtl8169, audio Creative Labs CA0106.

rutgerg
Сообщения: 139
Зарегистрирован: 04.09.2022

#

BendalfRU, спасибо. Будем посмотреть. Позже, если что, отпишусь.
Ответить