Вы можете настроить цикл, который запускается в фоновом режиме, чтобы периодически выполнять «sudo -v», трюк, конечно, заключается в том, чтобы заставить цикл завершаться полностью, когда завершается ваш скрипт. Таким образом, должен быть какой-то тип связи между двумя процессами; Файлы tmp подходят для этого, и их легко можно очистить и после запуска скрипта. (В любом случае скрипт установки обычно делает это.)
Например (удалите операторы 'echo', чтобы использовать это; они просто показывают, что он "работает"):
#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt
echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
sudo_me() {
while [ -f $sudo_stat ]; do
echo "checking $$ ...$(date)"
sudo -v
sleep 5
done &
}
echo "=setting up sudo heartbeat="
sudo -v
sudo_me
echo "=running setup=" | tee $log
while [ -f $log ]
do
echo "running setup $$ ...$(date) ===" | tee -a $log
sleep 2
done
# finish sudo loop
rm $sudo_stat
Тогда вы увидите ... (примечание: pid помещен в файл tmp, просто чтобы вы могли легко его убить. Хотя это и не обязательно):
$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user:
=running setup=
checking 6776 ...Wed May 4 16:31:47 PDT 2011
running setup 6776 ...Wed May 4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May 4 16:31:53 PDT 2011
running setup 6776 ...Wed May 4 16:31:54 PDT 2011 ===
<ctrl-c> (cleans up files, then exits)
На основании этой сущности , я сделал краткий и чистую версию:
источник
sudo -K
она вызывается в другом месте сценария оболочки, ваша версия будет кричатьsudo: a password is required
на stderr каждую минуту.Согласно
sudo
справочной странице:Поэтому я полагаю, что если вы добавите некоторые
sudo -v
дополнительные пункты вашего сценария установки для проверки сеанса (и не только в начале), вы получите то, что хотите, так как каждый раз это увеличивает время ожидания (оно только запрашивает пароль снова, если тайм-аут достигнут). Единственная проблема будет в том случае, если в вашем скрипте есть команда, которая занимает больше времени, чем время ожидания (так что даже если вы выполняете проверку сразу после нее, время ожидания истечет до его завершения для другой проверки), но это очень специфический случай.Что происходит, так это то, что простое использование
sudo
не увеличивает время ожидания иsudo -v
не выполняет команду, поэтому вам нужно использоватьsudo -v
больше раз для проверки сеанса.источник
Основываясь на сути, предоставленной Григорием Перкинсом, и моим опытом, вот моя строка:
Или
Пояснения
trap "exit" INT TERM; trap "kill 0" EXIT
: Это приведет к удалению всего дерева процессов при выходе или SIGINT / SIGTERM.sudo -v || exit $?
: Запрашивать пароль заранее и кэшировать учетные данные безопасности, но не запускать команду. Если пароль неверный, выйдите с кодом, возвращенным sudo.sleep 1
: Задержка немного, чтобы учетные данные безопасности были эффективно сохранены. Если следующий sudo запускается слишком рано, он не узнает об этом, поскольку учетные данные еще не сохранены, поэтому запросит пароль еще раз.while true; do sleep 60; sudo -nv; done 2>/dev/null &
: Неоднократно обновлять существующие учетные данные безопасности sudo. Обратите внимание, что эта версия отличается от одной из связанных суть:sleep 60
сначала она запускается , а затемsudo -nv
.&
Оператор помещает весьwhile
цикл в фоновом режиме, запустив его в качестве дочернего процесса.2>/dev/null
Перенаправить поток ошибок вwhile
цикле до пустоты, так что сообщения об ошибках , генерируемых с помощью любых команд внутри цикла будет отброшены.-n
Вариантsudo
предотвращает его запрашивая пользователя для пароля, но вывести сообщение об ошибке и выход , если требуется пароль.Там нет,
kill -0 "$$" || exit
как в связанной сущности, потому что первые дваtrap
с будут делать эту работу. Ему не придется спать в течение 59 секунд, пока он не обнаружит, что родительский процесс не запущен!источник