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 sudo
permiso en el momento en que estoy ejecutando el sleep
comando?
Se usa sudo
para 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 sleep
que 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 visudo
para 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.
Suponiendo que solo desea ejecutar el proceso una vez (no, por ejemplo, cada 4 horas), puede usar atd
/etc/init.d/atd status
o mejor aún systemctl status atd
)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
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'
at
es 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.
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 nohup
configuración, puede permanecer ejecutándose después de salir / cerrar sesión desde un shell.
at
ejecuta 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.
systemctl status atd
Una forma es ejecutar a través de un shellscript con sudo
permisos (y dar la contraseña, cuando inicie el shellscript), si el shellscript está en el directorio actual,
sudo ./delayer 4h
donde delayer
puede 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 PATH
si 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
/bin/sh
sintaxis, 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
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)
shutdown
. comando con sudo y los argumentos apropiados para programar el sueño en un momento específico.