Далі йдеться про випадок, коли ви хочете запустити команду без пароля, лише якщо вона має певний набір опцій, де частина параметрів є змінною . AFAIK неможливо використовувати змінні чи діапазони значень у деклараціях судоерів, тобто ви можете дозволити доступ явно до, command option1але не command option2використовуючи:
user_name ALL=(root) /usr/bin/command option1
але якщо структура там command option1 value1, де value1може змінюватися, вам потрібно мати чіткі рядки судерів для кожного можливого значення value1. Шрифт Shell забезпечує спосіб його обійти.
Ця відповідь була натхненна відповіддю М. Ахмада Зафара і вирішує питання безпеки там.
- Створіть скрипт оболонки, куди ви викличете команду без
sudo.
- Збережіть скрипт у привілейованій кореневій папці (наприклад
/usr/local/bin/), зробіть файл root-власником (наприклад chown root:wheel /usr/local/bin/script_name) без доступу для запису для інших (наприклад chmod 755 /usr/local/bin/script_name).
Додайте виняток до судорів за допомогою visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.
Запустіть свій сценарій sudo script_name.
Наприклад, я хочу змінити час очікування режиму сну на екрані в macOS. Це робиться за допомогою:
sudo pmset displaysleep time_in_minutes
Я вважаю, що зміна часу очікування невинної дії, яке не виправдовує клопоту введення пароля, але pmsetможе зробити багато речей, і я хотів би зберегти ці інші речі за паролем sudo.
Тож у мене є такий сценарій /usr/local/bin/ds:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
У кінці sudoersфайлу я маю такий рядок:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
Щоб встановити час очікування на 3 хвилини, я запускаю свій скрипт із звичайного облікового запису користувача user_name:
sudo ds 3
PS Більшість мого сценарію - це перевірка вводу, яка не є обов'язковою, тому працює також наступне:
#!/bin/bash
pmset displaysleep $1
/path/to/my/programбув сценарій python?