Яка мета "істинного" в баші "якщо sudo true; потім"


20

Я зламав цей скрипт bash, який тестує, чи користувач має права привілеїв суперпользователя, а якщо вони цього не роблять, він їх вимагає. Зрештою, я намагаюся перевернути друге висловлювання "якщо", щоб я міг видалити наступні два рядки (відлуння "пароль добре" та інше в наступному рядку)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

Чи є мета "істинного" на четвертому рядку лише нульовим твердженням?

Мені потрібно перевернути тест на четвертому рядку, як це зробити? Ось що я спробував:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
Якщо ви збираєтесь зняти це питання, будь ласка, поясніть, що я можу зробити, щоб покращити питання? Це не правильний сайт переповнення?
Метт Паркінс

4
Не впевнений, звідки беруться низовини; ви намагаєтесь заперечувати заяву або зводити нанівець заяву? Ви кажете, що хочете позбутися і справжнього / відлуння, і "іншого", тож яка ваша кінцева мета?
Джефф Шаллер


1
@ ctrl-alt-delor, переходячи за цим посиланням, здається, що все, що мені потрібно зробити, - це поставити знак оклику перед судо, і тоді я можу зняти і ехо, і інше, і тепер я перевірив це, це працює, дякую.
Метт Паркінс

2
Мимохідь, ймовірно, вам слід було б переспрямувати повідомлення про помилку на потік помилок:echo "Aborting script" >&2
Toby Speight,

Відповіді:


38

trueв bash - це не ключове слово, це програма, яка миттєво виходить із успішним кодом виходу. Так само falseце програма, яка завершує роботу з невдалим кодом виходу.

Ви можете спробувати це, запустивши обидві програми зі свого терміналу, а потім прочитавши $?змінну, яка містить вихідний код останньої програми;

true
echo $? # 0
false
echo $? #1

if sudo trueне еквівалентно if sudo == true. if sudo trueзапускає trueпрограму за допомогою sudoта перевіряє вихідний код.

Тому:

if sudo false; thenзапускає програму falseяк sudo. Повернення завжди буде помилковим.

if sudo true == falseзапустить програму trueз аргументами ==та falseза допомогою sudo. Це, очевидно, не так, як ви планували.

if [!(sudo true)] недійсний синтаксис.

Напевно, ви шукаєте

if ! sudo true;

12
Як трохи педантична корекція до першого речення: у bash , trueі falseє "вбудованими", команди, що інтерпретуються безпосередньо оболонкою; в системах, схожих на Unix , вони також існують як окремі програми файлової системи. Різниця тут не так важлива, але, наскільки я знаю, sudo trueбуде працювати автономна програма, а не баш вбудований.
IMSoP

31
PS: мої улюблені підсумки trueта falseназви на їхніх чоловічих сторінках: true - do nothing, successfullyіfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP Це глибоко.
brainplot

2
Якщо trueйого не існувало, код у запитанні показує, чому можна було б його вигадувати! Це мінімальна програма, яка може вийти з ладу лише в тому випадку, якщо система, на якій вона працює, справді не працює. Тож можна використовувати його, щоб встановити, чи повноцінні дані для доступу.
nigel222

2
У AT&T SYSV Unix "true" був скриптом оболонки / bin / true, який складався з великого повідомлення про авторські права в коментарях ... і нічого іншого.
Лі Даніел Крокер

21

Я відчуваю, що прийнята відповідь насправді не відповіла на ваше запитання?

Мета зробити це , щоб переконатися , що ви можете на самому справі sudo.

Як проводиться ця перевірка, здійснюється через trueпрограму, як пояснено у прийнятій відповіді.


1
По суті, це. Альтернативою може бути перевірка, чи є користувач у групі судерів, але просто біг sudo trueтакож досить легкий спосіб, хоча і трохи хакі.
Сергій Колодяжний

3
Зверніть увагу, що це також потрібно sudoвстановити, тому чеки не були б цілком еквівалентними ... ви могли б бути в групі судорів і все одно не матимете можливості судо. (Особливо це може з'явитися, якщо ви, наприклад, пишете сценарій для встановлення нового зображення з мінімального корінця, який може не мати судо.)
Mehrdad

1
ОП хоче вийти, якщо не можете судо, і позбутися двох ліній, а не мати ще одного, що слідує за петлею.
mckenzm

2
І, навпаки, ви також можете бути sudoбез групи судерів, якщо ви (особисто або як член якоїсь іншої групи) вказані в /etc/sudoers. Але навіть sudo trueце не є непогрішним, оскільки sudoдоступ може бути наданий лише для певних команд, тож ви можете мати змогу sudo true, але не sudo something_else, або навпаки. Немає жодного способу тестування, окрім спроб запустити команду, з якою ви насправді хочете запустити sudo.
Дейв Шерохман

2
Крім того, ви можете бути в sudoersгрупі і не мати можливості, sudoоскільки sudoersгрупа не вказана у sudoersфайлі. Група з чотирма літерами sudoв її імені не є дійсною ознакою того, чи може користувач цієї групи робити якусь конкретну річ або взагалі будь-що, використовуючи sudo.
jrw32982 підтримує Моніку

5

Як я бачу в цьому сценарії. Це просто перевірка, чи включено sudo, тобто.

true просто повертає true.

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

Умова працює так: якщо sudo виконує справжню команду правильно, вона поверне істину для умови if, тоді sudo увімкнено і користувач введено правильно пароль, інакше ви ввели пароль неправильно або sudo не ввімкнено, сценарій не повинен тривати.

Іншим командам не потрібно запитувати пароль sudo, оскільки ваша автентифікація проходить успішно в перший раз (але це залежить від конфігурації sudo, тому ці сценарії багато в чому залежать від конфігурації середовища)

"Ехо-пароль добре" це також демонструє. скрипт оболонки більше не запитуватиме пароль.


1
Єдині команди, що проходять через sudo, є sudo trueі sudo -k. Останній явно не вимагає пароля. Жодна з інших команд у скрипті не працює через sudo, тому, звичайно, вони не вимагатимуть паролів, незалежно від того, чи було аутентифікація успішною вперше.
ilkkachu

Я писав: "Тож у цьому випадку, якщо їм потрібно виконати будь-яку команду з sudo, вона перевіряється спочатку, задаючи пароль лише один раз"
Лучано Андресс Мартіні,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.