Beste Möglichkeit, den Befehl zum Herunterfahren zu entfernen, aber weiterhin einen Neustart durchführen

27

Ich habe ein Gerät vom Typ Raspi in einem Rechenzentrum und habe kürzlich versehentlich einen Befehl zum Herunterfahren in das falsche Terminal auf meinem Bildschirm eingegeben. Gibt es eine Möglichkeit shutdown -r, #poweroff #shutdown -P -HOptionen beizubehalten , aber zu entfernen ?

Ich möchte das shutdown -r Kommando behalten . Ich setze gerne einen Timer ein, wenn es mir gelingt, das System einzufrieren, oder sperre mich mit IP-Tabellenregeln aus. Beispielshutdown -r +10

foxtrot22
quelle

Antworten:

39

Sie sollten eine systemd-basierte Linux-Distribution verwenden. In diesem Fall sollten Sie in der Lage sein, das Ausschaltziel zu maskieren , damit systemd die Ausführung (und das Ausschalten) verweigert. z.B:

systemctl mask poweroff.target

Dies macht es absolut unmöglich, das System herunterzufahren, außer durch einen Neustart. Sehen Sie, dass nichts passiert:

Debian9 animierte Demo

In diesem Fall funktioniert der virtuelle Netzschalter dieser VM nicht mehr, um das System herunterzufahren. Aber es startet immer noch einwandfrei.

Um die Änderung rückgängig zu machen, entlarven Sie einfach das Ziel. Dann können Sie das System herunterfahren.

systemctl unmask poweroff.target
Michael Hampton
quelle
2
Gibt es einen systemd-Befehl, der alle Dienste / Ziele / Geräte mit ihrer Beschreibung auflistet (falls verfügbar)? Ich habe vor kurzem angefangen, darüber zu lesen und würde gerne die Möglichkeiten erkunden.
hjpotter92
1
@ hjpotter92 systemctlOhne Argumente ausführen . Es werden alle aktiven Einheiten, deren Status und Beschreibungen aufgelistet. Hinzufügen --allund es werden auch Einheiten aufgelistet, die nicht aktiv sind.
Michael Hampton
2
@ hjpotter92 Schau mal man systemd.special.
TooTea
16

Es gibt einige Möglichkeiten, dies zu erreichen. Man würde mit einem normalen, nicht privilegierten Konto arbeiten, für das der Befehl mit sudo ausgeführt und ein Kennwort eingegeben werden muss. Anschließend können Sie Folgendes an / etc / sudoers anhängen (indem Sie visudo ausführen):

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *

Fügen Sie außerdem Folgendes hinzu, um das Zwischenspeichern von sudo-Anmeldeinformationen zu deaktivieren:

Defaults timestamp_timeout=0

Dadurch wird verhindert, dass Anmeldeinformationen zwischengespeichert werden, wenn Sie zuvor einen Befehl mit sudo aufgerufen haben.

Beispiel:

[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:

Beachten Sie, dass ich im obigen Beispiel beim Ausführen nicht mein Kennwort eingeben sudo shutdown -r +10musste, für den Rest jedoch. Wenn Sie die Notwendigkeit beseitigen möchten, sudo vor dem Befehl ( sudo shutdown -r +10) einzugeben, fügen Sie Folgendes zu Ihrem .bash_profile oder .bashrc hinzu:

alias shutdown="sudo shutdown"

Beispiel:

[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:

Beachten Sie, dass es empfehlenswert ist, mit einem nicht privilegierten Konto zu arbeiten und bei Bedarf mit sudo zu eskalieren.

John Doe
quelle
1
Dies ist großartig, außer dass bei sudoder Standardkonfiguration die Anmeldeinformationen für einige Zeit nach dem ersten Aufruf zwischengespeichert werden. Dies kann praktisch sein, wenn Befehle wiederholt ausgeführt werden, wie rootdies in einer Benutzersitzung erforderlich ist. In einer solchen Sitzung (oder in der Tat, wenn eine rootShell ausgeführt wird) wäre es durchaus möglich, den Befehl shutdownauszuführen und die Prüfungen zu umgehen.
Cosmic Ossifrage
Danke für die Eingabe. In diesem Fall wird konfiguriert shutdown -r, dass beim Ausführen mit sudo kein Kennwort abgefragt wird. Wenn er ausgeführt wird, werden sudo shutdown -r ...die Anmeldeinformationen daher nicht zwischengespeichert, da sie nicht eingegeben werden. Schauen Sie sich das Beispiel an, das ich oben gegeben habe. Sie können sehen, dass ich es ausgeführt habe, gefolgt von einem sudo shutdown -Hund ich wurde zur Eingabe eines Passworts aufgefordert.
John Doe
3
In der Tat ist das verstanden. Stellen Sie sich jedoch das Szenario vor, in dem dem letzten Befehl ein Präfix sudound keine NOPASSWDOperation vorangestellt wurde . zB ein Aufruf zum Bearbeiten einer Konfigurationsdatei als root. In diesem Fall wird das Kennwort zwischengespeichert und ein nachfolgender Aufruf von wird sudo shutdown -Hdurchlaufen. sudoDas Zwischenspeichern von Passwörtern muss deaktiviert werden, um dies zu vermeiden.
Cosmic Ossifrage
2
In diesem Fall haben Sie Recht, +1 zum Deaktivieren der Kennwortzwischenspeicherung. Habe meinen Kommentar mit dem Vorschlag bearbeitet. Vielen Dank!
John Doe
2
Eigentlich mag ich das überhaupt nicht, gerade weil es sich auf das Vorhandensein der sudo-Passwort-Eingabeaufforderung stützt, um den Benutzer angeblich daran zu erinnern, nicht das zu tun, was sie eigentlich nicht tun sollen. Die Passwortabfrage erfüllt diesen Zweck jedoch nicht. Es wird so häufig nachgefragt, sudodass wir einfach das Passwort eingeben und weitermachen. Sehen Sie sich hier einen alternativen Ansatz mit sudo an (das ist wahrscheinlich viel besser, obwohl es nicht sehr gut ist).
Michael Hampton
10

Es gibt ein Tool namens molly-guard , bei dem Sie den Hostnamen des Computers angeben müssen, den Sie herunterfahren oder neu starten möchten.

Falls Sie Debian nicht verwenden, sollte es trivial sein, dies aus dem Quellcode zu kompilieren, da das Programm eher primitiv ist.

Simon Richter
quelle
9

Um Missgeschicke zu vermeiden, haben RHEL-basierte Distributionen bereits Aliase für eingerichtet rm, cpund mvdiese können etwas destruktiver sein, wenn sie vom Root-Benutzer ausgeführt werden.

Sie könnten Ihre eigenen hinzufügen, zum Beispiel:

#/root/.bashrc
alias poweroff='echo  "poweroff: Command disabled - THINK before you type.
  Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'
HBruijn
quelle
2
Wie bleibt das shutdown -rbeim Deaktivieren shutdown -P -H?
MSalters
3

Benennen Sie die ausführbare Datei zum Herunterfahren in etwas um, das nicht versehentlich aufgerufen werden kann.

Dann alias shutdownsein(whatever) -r

Wes Groleau
quelle
1
Könnten Sie bitte erklären, wie die ausführbare Datei umbenannt wird? Könnte es in Zukunft zu Paket-Upgrades kommen?
AL
2
@AL Könnte es in Zukunft zu Paket-Upgrades kommen? Ja, das könnte es. Es könnte auch Dinge brechen, die bereits installiert sind. Im Allgemeinen ist das Durcheinander mit Teilen der Betriebssysteminstallation eine sehr schlechte Idee.
Andrew Henle
1
Zustimmen. Es genügt ein Alias shutdownfür /sbin/shutdown -r. Eine Umbenennung ist nicht erforderlich. Da sich die Alias-Erweiterung auf einen absoluten Pfad bezieht, unterliegt sie keiner rekursiven Alias-Erweiterung.
MSalters
Eine Einschränkung - ich würde denken, dass "nichts unmöglich ist" - nur unwahrscheinlich
JosephDoggie