Как сделать так, чтобы sudo не истекал во время работы скрипта [дубликат]

Dec 22 2020

Иногда мне нужно запускать скрипт часами, в течение которых нужны некоторые команды sudo. Однако, если я не буду sudoпериодически проверять и повторно вводить пароль, я получаю сообщение об sudo: timed out reading passwordошибке, которое иногда приводит к поломке всего этого. Я не хочу использовать, sudo myscript.shпоскольку некоторые команды следует запускать без него sudo .

Я бы хотел, чтобы sudoкешированный пароль сохранялся для сценария на протяжении всего сценария без изменения остальной части системы ( sudoсохранение только для этого 1 сценария).

Есть ли способ sudoпродержаться на протяжении всего сценария и только для одного сценария?

Ответы

KamilMaciorowski Dec 22 2020 at 13:53

Возможность: запустить скрипт с sudo myscript.sh. Внутри скрипта выполняются команды, которые следует запускать без sudoэтого:

sudo -u "$SUDO_USER" foo args

(возможно, с правильной логикой, если весь скрипт когда-либо запускается без sudo). Пользователь root не нуждается в аутентификации sudoи, как таковой, не должен вводить пароль для выполнения команды от имени другого пользователя .

В зависимости от того, насколько велик сценарий (сколько вам нужно его изменить) и как вы относитесь к выполнению всего этого, sudoвам может понравиться или не понравиться идея. В вашем текущем подходе по умолчанию используется код без повышенных прав, строки с sudoявными исключениями. Мой подход переворачивает это с ног на голову. Вам нужно быть более внимательными при создании и тестировании скрипта. Я признаю, что это не лучшая практика; тем не менее, он решает проблему истечения срока действия sudo.

Лично я бы использовал это решение для продолжительного сценария, который не слишком сложен (простой цикл, несколько команд). Я бы дважды подумал, прежде чем переписывать сложный сценарий.


Другой подход - периодически обновлять кэшированные учетные данные в фоновом режиме. По умолчанию это per tty (см. tty_tickets). Поступайте так:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

Не забывайте убивать фоновую работу, когда она больше не нужна. Сам скрипт может запустить такую ​​работу; тогда вы, вероятно, захотите, чтобы в сценарии были какие-то ловушки, чтобы автоматически убить задание при завершении сценария.