Временное увеличение тайм-аута sudo на время установки скрипта

Я пытаюсь написать скрипт, который установит кучу программного обеспечения, и я бы не хотел запускать все как root, поэтому я хотел бы запросить пароль, а затем перейти к установке, используя sudo или su, чтобы получить привилегии, когда они мне нужны.

Я делал sudo -v, чтобы запросить пароль в начале скрипта, а затем просто использовать sudo обычно позже. Это отлично работает, пока я не дойду до одной установки, которая перехватит тайм-аут.

Мне бы не пришлось постоянно увеличивать время ожидания. Есть ли способ увеличить тайм-аут sudo только для текущего сеанса?

21 голос | спросил Arelius 4 Mayam11 2011, 07:42:39

4 ответа


8

Вы можете настроить цикл, который работает в фоновом режиме, для периодического выполнения «sudo -v», трюк, конечно же, заключается в том, что цикл полностью завершается, когда ваш скрипт завершается. Поэтому между этими двумя процессами должна быть какая-то связь; tmp файлы подходят для этого, и их можно легко очистить после запуска скрипта. (Обычно это делает сценарий установки).

Например (удалите операторы «эха», чтобы использовать это, просто покажите «работа»):

#!/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)
ответил michael 5 Mayam11 2011, 03:37:29
9

Мне понравился ответ michael_n, но было самое нерациональное желание не использовать временный файл. Возможно, это может обеспечить некоторую перспективу.

Мое решение было:

 #!/bin/bash
function sudo_ping() {
    if [[ ! -z $SUDO_PID ]]; then
        if [[ $1 -eq stop ]]; then
            echo "Stopping sudo ping in PID = $SUDO_PID"
            kill $SUDO_PID
            return
        else
            echo "Already sudo pinging in PID = $SUDO_PID"
            return
        fi
    fi

    echo "Starting background sudo ping..."
    sudo -v
    if [[ $? -eq 1 ]]; then
        echo "Oops, wrong password."
        return
    fi
    sudo echo "ok"

    while true; do
        echo 'Sudo ping!'
        sudo -v
        sleep 1
    done &
    SUDO_PID=$!
    sudo echo "Sudo pinging in PID = $SUDO_PID"

    # Make sure we don't orphan our pinger
    trap "sudo_ping stop" 0
    trap "exit 2" 1 2 3 15
}

sudo_ping
sleep 5
echo "Goodbye!"

Опять же, echo 'являются посторонними ...

$ ./sudoping.sh 
Starting background sudo ping...
Password:
ok  
Sudo ping!
Sudo pinging in PID = 47531
Sudo ping!
Sudo ping!
Sudo ping!
Sudo ping!
Goodbye!
Stopping sudo ping in PID = 47531

Опять же, ctrl-c тоже работает ...

$ ./sudoping.sh 
Starting background sudo ping...
ok  
Sudo ping!
Sudo pinging in PID = 47599
Sudo ping!
^CStopping sudo ping in PID = 47599
ответил Gregory Perkins 2 J000000Monday12 2012, 16:13:11
3

Основываясь на этом gist , я сделал краткую и чистую версию:

 # Prevent sudo timeout
sudo -v # ask for sudo password up-front
while true; do
  # Update user's timestamp without running a command
  sudo -nv; sleep 1m
  # Exit when the parent process is not running any more. In fact this loop
  # would be killed anyway after being an orphan(when the parent process
  # exits). But this ensures that and probably exit sooner.
  kill -0 $$ 2>/dev/null || exit
done &
ответил Bohr 27 J0000006Europe/Moscow 2015, 13:41:10
0

В соответствии со страницей sudo:

   -v          If given the -v (validate) option, sudo will update the user's time stamp,
               prompting for the user's password if necessary.  This extends the sudo timeout for
               another 15 minutes (or whatever the timeout is set to in sudoers) but does not run
               a command.

Поэтому я предполагаю, что если вы добавите несколько sudo -v в более точках вашего скрипта настройки для проверки сеанса (и не только на начало), вы получите то, что хотите, поскольку каждый раз это увеличивает таймаут (он снова запрашивает пароль, если тайм-аут достигнут). Единственная проблема будет заключаться в том, что если на вашем скрипте есть команда, которая занимает больше времени, чем таймаут (так что даже если вы проверите сразу после этого, истечет время ожидания до того, как оно завершится для другой проверки), но это очень конкретный случай.

Случается, что просто использование sudo не увеличивает таймаут, а sudo -v не выполняет команду, поэтому вам нужно использовать sudo -v больше раз, чтобы проверить сессии.

ответил coredump 4 Mayam11 2011, 09:28:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132