Führen Sie einen Befehl aus, der nach Ablauf einer bestimmten Zeit sudo erfordert

30

Normalerweise mache ich

sleep 4h; command

einen Befehl nach 4h ausführen. Wenn dieser Befehl jedoch erforderlich ist sudo, funktioniert er nicht.

Ist es möglich, die sudoErlaubnis zu erteilen, wenn ich den sleepBefehl ausführe?

Guerlando OKs
quelle
In diesem speziellen Fall, denke ich, kann man einfach das benutzen shutdown. Befehl mit sudo und den entsprechenden Argumenten, um den Ruhezustand zu einem bestimmten Zeitpunkt zu planen.
Oarfish
Was ist die Aufgabe, die Sie tun müssen, und warum genau 4 Stunden Schlaf?
Thorbjørn Ravn Andersen

Antworten:

46

Verwenden sudoSie diese Option , um eine Root-Shell zu starten, in der Sie die Befehle ausführen:

sudo bash -c 'sleep 4h; command'

Jeder Befehl, der in der Root-Shell ausgeführt wird, wird mit Root-Berechtigungen ausgeführt, was sleepjedoch nicht schadet. Wenn Sie einen Befehl mit Benutzerberechtigungen ausführen müssen, verwenden Sie sudo -u USERNAME COMMANDzB:

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

Ein anderer Ansatz wäre, sudo visudodie Ausführung des Befehls ohne Root-Zugriff zuzulassen. Weitere Informationen finden Sie unter: So lassen Sie die Ausführung zu, ohne dass Sie zur Eingabe eines Kennworts mit sudo aufgefordert werden.
Beachten Sie, dass dies je nach Befehl zu einer Sicherheitslücke führen kann.

Dessert
quelle
21

Angenommen, Sie möchten den Prozess nur einmal ausführen (nicht z. B. alle 4 Stunden), können Sie ihn verwenden atd

  1. Stellen Sie sicher, dass atd läuft (in Ubuntu /etc/init.d/atd statusoder noch besser systemctl status atd)
  2. Führen Sie an einem Terminal als root Ihren Befehl wie folgt aus:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Wenn Sie es alle 4 Stunden ausführen möchten, können Sie auch cron (als root) mit der folgenden Konfiguration in Ihrer crontab verwenden

    0 */4 * * * sh -c $'/path/to/command'
Ama Aje Mein Fren
quelle
2
Ja, dies atist das richtige Tool für diesen Job, da es auch die E / A-Umleitung übernimmt, kein Shell-Fenster blockiert und auch dann funktioniert, wenn sich der Benutzer abgemeldet hat oder der Computer seitdem neu gestartet wurde.
Simon Richter
4
@SimonRichter: Das Versetzen sudo bash -c 'sleep 4h && command' &von sudo in den Hintergrund ist eine einfachere Möglichkeit, ein Shell-Fenster / eine Shell-Registerkarte nicht zu blockieren. Wenn Sie möchten die Ausgabe Pop - up asynchron als Erinnerung , dass es passiert ist , ist das einfacher. Es funktioniert nicht über Neustarts hinweg, aber abhängig von Ihren nohupEinstellungen kann es nach dem Beenden / Abmelden von einer Shell weiter ausgeführt werden.
Peter Cordes
4
Beachten Sie, dass atder Befehl ausgeführt wird, sobald er in der Lage ist, das System zum angegebenen Zeitpunkt anzuhalten. Weitere Informationen finden Sie hier unter U & L. Abhängig von den auszuführenden Befehlen ist dies möglicherweise nicht das, was Sie möchten.
Dessert
2
Nur ein Vorschlag, Sie können auch systemctl verwenden, um den Dienststatus zu überprüfen, anstatt das init.d-Skript direkt aufzurufen. Obwohl beide scheinbar das gleiche Ergebnis haben, sollte die moderne Art der Interaktion mit systemd-Diensten bevorzugt werden:systemctl status atd
Byte Commander
15

Eine Möglichkeit besteht darin, ein Shellscript mit sudoBerechtigungen auszuführen (und das Kennwort anzugeben, wenn Sie das Shellscript starten), wenn sich das Shellscript im aktuellen Verzeichnis befindet.

sudo ./delayer 4h

wo delayerkann ein shellscript mit dem inhalt sein

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

Machen Sie es ausführbar mit

chmod +x delayer

und kopieren oder verschieben Sie es in ein Verzeichnis, PATHwenn Sie möchten.


Wenn Sie ein flexibleres Shellscript möchten, bei dem Sie den Befehl [Zeile] zum Verzögern auswählen können, indem Sie Parameter eingeben, können Sie es versuchen

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

Demo-Beispiel (kurze Verzögerung, 5s, für Demo-Zwecke),

$ ./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
quelle
3
Nun, wenn es /bin/shSyntax ist, wird es in Ordnung sein. Wenn Sie jedoch bashspezifische Funktionen verwenden möchten, ist shebang erforderlich. Ich und Stahlfahrer hatten irgendwo eine Diskussion darüber. Aaand Videonauth hat seinen Kommentar gelöscht, bevor ich richtig antworten konnte. Na
ja
@SergiyKolodyazhnyy, Sie haben recht. In diesem Fall ist der Shebang also da, um das Shellscript für den Fall von zusätzlichen Funktionen, bei denen die Syntax abweichen kann, robust zu machen.
Sudodus
@SergiyKolodyazhnyy Nun, es war nur ein Vorschlag, also dachte ich, den Kommentar dort zu lassen, sei nicht notwendig und würde nur zur Unordnung beitragen.
Zögern Sie nicht,
2

Eine andere Möglichkeit wäre, die interaktive sudo-Sitzung mit sudo -s(ändert das Verzeichnis nicht) oder sudo -i(ändert das aktuelle Verzeichnis in das Stammverzeichnis) zu starten und dann Ihre Befehle einzugeben (ohne sudo).

Ludwik
quelle