Ejecute un comando que requiera sudo después de que haya pasado un tiempo

30

Yo suelo hacer

sleep 4h; command

ejecutar un comando después de 4h. Sin embargo, si ese comando lo requiere sudo, no funcionará.

¿Es posible dar sudopermiso en el momento en que estoy ejecutando el sleepcomando?

Guerlando OCs
fuente
En ese caso particular, creo que puedes usar el shutdown. comando con sudo y los argumentos apropiados para programar el sueño en un momento específico.
pez remo
¿Cuál es la tarea que debes hacer y por qué dormir exactamente 4 horas?
Thorbjørn Ravn Andersen

Respuestas:

46

Se usa sudopara iniciar un shell raíz donde ejecuta los comandos:

sudo bash -c 'sleep 4h; command'

Todos los comandos que se ejecutan en el shell raíz se ejecutan con permisos de root, lo sleepque no hace daño. Si necesita ejecutar un comando con permisos de usuario, use sudo -u USERNAME COMMAND, por ejemplo:

$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert  # whoami run as user dessert
root     # whoami run as root

Otro enfoque sería usar sudo visudopara permitir la ejecución del comando sin acceso a la raíz, ver: ¿Cómo permitir la ejecución sin solicitar una contraseña usando sudo?
Tenga en cuenta que dependiendo del comando esto puede crear una falla de seguridad.

postre
fuente
21

Suponiendo que solo desea ejecutar el proceso una vez (no, por ejemplo, cada 4 horas), puede usar atd

  1. Asegúrese de que atd se esté ejecutando (en ubuntu que es /etc/init.d/atd statuso mejor aún systemctl status atd)
  2. En una terminal como root, ejecute su comando de la siguiente manera:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Si desea ejecutarlo cada 4 horas, también puede usar cron (como root) con la siguiente configuración en su crontab

    0 */4 * * * sh -c $'/path/to/command'
Ama Aje My Fren
fuente
2
Sí, ates la herramienta adecuada para este trabajo, ya que también se encarga de la redirección de E / S, no bloquea una ventana de shell y funciona incluso cuando el usuario se ha desconectado o la máquina se ha reiniciado desde entonces.
Simon Richter
44
@SimonRichter: sudo bash -c 'sleep 4h && command' &poner sudo en segundo plano es una manera más fácil de no bloquear una ventana / pestaña de shell. Si desea que la salida aparezca de forma asincrónica como un recordatorio de que sucedió, eso es más fácil. No funciona en todos los reinicios, pero dependiendo de su nohupconfiguración, puede permanecer ejecutándose después de salir / cerrar sesión desde un shell.
Peter Cordes
44
Tenga en cuenta que atejecuta el comando tan pronto como sea posible cuando el sistema se suspende a la hora especificada, consulte aquí en U&L ; dependiendo de los comandos para ejecutar, esto puede no ser lo que desea.
postre
2
Solo una sugerencia, también puede usar systemctl para verificar el estado del servicio en lugar de llamar directamente a ese script init.d. Si bien ambos aparentemente tienen el mismo resultado, creo que debería preferirse la forma moderna de interactuar con los servicios de systemd:systemctl status atd
Byte Commander
15

Una forma es ejecutar a través de un shellscript con sudopermisos (y dar la contraseña, cuando inicie el shellscript), si el shellscript está en el directorio actual,

sudo ./delayer 4h

donde delayerpuede haber un shellscript con el contenido

#!/bin/bash
sleep "$1"
command

Hazlo ejecutable con

chmod +x delayer

y cópielo o muévalo a un directorio PATHsi lo desea.


Si desea un shellscript más flexible, donde puede seleccionar el comando [línea] para retrasar ingresando los parámetros, puede intentar

#!/bin/bash

if [ $# -lt 2 ] || [ "$(whoami)" != "root" ]
then
 echo "Delay start of command, that needs 'sudo'
Usage:    sudo $0 <delay> <command line>
Example:  sudo $0 4h parted -ls"
 exit
fi

sleep "$1"
shift
"$@"

Ejemplo de demostración (demora corta, 5 segundos, para fines de demostración),

$ ./delayer
Delay start of command, that needs 'sudo'
Usage:    sudo ./delayer <delay> <command line>
Example:  sudo ./delayer 4h parted -ls

$ sudo ./delayer 5s parted /dev/sdc p
[sudo] password for sudodus: 
Model: Kanguru SS3 (scsi)
Disk /dev/sdc: 15,9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 2      1049kB  2097kB  1049kB               primary  bios_grub
 3      2097kB  258MB   256MB   fat32        primary  boot, esp
 4      258MB   2274MB  2016MB               primary
 5      2274MB  12,5GB  10,2GB  ext2         primary
 1      12,5GB  15,9GB  3394MB  ntfs         primary  msftdata
sudodus
fuente
3
Bueno, si es /bin/shsintaxis, estará bien. Pero si tiene la intención de usar características específicas de bash, entonces shebang es necesario. Steeldriver y yo tuvimos una discusión sobre eso en alguna parte. Aa y Videonauth borraron su comentario antes de que pudiera responder adecuadamente. Oh bien
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy, tienes razón. Entonces, en este caso, el shebang está ahí para hacer que el shellscript sea robusto en caso de características adicionales donde la sintaxis puede diferir.
sudodus
@SergiyKolodyazhnyy Bueno, fue solo una sugerencia, así que pensé que dejar el comentario allí no era necesario y solo agregaría desorden. Siéntase libre de
contactarme
2

Otra forma sería iniciar la sesión interactiva de sudo con sudo -s(no cambia el directorio) o sudo -i(cambia el directorio actual al directorio de inicio raíz) y luego ingrese sus comandos (sin sudo)

Ludwik
fuente