GNU/Linux >> Tutoriales Linux >  >> Linux

Aumentar temporalmente el tiempo de espera de sudo durante la duración de un script de instalación

Solución 1:

Puede configurar un ciclo que se ejecuta en segundo plano para ejecutar periódicamente "sudo -v", el truco, por supuesto, es lograr que el ciclo termine limpiamente cuando finaliza su secuencia de comandos. Entonces tiene que haber algún tipo de comunicación entre los dos procesos; Los archivos tmp están bien para esto, y también se pueden limpiar fácilmente después de ejecutar el script. (De todos modos, un script de instalación suele hacer esto).

Por ejemplo (elimine las declaraciones 'echo' para usar esto; estas solo muestran que "funciona"):

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

Luego verá... (nota:el pid se coloca en el archivo tmp, solo para que pueda eliminarlo fácilmente. Sin embargo, no es necesario):

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

Solución 2:

Me gustó la respuesta de michael_n, pero tenía el deseo más irracional de no usar un archivo temporal. Tal vez esto pueda proporcionar algo de perspectiva.

Mi solución fue:

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

De nuevo, el echo son extraños...

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

De nuevo, ctrl-c también funciona...

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

Solución 3:

Basado en esta esencia, hice una versión concisa y limpia:

# 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. La acción Instalar para el producto MySQL Server 5.7.19 falló.

  2. Instale IMAP para PHP 7.1 en el sistema operativo Ubuntu

  3. Uso del script Apache2Buddy para rendimiento y estabilidad

  4. Alcance variable para scripts y funciones bash shell en el script

  5. ¿Es la herramienta de línea de comando pdftotext para mac?

La guía completa para usar ffmpeg en Linux

Gnome 3.2 ¿Problemas en el caparazón?

¿Aumentar el espacio de intercambio en Ubuntu?

Cómo instalar Cockpit en Ubuntu 22.04 para una mejor gestión del servidor

Cómo instalar MongoDB GUI Adminer en AlmaLinux

¿Cuál es la forma más rápida de ejecutar un script?