Далі йдеться про випадок, коли ви хочете запустити команду без пароля, лише якщо вона має певний набір опцій, де частина параметрів є змінною . 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?