Uruchom polecenie wymagające sudo po upływie określonego czasu

30

Zwyklę robię

sleep 4h; command

wykonać polecenie po 4 godzinach. Jeśli jednak to polecenie wymaga sudo, nie będzie działać.

Czy sudow chwili uruchomienia sleeppolecenia można wyrazić zgodę ?

Guerlando OC
źródło
W tym konkretnym przypadku myślę, że możesz po prostu użyć shutdown. polecenie sudo i odpowiednie argumenty, aby zaplanować sen o określonej godzinie.
Oarfish
Powiązane:  Preautoryzacja sudo? (Aby można go było uruchomić później)  i  sudo w nieinteraktywnym skrypcie .
G-Man mówi „Przywróć Monikę”
Jakie zadanie musisz wykonać i dlaczego dokładnie 4 godziny snu?
Thorbjørn Ravn Andersen

Odpowiedzi:

46

Służy sudodo uruchamiania powłoki roota, w której uruchamiane są polecenia:

sudo bash -c 'sleep 4h; command'

Każde polecenie działające w powłoce root działa z uprawnieniami roota, co sleepnie boli. Jeśli chcesz uruchomić polecenie z uprawnieniami użytkownika, użyj sudo -u USERNAME COMMANDnp .:

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

Innym podejściem byłoby użycie, sudo visudoaby umożliwić wykonanie polecenia bez dostępu do konta root, zobacz: Jak zezwolić na wykonanie bez pytania o hasło przy użyciu sudo?
Pamiętaj, że w zależności od polecenia może to spowodować lukę w zabezpieczeniach.

deser
źródło
21

Zakładając, że chcesz uruchomić proces tylko raz (nie np. Co 4 godziny), możesz użyć atd

  1. Upewnij się, że ATD działa (w Ubuntu, który jest /etc/init.d/atd statuslub lepiej systemctl status atd)
  2. Na terminalu jako root uruchom następującą komendę:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Jeśli chcesz uruchamiać go co 4 godziny, możesz również użyć crona (jako root) z następującą konfiguracją w twoim crontabie

    0 */4 * * * sh -c $'/path/to/command'
Ama Aje My Fren
źródło
2
Tak, atjest właściwym narzędziem do tego zadania, ponieważ zajmuje się także przekierowaniem We / Wy, nie blokuje okna powłoki i działa nawet wtedy, gdy użytkownik się wylogował lub komputer został ponownie uruchomiony.
Simon Richter
4
@ SimonRichter: sudo bash -c 'sleep 4h && command' &umieszczenie sudo w tle jest łatwiejszym sposobem, aby nie blokować okna / karty powłoki. Jeśli chcesz , aby dane wyjściowe pojawiały się asynchronicznie dla przypomnienia, że ​​tak się stało, to łatwiejsze. Nie działa przy ponownym uruchomieniu, ale w zależności od nohupustawień może pozostać uruchomiony po wyjściu / wylogowaniu z powłoki.
Peter Cordes
4
Zauważ, że aturuchamia polecenie, gdy tylko będzie w stanie, gdy system zostanie zawieszony w określonym czasie, patrz tutaj na U&L - w zależności od polecenia (poleceń), aby to uruchomić, może nie być to, czego chcesz.
deser
2
To tylko sugestia, możesz także użyć systemctl, aby sprawdzić status usługi, zamiast bezpośrednio wywoływać ten skrypt init.d. Chociaż oba wydają się mieć ten sam wynik, myślę, że należy preferować nowoczesny sposób interakcji z usystematyzowanymi usługami:systemctl status atd
Byte Commander
15

Jednym ze sposobów jest uruchomienie za pomocą shellscript z sudouprawnieniami (i podanie hasła podczas uruchamiania shellscript), jeśli shellscript znajduje się w bieżącym katalogu,

sudo ./delayer 4h

gdzie delayermoże być skrypt powłoki z zawartością

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

Zrób to za pomocą

chmod +x delayer

i skopiuj lub przenieś go do katalogu, PATHjeśli chcesz.


Jeśli potrzebujesz bardziej elastycznego skryptu powłoki, w którym możesz wybrać polecenie [wiersz], aby opóźnić wprowadzając parametry, możesz spróbować

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

Przykład demonstracji (krótkie opóźnienie, 5 s, do celów demonstracyjnych),

$ ./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
źródło
3
Cóż, jeśli jest to /bin/shskładnia, wszystko będzie dobrze. Ale jeśli zamierzasz używać funkcji specyficznych dla bash, konieczny jest shebang. Ja i steeldriver gdzieś o tym rozmawialiśmy. Aaand Videonauth usunął swój komentarz, zanim mogłem poprawnie odpowiedzieć. No cóż
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy, masz rację. Tak więc w tym przypadku shebang ma sprawić, że skrypt powłoki będzie niezawodny w przypadku dodanych funkcji, w których składnia może się różnić.
sudodus
@SergiyKolodyazhnyy Cóż, to była tylko sugestia, więc pomyślałem, że zostawienie komentarza nie jest konieczne i tylko zwiększy bałagan. Zapraszam do
kontaktu ze
2

Innym sposobem byłoby rozpoczęcie sesji interaktywnej sudo z sudo -s(nie zmienia katalogu) lub sudo -i(zmienia bieżący katalog na główny katalog główny), a następnie wpisać polecenia (bez sudo)

Ludwik
źródło