Тайм-аут временно увеличивающегося sudo на время сценария установки

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

Если я нанимаю водопроводчика, и я говорю ему, что он должен снять свою обувь в моем доме, то это - то, что он должен сделать, нравится ли ему это или нет. Если он борется со мной по проблеме затем, я собираюсь уволить его и нанять кого-то еще.

22
задан 20 November 2016 в 21:13
5 ответов

Можно установить цикл, который работает в фоновом режиме для периодического выполнения "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)
8
ответ дан 2 December 2019 в 20:02

Согласно 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 больше раз проверить сессию.

0
ответ дан 2 December 2019 в 20:02

Мне понравился ответ 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
9
ответ дан 2 December 2019 в 20:02

На основе этой сути я сделал краткую и понятную версию:

# 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 &
3
ответ дан 2 December 2019 в 20:02

Основываясь на сущности , предоставленной Грегори Перкинсом и моем опыте, вот мой однострочный текст:

trap "exit" INT TERM; trap "kill 0" EXIT; sudo -v || exit $?; sleep 1; while true; do sleep 60; sudo -nv; done 2>/dev/null &

или

trap "exit" INT TERM
trap "kill 0" EXIT
sudo -v || exit $?
sleep 1
while true; do
    sleep 60
    sudo -nv
done 2>/dev/null &

Объяснения

  • ловушка "выход" INT TERM; trap "kill 0" EXIT : Это приведет к отключению всего дерева процессов при выходе или SIGINT / SIGTERM.

  • sudo -v || exit $? : запрашивать пароль заранее и кэшировать учетные данные безопасности, но не запускать команду. Если пароль неверен, выйдите с кодом, возвращенным sudo.

  • sleep 1 : Немного подождите, чтобы учетные данные безопасности были эффективно сохранены. Если следующее sudo запустится слишком рано, он не узнает об этом, потому что учетные данные еще не сохранены, поэтому снова запросит пароль.

  • while true; спать 60; sudo -nv; done 2> / dev / null & : неоднократно обновлять существующие учетные данные безопасности sudo. Обратите внимание, что эта версия отличается от версии связанной сущности: сначала выполняется sleep 60 , а затем sudo -nv .

    • Оператор & помещает весь цикл while в фоновом режиме, выполняя его как дочерний процесс.

    • 2> / dev / null перенаправляет stderr цикла while в пустоту, поэтому сообщения об ошибках, созданные любыми командами внутри цикла, будут отброшены.

    • Параметр -n в sudo предотвращает запрос пароля у пользователя, но отображает сообщение об ошибке и завершает работу, если пароль требуется.

    • Нет kill -0 "$$" || exit , как в связанной сущности, потому что первые два trap будут выполнять работу. Ему не придется спать в течение 59 секунд, прежде чем он обнаружит, что родительский процесс не запущен!

0
ответ дан 2 December 2019 в 20:02

Теги

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