Neulich habe ich einige Wartungsarbeiten auf meinem Webserver durchgeführt. Ich hatte es eilig und war müde, also habe ich alles mit sudo
Kommando gemacht.
Und dann habe ich versehentlich Ctrl+ gedrückt Vund diesen Befehl an meinen Webserver gesendet:
sudo rm -rf /*
Für diejenigen, die sich fragen, was der obige Befehl bewirkt: Dies löschte meinen gesamten Webserver
Zum Glück hatte ich Backups und leider musste ich noch zwei Stunden wach sein, um diesen großartigen Fehler zu beheben. Aber seitdem habe ich mich gefragt:
Gibt es eine Möglichkeit, das sudo-Kennwort immer für einen bestimmten Befehl zu erzwingen?
Wenn der Server mich nach einem Passwort fragen würde, würde ich mir viele Probleme ersparen. Es tat nicht, weil ich ungefähr 5 sudo
Befehle vor diesem majestätischen Fehler ausgeführt habe.
Gibt es einen Weg, dies zu tun? Ich brauche nur das Passwort mit dem rm
Befehl, um immer durchgesetzt zu werden. Andere Befehle, die ich benutze, sind normalerweise nano
oder cp
beide (in gewissem Maße) rückgängig zu machen.
quelle
/*
wird erweitert, bevor es an den Befehl rm übergeben wird. Der Befehl sieht also kein einziges Argument, sondern eine Liste von Argumenten (/bin /boot /cdrom /dev /etc /home
...)rm
Befehl ein Passwort hat. Sie möchten nursudo
jedes Mal, wenn der Befehl rm verwendet wird, eine Eingabeaufforderung eingeben. Die Lösung für die Frage, die Sie verknüpft haben, würde bei Ihrem ersten Befehl etwas ärgerlich werdensudo rm
. Da es Sie nach zwei Passwörtern fragt, eins fürsudo
eins fürrm
.Antworten:
Sie können die festgelegt
timestamp_timeout
auf0
für bestimmte Befehle in/etc/sudoers
. Erstellen Sie eine Dateivisudo -f /etc/sudoers.d/pduck
mit folgendem Inhalt:Jetzt wird der Benutzer
pduck
beim Ausführen immer nach einem Kennwort gefragtsudo rm
(unabhängig davon, welche zusätzlichen Parameter angegeben sind), obwohl der Benutzer Mitglied dersudo
Gruppe ist undsudo
sich sein Kennwort für andere Befehle merkt.Der Nachteil ist, dass Sie der
/bin/rm
Zeile in der Datei nicht einfach Parameter hinzufügen können, um dies weiter einzuschränken. Nun ... Sie können, wie:Aber dann werden Sie nur genau
sudo rm -f
und nicht (erneut)sudo rm -rf
zum Beispiel dazu aufgefordert .quelle
Eine Methode wäre die Verwendung von safe-rm . Dies wird NUR die Verwendung von "rm" ansprechen und verhindern, dass bestimmte Versionen von "rm" ausgeführt werden. Dies schließt das Entfernen Ihres Root-Systems ein, kann aber auch dazu verwendet werden, das Entfernen systembezogener Verzeichnisse wie "/ usr /" oder "/ var /" zu verhindern. Über den Link:
quelle
sudo
bietet eine Option-k, --reset-timestamp
, sieheman sudo
:Sie könnten einen einfachen Wrapper zum
sudo
Testen schreibenrm -rf /*
und Ausführenstattdessen zB so:
Anwendungsbeispiel
Testen mit
echo a
hier.Wenn Sie bei jeder Ausführung
rm
im Allgemeinen gefragt werden möchten , können Sie die obige Funktion wie folgt anpassen:Wenn Sie sowohl allgemeine Befehlsaufrufe als auch bestimmte Befehlszeilen kombinieren möchten, empfehle ich die Verwendung von
case
z. B .:Beachten Sie, dass diese Ansätze nicht funktionieren, wenn Sie
sudo
mit Optionen arbeiten. Mögliche Lösungen sind[[ "$*" =~ " rm " ]]
, nach der Zeichenfolge "rm" zu suchen, die von Leerzeichen umgeben ist, oder*" rm "*)
mitcase
, um eine Befehlszeile mit "rm" abzufangen.quelle
[[ "$1" == "rm" ]] && opt="-k";
und wie wäre es/bin/rm
?case
Ansatz.Diese Antwort bezieht sich nicht auf den
sudo
Teil Ihrer Frage, sondern auf eine Möglichkeit, die Gefahr von versehentlichenrm
Aufrufen für einen Benutzer zu verringern .Sie können einen Alias
rm
fürrm -I
welche erstellen-f
welche der vorherigen-I
Optionen überschreibt .--one-file-system
ist ein weiterer möglicher Schutz gegen unbeabsichtigtes Löschen, den ich in meinemrm
Alias verwende.Installieren
Verwenden Sie den folgenden Befehl, um einen solchen Alias zu erstellen:
Sie können es in Ihre
~/.bashrc
oder sogar setzen/etc/bash.bashrc
.Verwendung
Um die Eingabe
yes
oder die Übersetzung in Ihr Gebietsschema oder den ersten Buchstaben eines Wortes zu bestätigen, drücken Sie Enter. Jede andere Eingabe, einschließlich keiner, bricht den Vorgang ab.quelle