Esegui un comando che richiede sudo dopo che è trascorso un tempo


30

Di solito lo faccio

sleep 4h; command

per eseguire un comando dopo 4 ore. Tuttavia, se tale comando richiede sudo, non funzionerà.

È possibile sudoautorizzare al momento l'esecuzione del sleepcomando?



In quel caso particolare penso che tu possa semplicemente usare il shutdown. comando con sudo e gli argomenti appropriati per programmare la sospensione in un momento specifico.
Remo


Qual è l'attività che devi svolgere e perché l'esatta 4 ore di sonno?
Thorbjørn Ravn Andersen,

Risposte:


46

Utilizzare sudoper avviare una shell di root in cui si eseguono i comandi:

sudo bash -c 'sleep 4h; command'

Ogni comando in esecuzione nella shell di root viene eseguito con i permessi di root, il che sleepnon fa male. Se è necessario eseguire un comando con autorizzazioni utente, utilizzare sudo -u USERNAME COMMAND, ad esempio:

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

Un altro approccio sarebbe quello di utilizzare sudo visudoper consentire l'esecuzione del comando senza accesso root, vedere: Come consentire l'esecuzione senza richiedere la password usando sudo?
Si noti che a seconda del comando ciò può creare un difetto di sicurezza.


21

Supponendo di voler eseguire il processo una sola volta (non, ad esempio, ogni 4 ore), è possibile utilizzarlo atd

  1. Assicurati che atd sia in esecuzione (in Ubuntu che sia /etc/init.d/atd statuso meglio ancora systemctl status atd)
  2. Su un terminale come root, eseguire il comando come segue:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Se vuoi eseguirlo ogni 4 ore puoi anche usare cron (come root) con la seguente configurazione nel tuo crontab

    0 */4 * * * sh -c $'/path/to/command'

2
Sì, atè lo strumento giusto per questo lavoro, perché si occupa anche del reindirizzamento I / O, non blocca una finestra della shell e funziona anche quando l'utente si è disconnesso o la macchina è stata riavviata da allora.
Simon Richter,

4
@SimonRichter: sudo bash -c 'sleep 4h && command' &mettere sudo in background è un modo più semplice per non bloccare una finestra / scheda della shell. Se vuoi che l'output appaia in modo asincrono per ricordare che è successo, è più facile. Non funziona tra i riavvii, ma a seconda delle nohupimpostazioni potrebbe rimanere in esecuzione dopo essere uscito / disconnesso da una shell.
Peter Cordes,

4
Nota che atesegue il comando non appena è in grado di farlo quando il sistema è sospeso all'ora specificata, vedi qui su U&L - a seconda del comando (i) per eseguire questo potrebbe non essere quello che desideri.
dessert

2
Solo un suggerimento, puoi anche usare systemctl per controllare lo stato del servizio invece di chiamare direttamente quello script init.d. Mentre entrambi sembrano avere lo stesso risultato, penso che il modo moderno di interagire con i servizi di sistema dovrebbe essere preferito:systemctl status atd
Byte Commander

15

Un modo è quello di eseguire tramite uno shellscript con sudoautorizzazioni (e fornire la password, quando si avvia lo shellscript), se lo shellscript si trova nella directory corrente,

sudo ./delayer 4h

dove delayerpuò essere uno shellscript con il contenuto

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

Renderlo eseguibile con

chmod +x delayer

e copiarlo o spostarlo in una directory, PATHse lo si desidera.


Se si desidera uno shellscript più flessibile, in cui è possibile selezionare il comando [riga] per ritardare immettendo i parametri, è possibile provare

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

Esempio dimostrativo (breve ritardo, 5 secondi, a scopo dimostrativo),

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

3
Bene, se è /bin/shsintassi andrà bene. Ma se hai intenzione di utilizzare funzionalità specifiche di bash, allora shebang è necessario. Io e Steeldriver ne abbiamo discusso da qualche parte. Aaand Videonauth ha cancellato il suo commento prima che potessi rispondere correttamente. Vabbè
Sergiy Kolodyazhnyy il

@SergiyKolodyazhnyy, hai ragione. Quindi in questo caso lo shebang è lì per rendere robusto lo shellscript nel caso di funzionalità aggiunte in cui la sintassi potrebbe differire.
sudodus,

@SergiyKolodyazhnyy Beh, era solo un suggerimento, quindi ho pensato che non fosse necessario lasciare il commento e che non avrei fatto altro che ingombrare. Sentiti libero di
contattarmi

2

Un altro modo sarebbe quello di avviare la sessione interattiva sudo con sudo -s(non cambia directory) o sudo -i(cambia la directory corrente in home directory principale) e quindi immettere i comandi (senza sudo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.