Якщо я буду виконувати файл сценарію Bash, чи всі команди всередині сценарію Bash будуть виконані як sudo?


30

Я хочу написати автоматичний сценарій після встановлення в Bash (так називається post-install.sh, наприклад). Сценарій автоматично додавати та оновлювати сховища, встановлювати та оновлювати пакети, редагувати конфігураційні файли тощо.

Тепер, якщо я виконую цей скрипт, наприклад, з sudo post-install.sh, мені буде запропоновано ввести sudoпароль лише один раз, або мені потрібно буде вводити sudoпароль при кожному виклику команди всередині сценарію, для цього потрібен sudoдозвіл? Іншими словами, чи команди у внутрішньому скрипті bash 'успадковують' дозволи на виконання, так би мовити?

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


4
Можливо, вам буде цікаво ознайомитися з деякими інструментами, спеціально розробленими для цього завдання. 3 поширені такі: Лялька, шеф-кухар та сотня.
спудер

@spuder, а для масштабної архітектури корпоративного рівня та безпеки управління конфігурацією ви можете використовувати CFEngine 3. (Не для слабкого серця, ані для разових команд.)
Wildcard

Відповіді:


38

Питання №1: Чи мені буде запропоновано ввести пароль sudo лише один раз, або мені потрібно буде вводити пароль sudo при кожному виклику команди всередині сценарію, для чого потрібен дозвіл sudo?

Так, один раз на час виконання сценарію.

ПРИМІТКА. Коли ви надаєте облікові дані sudo, автентифікація, як правило, хороша протягом 5 хвилин у оболонці, де ви ввели пароль. Крім того, будь-які дочірні процеси, які виконуються з цієї оболонки, або будь-який сценарій, який працює в оболонці (ваш випадок), також буде працювати на підвищеному рівні.

Q # 2: чи все ж є можливість, що дозволи на дозвіл sudo вичерпаються (якщо, наприклад, певна команда потребує достатньо часу, щоб перевищити час очікування sudo)? Або триватиме початковий вхід пароля sudo протягом усієї тривалості всього сценарію?

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

уривок зі сторінки людина судо

Цей ліміт залежить від політики; тайм-аут підказки під час встановлення пароля для політики безпеки sudoers становить 5 хвилин.


1
Відповідь на Q1 - "Ні, вас більше не запросять".
dannysauer

@dannysauer - прочитайте його ще раз. Я кажу: так, щоб запросити пароль лише один раз!
slm

Питання говорить "це а чи б", і лише сказати "так" не дало зрозуміти, чи було це "так, а" чи "так, б". Просто намагаюся уточнити речі для майбутніх читачів. : D
dannysauer

@dannysauer - див. оновлення.
slm

1
Це нове запитання буде таким: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>повинні працювати.
Готьє

17

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

Час sudoочікування застосовується лише до (пізніше) окремого виклику sudo. Це не вплине на ваш уже запущений баш-процес чи когось із його нащадків.


3

Ці відповіді, ймовірно, вірні. Однак це не загальновживаний спосіб (наскільки я знаю) для створення bash-скриптів, які потребують sudoдозволів. Як правило, у верхній частині сценарію ви припускаєте, що він не був запущений з sudoдозволами, а натомість зателефонуйте sudo -vсобі (що спонукає користувача до його пароля) "налаштувати" sudo"сеанс". Ви можете або echoякийсь пояснювальний текст перед підказкою, або замінити sudoвласне запит за допомогою -pперемикача, щоб користувач знав, що вам потрібен sudoдоступ для деяких команд.

Тоді у вашому сценарії вам слід добре зателефонувати sudoна команди, які вимагають його (та лише ті команди, які цього вимагають) без подальших запитів пароля. Якщо ви думаєте, що певна група команд, що виконуються разом у вашому сценарії (незалежно від їх власного використання sudo), буде виходити за межі таймауту sudo, ви можете зателефонувати sudo -vв середині, щоб видати своєрідний sudoсеанс "підтримання життя". '.

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


1
Скажіть, що одним із кроків сценарію є створення абсолютно нового ядра Linux, яке може тривати, наприклад, дві години. Підтримка сесії в живих може бути складним завданням, як ви з цим впоралися?
Готьє

Ви не можете. Але наступного разу, коли ви зателефонуєте, sudo -vвін знову запитає у користувача його пароль. На мою думку, не найгірше питання. Можливо, це стане в нагоді, змусивши користувачів усвідомити механізм.
alexrussell

Зворотне до цього полягає в тому, щоб вимагати від користувача викликати скрипт з sudo за іншими відповідями, а потім sudo -u $SUDO_USERзмусити всі некорінні команди, які вимагають команд, виконуватись без підвищення. На жаль, він додає більше коду, але це єдиний надійний спосіб виконувати кореневі речі в тривалому процесі роботи.
dragon788

Я припускаю , що я повинен уточнити, ще інший спосіб зробити це було б назвати Sudo один раз на початку сценарію , щоб помістити тимчасовий файл в /etc/sudoers.dвикористанні visudo -c -f /tmp/tempsudoersдля забезпечення файл дійсний перед копіюванням його на місце, а потім видалити цей файл один раз зробити (використовуючи пастку при виході / помилку, щоб переконатися, що ескалацією не можна зловживати). Найбільш безпечна і безпечна реалізація дозволить вашому користувачу запускати конкретні команди у вашому сценарії з певними аргументами без пароля, використовуючи NOPASSWDзбереження кожної команди / аргументів у масиві для створення файлу.
dragon788

Трохи пізно повертаюся до @Gauthier тут, але, здається, я помилявся, коли сказав, що не можеш підтримувати sudoсеанс в живих, якщо дане завдання займає більше часу, ніж час очікування. Я натрапив на цю техніку днями в dotfiles Mathias Bynens repo: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.