GNU/Linux >> Linux Esercitazione >  >> Linux

Aumento temporaneo del timeout di sudo per la durata di uno script di installazione

Soluzione 1:

Puoi impostare un ciclo che viene eseguito in background per eseguire periodicamente "sudo -v", il trucco ovviamente è far terminare il ciclo in modo pulito quando termina lo script. Quindi ci deve essere un qualche tipo di comunicazione tra i due processi; tmp vanno bene per questo e possono essere facilmente ripuliti anche dopo l'esecuzione dello script. (Uno script di installazione di solito lo fa, comunque.)

Ad esempio (rimuovi le istruzioni 'echo' per usare this; queste mostrano semplicemente che "funziona"):

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

Poi vedrai... (nota:il pid è inserito nel file tmp, solo così puoi ucciderlo facilmente. Non è necessario, però):

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

Soluzione 2:

Mi è piaciuta la risposta di michael_n, ma avevo il desiderio più irrazionale di non usare un file temporaneo. Forse questo può fornire una prospettiva.

La mia soluzione era:

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

Di nuovo, lo echo sono estranei...

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

Di nuovo, anche ctrl-c funziona...

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

Soluzione 3:

Sulla base di questo succo, ho realizzato una versione concisa e pulita:

# 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. Come fare in modo che sudo ricordi la password più a lungo

  2. Bash Echo La riga di comando eseguita sulla riga di comando stessa (non in uno script)?

  3. Utilizzo dello script Apache2Buddy per prestazioni e stabilità

  4. Ambito variabile per gli script e le funzioni della shell bash nello script

  5. Come posso fare in modo che sudo chieda la password di root?

La guida completa per l'utilizzo di ffmpeg in Linux

Gnome 3.2 Problemi nella shell?

Aumentare lo spazio di scambio su Ubuntu?

Come installare Cockpit su Ubuntu 22.04 per una migliore gestione del server

Come installare MongoDB GUI Adminer su AlmaLinux

Qual è il modo più veloce per eseguire uno script?