Як запустити конкретну програму як root без запиту пароля?


169

Мені потрібно запустити щось як sudo без пароля, тому я використав це visudoі додав у свій sudoersфайл:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Потім я спробував це:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Чому він запитує пароль? Як я можу запускати / використовувати команди як root із користувачем, котрий не має кореня, не запитуючи пароль?

Відповіді:


91

У вас є ще один запис у sudoersфайлі, який також відповідає вашому користувачеві. NOPASSWDПравило повинне бути після цього один для того , щоб мати пріоритет.

Зробивши це, вам sudoбуде запропоновано ввести пароль, як правило, для всіх команд, за винятком того /path/to/my/program, який він завжди дозволить вам запустити, не запитуючи пароль.


6
це все-таки спрацює, якби /path/to/my/programбув сценарій python?
sadmicrowave

Чи може програма замість цього бути псевдонімом, встановленим для bash (тобто в .bashrc)? Або навіть сценарій оболонки всередині /usr/local/sbin? Щоб спробувати.
Нікос Олександріс

Нікос - ні, це не може бути псевдонімом. Він повинен вказувати на реальний шлях.
Пол Хеддерлі

судори? де? важко використовувати свою відповідь (
Василь Суріцов

@VasiliiSuricov: Це зазвичай є /etc, але деякі системи ставлять його в іншому місці. Якщо ви не можете його знайти, спробуйте man sudoers. Місцеве розташування цього файлу має бути замінене на manсторінку під час sudoстворення цієї системи.
Воррен Янг

135

Якщо в ньому є декілька відповідних записів /etc/sudoers, sudo використовує останній. Тому, якщо ви можете виконати будь-яку команду із запитом пароля, і ви хочете мати можливість виконувати певну команду без запиту пароля, вам потрібно останнє виключення.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Зверніть увагу на використання програми (root), щоб програма могла запускатися як root, але не як інші користувачі. (Не давайте більше дозволів, ніж необхідний мінімум, якщо ви не продумали наслідки.)

Примітка для читачів, які не працюють з Ubuntu або які змінили конфігурацію sudo за замовчуванням (Sudo Ubuntu за замовчуванням нормально) : Запуск скриптів оболонки з підвищеними привілеями ризиковано, потрібно починати з чистого середовища (як тільки оболонка запущена, занадто пізно (див. Дозволити налаштування сценаріїв оболонок ), тому вам потрібно подбати про це судо). Переконайтеся , що у вас є Defaults env_resetв /etc/sudoersабо що цей параметр під час компіляції по замовчуванням ( sudo sudo -V | grep envповинен включати Reset the environment to a default set of variables).


3
ex to root root from jhon with sudo su a no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac

5
@adrian Якщо ви хочете дозволити довільні команди як root, зробіть це john ALL=(ALL) NOPASSWD: all. Немає сенсу йти через su.
Жиль

Питання: чи варто змінювати дозволи мого скрипта оболонки, щоб він міг змінюватись та читатись лише користувачем root для безпеки? Я думаю про зловмисника, який модифікує сценарій, який має всі дозволи, надані без необхідності пароля, щоб він робив те, що йому хочеться. Очевидно, що зловмисник навіть не може прочитати файл sudoers, щоб знати, які сценарії мають цю привілей, але все-таки може спробувати всі мої власні скрипти, як тільки він знайде папку, в якій вони зберігаються, сподіваючись, що це дозволено, чи щось подібне .
Джефрі Лебовський

1
@JeffreyLebowski Якщо у вас є правило sudo, яке запускає скрипт (прямо чи опосередковано), то дуже важливо, щоб тільки root (або люди, у яких так чи інакше є кореневі привілеї) могли писати у файл сценарію та до каталогу, що містить файл сценарію, і до його батьківський каталог тощо. Не має значення, що хтось може прочитати файл сценарію (якщо він не містить пароля чи чогось іншого, але це погана ідея. Якщо є пароль, він повинен бути у власному файлі, інакше є занадто великий ризик випадкового його витоку, наприклад, від копіюйте вставку цього розділу коду у запитанні на цьому веб-сайті).
Жил

1
@alper Ні. Дуже мало речей потребує перезавантаження. Після зміни sudoersвам не потрібно робити нічого особливого: sudoперевіряти це щоразу.
Жиль

24

ПОПЕРЕДЖЕННЯ : Ця відповідь вважається небезпечною. Дивіться коментарі нижче

Повне рішення: Наступні кроки допоможуть вам досягти бажаного результату:

  1. Створіть новий файл сценарію (замініть create_dir.shпотрібним ім'ям сценарію):

    vim ~/create_dir.sh
    

    Сценарій буде створений у домашньому каталозі користувача

  2. Додайте кілька команд, які може виконувати лише користувач rootабо sudoкористувач, як-от створити папку на рівні кореневого каталогу:

    mkdir /abc
    

    Примітка. Не додайте sudoдо цих команд. Збереження та вихід (за допомогою :wq!)

  3. Призначте для нього виконання дозволів, використовуючи:

    sudo chmod u+x create_dir.sh
    
  4. Внесіть зміни, щоб цей скрипт не потребував пароля.

    1. Відкрийте sudoersфайл:

      sudo visudo -f /etc/sudoers
      
    2. Додайте наступний рядок наприкінці:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Замініть ahmadбудь-яким вашим ім'ям користувача. Також переконайтеся, що це останній рядок. Збережіть і вийдіть.

  5. Тепер при запуску команди додайте sudoперед цим, як:

    sudo ./create_dir.sh
    

    Це запустить команди всередині файлу сценарію, не запитуючи пароль.

Виконайте прості кроки, згадані тут http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


Було б краще, якщо ви вказали відповідні кроки тут і використали посилання як резервну копію для отримання більш детальної інформації. Таким чином ваша відповідь зберігає можливе значення, навіть якщо це посилання більше не буде дійсним.
Антон

15
Ця порада небезпечна. sudoЧастина sudo chmod u+x create_dir.shє непотрібною , оскільки користувач має (імовірно) право власності на його / її домашню директорію. Оскільки користувач може писати на нього create_dir.sh, ви фактично надали йому безкоштовну кореневу оболонку.
Лекенштейн

1
@Lekensteyn Що означає також для будь-якої програми, що працює як користувач. Можна також просто дозволити користувачеві запускати що-небудь із судо без пароля.
пидсигнар

2
Я щось пропускаю? Я вважаю, що все chmodце непотрібне, оскільки ви покладаєтесь на sudoпідвищення своїх привілеїв.
G-Man

10

Я думаю, що ваш синтаксис неправильний. Принаймні, я використовую наступне, що працює для мене:

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
(ALL)Частина є необов'язковою, в результаті чого його має точно такий же ефект. Маючи (root)б краще , хоча, але його відсутність не пояснює цю проблему.
Жиль

+1 для sudo для цієї команди та нічого іншого! Немає причин зламати всю систему ...
Йоган

3
@Johan: Про це вже було питання.
Жиль

5

Якщо ви хочете уникнути необхідності використовувати sudo, а також не змінювати конфігураційний файл sudoers, ви можете використовувати:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Це змусить команду виконуватись як root без необхідності sudo.


Нічого раніше, я ніколи не чув про це рішення, болісно
щось щось

Чому мені потрібно прокрутити донизу ці речі, щоб знайти найкращу відповідь? Дякуємо за це просте безпечне рішення.
RyanNerd

5

Якщо у вас є дистрибутив, як Manjaro, вам слід спочатку розібратися з файлом, який перекриває визначення / etc / sudoers, ви можете видалити його або працювати безпосередньо з цим файлом, щоб додати ваші нові конфігурації.

Цей файл:

sudo cat /etc/sudoers.d/10-installer

ТІЛЬКИ спосіб бачити це під кореневими привілеями, ви не можете перерахувати цей каталог без нього, цей файл специфічний для Manjaro, ви можете знайти цю конфігурацію з іншим іменем, але в тому самому каталозі.

У вибраний файл ви можете додати наступні рядки, щоб отримати потрібну конфігурацію:

Ігноруйте автентифікацію для групи

%group ALL=(ALL) NOPASSWD: ALL

або Ігнорувати автентифікацію для користувача

youruser ALL=(ALL) NOPASSWD: ALL

або Ігнорувати автентифікацію виконуваним файлом для конкретного користувача

youruser ALL=(ALL) NOPASSWD: /path/to/executable

ШВИДКА ПРИМІТКА. Ви відкриваєте двері для використання SUDO без автентифікації, це означає, що ви можете запускати все, що модифікує все з вашої системи, і використовувати це з відповідальністю.


4

Переконайтеся, що судо не є пристрасним. Бігайте так

/usr/bin/sudo /path/to/my/program

Наприклад псевдонім оболонки, як цей:

alias sudo="sudo env PATH=$PATH"

може спричинити таку поведінку.


Ви маєте рацію, мій коментар був з того тут , вибачте за це. Тим не менш мене заінтригує - як ви очікуєте, щоб псевдонім змінив обробку sudoersна sudo. Або ви говорите про переспрямування sudoна щось, що завжди друкує це повідомлення про помилку, щоб отримати паролі? Це навряд чи має місце тут ...
peterph

2
У мене були ті ж проблеми, що і в ОП. Виявилося, що це було alias sudo="sudo env PATH=$PATH"в моєму ~/.bashrc. Замість того, щоб просто вирішити це для себе і сліпо просто займатися своєю справою, я подав свою відповідь як можливе рішення для всіх інших, хто йде по цій темі.
Сеперо

1
Це нормально, але коли це не очевидно (що в даному випадку не принаймні для деяких людей), то добре поставити пояснення у відповідь, щоб надати певний контекст і не дати людям сліпо використовувати магічні заклинання. +2 (- (- 1) + +1). :)
петерф

2

Під час виконання сценарію потрібно запустити його як sudo /path/to/my/script.

Редагувати: Виходячи з вашого коментаря до іншої відповіді, ви хочете запустити це з піктограми. Вам потрібно буде створити .desktopфайл, який виконує вашу програму з sudo, як і на терміналі.

Ви також можете розглянути можливість використання gtk-sudoдля візуального запиту пароля.

Вам, мабуть, слід розглянути ідею, що ви не повинні запускати речі як корінь і що зміна системи далі вниз по дорозі, так що вам зовсім не потрібні дозволи на root, було б кращим способом.


7
Не робіть сценарії оболонки налаштованими . Див. Дозволити налаштування на скриптах оболонок .
Жиль

Я думав навіть не згадувати про це, бо це такий поганий варіант. Я просто видалив його, тому що я переживаю, що цей запитувач може скористатися порадою навіть із попередженням, що це була погана порада!
Калеб

2

Це вирішило для мене проблему (також спробував деякі інші відповіді, які могли б допомогти):

Сценарій, до якого я дзвонив, знаходився в /usr/binкаталозі, в якому я не маю дозволів на запис (хоча я зазвичай можу читати там будь-які файли). Сценарій був chmodded + x (виконувана permisison), але він все ще не працював. Перемістивши цей файл на шлях у моєму домашньому каталозі, замість цього /usr/binя нарешті зміг викликати його sudo без введення пароля.

Також у чомусь я сумнівався (уточнюю для майбутніх читачів): Свій сценарій потрібно запускати як судо. Введіть sudoпри виклику сценарію. Не використовуйте sudoдля команди у вашому сценарії, яка фактично потребує root (міняючи підсвітку клавіатури в моєму випадку). Можливо, це теж працює, але вам цього не потрібно, і це здається кращим рішенням цього не робити.


Другий абзац мав відповідь на мою проблему
М. Ахмад Зафар

@MuhammadAhmadZafar Рада, що це допомогло!
Люк

3
Насправді використання sudoвсередині скрипту ідеально чудово за умови, що у вас є відповідні права (встановлені sudoers) для запуску відповідної команди без пароля. Це робить речі трохи більш безпечними.
петерф

справді можна використати цю відповідь, переписану як поетапно "це так, як ти це робиш", а не як діалог з іншими відповідями
Кот Морж

@WalrustheCat Добре. Перечитавши свою відповідь, я думаю, що я, можливо, сам трохи заплутався. Хоча зараз, я не пам’ятаю, яка точна ситуація була, тому я не можу зробити кращий запис. Якщо ви зрозумієте це, можливо, комбінація декількох відповідей, обов'язково подайте нову відповідь!
Люк

1

Іншою можливістю може бути встановлення, налаштування, а потім використання команди super для запуску сценарію як

super /path/to/your/script

Якщо ви хочете запустити деякий двійковий виконуваний файл (наприклад , що ви скомпільовано в ELF довічним з деякого вихідного коду C) -Який це НЕ script- як корінь, ви можете розглянути можливість зробити це УИП (а на справді /bin/login, /usr/bin/sudoі /bin/suта superвсе використовують цю техніку ). Однак будьте дуже обережні, ви могли б відкрити величезну дірку безпеки .

Конкретно, вашу програму слід паранояльно кодувати (тому перевіряйте всі аргументи та оточення та зовнішні умови перед тим, як "діяти", припускаючи потенційно неприязного користувача), тоді ви можете ретельно використовувати seteuid (2) та друзів (див. Також setreuid (2) ) (див. також можливості (7) та облікові дані (7) та execve (2) ...)

Ви будете використовувати chmod u+s(читати chmod (1) ) під час встановлення такого двійкового файлу.

Але будьте дуже обережні .

Прочитайте багато речей про setuid , включаючи розширене програмування Linux , перш ніж кодувати таке.

Зверніть увагу на те, що сценарій, або будь-який притон -ed річ, не може бути УИП. Але ви можете зашифрувати (на C) невеликий setuid-binary обгортки.


0

В ідеалі, якщо ви налаштовуєте, через які команди можна запустити, sudoви повинні внести ці зміни в окремий файл, /etc/sudoers.d/а не редагувати sudoersфайл безпосередньо. Ви також завжди visudoповинні редагувати файли (файли). Ви ніколи не повинні надавати NOPASSWDпо ALLкомандам.

Приклад: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Вставте рядок із наданням дозволу: myuser ALL= NOPASSWD: /path/to/your/program

Потім збережіть і вийдіть, і visudoпопередить вас, якщо у вас є якісь синтаксичні помилки.

Ви можете запустити, sudo -lщоб побачити дозволи, надані вашому користувачеві, якщо будь-яка з NOPASSWDкоманд, визначених користувачем, з’явиться ПЕРЕД будь-якою %groupyouarein ALL=(ALL) ALLкомандою у висновку, вам буде запропоновано ввести пароль.

Якщо ви виявите, що створюєте багато цих файлів sudoers.d, можливо, ви захочете створити їх з іменем кожного користувача, щоб їх було легше візуалізувати. Майте на увазі, що впорядкування ФАЙЛІВ ІМЕНІВ і ПРАВИЛЬ у файлі є дуже важливим, ОСТАННЕ завантажене виграє, чи БОЛЬШЕ, чи менше дозвільне, ніж попередні записи.

Ви можете керувати впорядкуванням імен файлів, використовуючи префікс 00-99 або aa / bb / cc, хоча також майте на увазі, що якщо у вас є будь-які файли, що не мають числового префіксу, вони завантажуватимуться після нумерованих файлів, переосмислюючи налаштування. Це тому, що залежно від ваших мовних налаштувань "лексичне сортування" оболонка спочатку використовує сортування номерів, а потім може переплутати верхні та малі регістри при сортуванні у порядку "зростання".

Спробуйте запустити printf '%s\n' {{0..99},{A-Z},{a-z}} | sortі printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortпобачити, чи друкується ваша поточна мова AaBbCcтощо, а ABCпотім abcвизначити, який найкращий "останній" буквений лист буде використаний.


0

Щоб дозволити будь-якому користувачеві виконувати програму як sudo без запитування пароля, ви можете додати наступний рядок

%sudo ALL=(root) NOPASSWD: /path/to/your/program

в /etc/sudoers

Зауважте, що % sudo встигає .


Хоча це один із способів виконання правила sudo, він не відповідає на питання про те, чому встановлення прапора NOPASSWD на це правило все-таки призвело до запиту пароля. Дивіться прийняту відповідь на ідею, чому це сталося.
Джефф Шаллер

0

Далі йдеться про випадок, коли ви хочете запустити команду без пароля, лише якщо вона має певний набір опцій, де частина параметрів є змінною . AFAIK неможливо використовувати змінні чи діапазони значень у деклараціях судоерів, тобто ви можете дозволити доступ явно до, command option1але не command option2використовуючи:

user_name ALL=(root) /usr/bin/command option1

але якщо структура там command option1 value1, де value1може змінюватися, вам потрібно мати чіткі рядки судерів для кожного можливого значення value1. Шрифт Shell забезпечує спосіб його обійти.

Ця відповідь була натхненна відповіддю М. Ахмада Зафара і вирішує питання безпеки там.

  1. Створіть скрипт оболонки, куди ви викличете команду без sudo.
  2. Збережіть скрипт у привілейованій кореневій папці (наприклад /usr/local/bin/), зробіть файл root-власником (наприклад chown root:wheel /usr/local/bin/script_name) без доступу для запису для інших (наприклад chmod 755 /usr/local/bin/script_name).
  3. Додайте виняток до судорів за допомогою visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Запустіть свій сценарій 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.