GNU/Linux >> Znalost Linux >  >> Linux

Dočasně se prodlužuje časový limit sudo po dobu trvání instalačního skriptu

Řešení 1:

Můžete nastavit smyčku, která běží na pozadí, aby pravidelně spouštěla ​​"sudo -v", trik samozřejmě spočívá v tom, že smyčka bude čistě ukončena, když se váš skript ukončí. Mezi těmito dvěma procesy tedy musí existovat nějaký typ komunikace; K tomu jsou vhodné soubory tmp a lze je také snadno vyčistit po spuštění skriptu. (Instalační skript to stejně obvykle dělá.)

Například (abyste to mohli použít, odstraňte příkazy „echo“; tyto pouze ukazují, že „funguje“):

#!/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

Pak uvidíte... (poznámka:pid se vloží do souboru tmp, abyste ho mohli snadno zabít. Není to však nutné):

$ ./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)

Řešení 2:

Odpověď michael_n se mi líbila, ale měl jsem nejvíce iracionální přání nepoužívat dočasný soubor. Možná to může poskytnout určitou perspektivu.

Moje řešení bylo:

#!/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!"

Opět echo 's jsou cizí...

$ ./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

Opět, ctrl-c funguje také...

$ ./sudoping.sh 
Starting background sudo ping...
ok  
Sudo ping!
Sudo pinging in PID = 47599
Sudo ping!
^CStopping sudo ping in PID = 47599

Řešení 3:

Na základě této podstaty jsem vytvořil stručnou a čistou verzi:

# 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 &

Linux
  1. Jak udělat sudo zapamatovat si heslo déle

  2. Jak nainstalovat rozšíření PHP GeoIP

  3. Účel klíčového slova „dělat“ v Bash For Loops?

  1. Bash Echo Příkazový řádek spuštěn na samotném příkazovém řádku (ne ve skriptu)?

  2. Nainstalujte IMAP pro PHP 7.1 na operační systém Ubuntu

  3. Je nástroj příkazového řádku pdftotext pro Mac?

  1. Akce Instalace pro produkt MySQL Server 5.7.19 se nezdařila.

  2. Variabilní rozsah pro skripty bash shell a funkce ve skriptu

  3. Jak přinutím sudo, aby požádal o heslo uživatele root?