Bash Scripting: Потрібно запускати сценарій як root (або з sudo)


26

Я намагаюся написати скрипт bash (в Ubuntu), який створить резервну копію каталогу за допомогою tar.

Як я можу зробити перевірку сценарію, щоб він міг працювати лише як root (або з sudo)?

Наприклад, якщо користувач запускає скрипт, він повинен сказати, що цей сценарій повинен бути запущений з привілеями sudo, а потім закрити. Якщо скрипт виконаний як root, він продовжиться після перевірки.

Я знаю, що повинно бути просте рішення, я просто не зміг його знайти в Google.

Відповіді:


37

Щоб вивести ефективний uid, використовуйте цю команду:

id -u

Якщо результат "0", то сценарій або працює як root, або використовує sudo. Ви можете запустити чек, зробивши щось на кшталт:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
Я рекомендую повністю кваліфікувати шлях до id (наприклад, / usr / bin / id). В іншому випадку відвертий користувач може написати власний сценарій / двійковий файл, який завжди повертає 0, а потім поставити його в місце, яке існувало раніше на шляху виконання користувачів.
ktower

Домовились. Виправлення за допомогою редагування.
Скотт Пак

6
Будь-який «хитрий», що намагається запустити сценарій, вас не зупинить, використовуючи повний шлях до id.
theoterreceive

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

1
Це не відповідає вимозі "sudo".
GregB

17

Я припускаю, що ви знаєте, що змінивши право власності на root

chown root:root file

та встановлення дозволів на 700

chmod 700 file

ти зробиш те ж саме - без пропозиції працювати як судо.

Але я опублікую цю відповідь для повноти.


3
Це більш підходяще рішення, ніж прийнята відповідь. - Мій $ 0,02
Кріс

Бічна примітка: перевірити скрипт на git стає складніше. Щоб виправити,sudo git add <file>
Хаїм Елія

2

Яка ваша мета тут - повідомити користувача про те, що вони повинні запускати скрипт як root або як якусь запобіжну безпеку?

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

Якщо це проблема безпеки, то сценарій повинен бути встановлений на 700, що належить root: root, щоб його не читали чи не виконували інші користувачі.


Або, можливо, сценарій вимагає доступу до файлів або команд, доступних тільки для root, щоб виконати свою роботу, як у моєму випадку
chrisbunney

2

Ви також можете використовувати команду whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

Насправді uid 0 - це спеціальний обліковий запис користувача з повним привілеєм. "root" - це просто найпоширеніша мітка / ім'я, відображена в цьому UID. Це не повинно бути "root", і зловмисник може спробувати це використати.
0xШепдог

2

Змінна bash $EUIDпоказує ефективний UID, на якому працює сценарій, якщо ви хочете переконатися, що сценарій працює як root, перевірте, чи $EUIDмістить 0 значення чи ні:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Це краще, ніж рішення з /usr/bin/id(для скриптів bash!), Оскільки воно не вимагає зовнішньої команди.


1
Замість того, щоб просто вийти, може запропонувати користувачеві ввійти в sudo, замінивши echoрядок на sudo "$0" "$@"і замінити exit 2на exit $?.
schumacher574

Гарна ідея. Однак у питанні було задано сценарій, який вийшов, а не наклав на себе судо.
neuhaus

0

Один з простих способів зробити сценарій тільки виконуваним під корінь - це запустити сценарій з рядка:
#!/bin/su root


-1

"#! / bin / su root" дозволяє користувачам у суперкористувацькому режимі запускати сценарій без використання пароля root. Якщо ви хочете, щоб супер користувачі запускали сценарій з результатами root, це робить це.

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