Работая строго внутри скрипта (не редактируя файл sudoers или не вызывая скрипт через sudo ./script.sh
), вот что я считаю самым чистым методом:
startsudo() {
sudo -v
( while true; do sudo -v; sleep 50; done; ) &
SUDO_PID="$!"
trap stopsudo SIGINT SIGTERM
}
stopsudo() {
kill "$SUDO_PID"
trap - SIGINT SIGTERM
sudo -k
}
По сути, это определяет пару функций для включения и выключения режима sudo. Вызов startsudo
перед запуском кода с использованием sudo аутентифицируется с помощью sudo, разветвляет фоновый цикл обновления sudo, сохраняет PID цикла и устанавливает прерывание сигнала для остановки режима sudo при нажатии Ctrl + C. Вызов stopsudo
убивает цикл, очищает ловушку сигнала и делает недействительной предыдущую аутентификацию с помощью sudo.
После копирования этих функций в ваш скрипт используйте их следующим образом.
startsudo
echo "Sudo mode is active."
# whatever you want to do with sudo
stopsudo
Я хотел бы поблагодарить @karl за простоту встраивания цикла обновления sudo и @sehe за указание на то, что для прерывания цикла следует использовать сигнальную ловушку, если она не уничтожается нормально. Обе эти идеи улучшили мой скрипт резервного копирования btrfs , который использует цикл обновления sudo, чтобы избежать повторного запроса пользователя после того, как резервное копирование подобъема займет больше времени, чем тайм-аут sudo.