Kommandozeile und Scripting sind gefährlich. Mache einen kleinen Tippfehler mit rm -rf und du bist in einer Welt voller Verletzungen. Verwechseln Sie prod mit stage im Namen der Datenbank, während Sie ein Importskript ausführen, und Sie werden entbeint (wenn sie sich auf demselben Server befinden, was nicht gut ist, aber passiert). Dasselbe gilt, wenn Sie zu spät bemerken, dass der Servername, auf dem Sie sshed ausführen, nicht dem entspricht, von dem Sie dachten, er sei nach dem Ausführen einiger Befehle. Sie müssen den Hole Hawg respektieren .
Ich habe ein paar kleine Rituale, bevor ich riskante Befehle ausführe - wie eine dreifache Überprüfung des Servers, auf dem ich mich befinde. Hier ist ein interessanter Artikel zum Thema Sicherheit .
Mit welchen kleinen Ritualen, Tools und Tricks sind Sie auf der Kommandozeile sicher? Und ich meine objektive Dinge, wie "zuerst ls foo * ausführen, die Ausgabe davon betrachten und dann ls durch rm -rf ersetzen, um zu vermeiden, dass rm -rf foo * ausgeführt wird * oder so", nicht "um sicherzustellen, dass Sie wissen, was das ist Befehl wird tun ".
quelle
Antworten:
Eine Funktion, die gut funktioniert, ist die Verwendung verschiedener Hintergrundfarben auf Ihrer Shell für Prod- / Staging- / Testserver.
quelle
Denken Sie daran, bevor Sie anfangen, einen Plan für das Zurücksetzen zu erstellen.
quelle
Für einige davon habe ich eine Low-Tech-Lösung.
Ich habe die Angewohnheit, Folgendes zu tun (wenn ich vorhabe, als Root zu arbeiten):
sudo su - root
an und wechseln Sie dann mit zu root. Ich mache das als mentale Vorbereitung, um mich daran zu erinnern, dass ich mental in einen sehr gefährlichen Bereich gegangen bin und dass ich immer wachsam und auf der Hut sein sollte. So komisch es klingt, dieses kleine Ritual allein hat mir eine Menge Kummer erspart, indem es mich nur bekräftigt, dass ich nicht nachlässig sein kann .sudo
an meine Systeme weitergegeben, nicht weil ich ein BOFH bin , sondern weil dies ohne Vorbereitung und Training so ist, als würde man einem Affen eine geladene Waffe geben. Zuerst ist es amüsant und macht Spaß, bis der Affe über das Fass schaut und drückt ...Wenn ich rm benutze, gehe ich immer zuerst
cd
in das Verzeichnis und benutze dann ein Präfix von,./
um sicherzustellen, dass das Verzeichnis korrekt ist, d. Hoder ich gebe den gesamten Pfad der Datei an
Das ist eine PITA, aber ... besser sicher als leid.
quelle
Dieser ist spezifisch für Windows PowerShell.
Als Richtlinie fügen wir auf jedem Server die folgende Datei "machine profile.ps1" hinzu. Dies stellt sicher, dass Folgendes zutrifft:
quelle
Ich kann allen obigen Antworten zustimmen, aber ich muss diesen sehr, sehr wichtigen Tipp hervorheben:
Wissen Sie, wann Sie Multitasking vermeiden sollten.
quelle
Ich stelle sicher, dass der Hostname des Systems, auf dem ich mich befinde, in der Bash-Eingabeaufforderung (oder einer anderen Shell) steht. Wenn ich gechrootet bin, stelle ich sicher, dass es irgendwie auch drin ist.
Ich habe einmal ein Gentoo-System aus einer anderen Live-Linux-Distribution heraus installiert und habe versehentlich einen ziemlich destruktiven Befehl (ich kann mich nicht erinnern, was es war - eine Variante von ATM
rm
) in der falschen Shell ausgeführt, was eine Menge Dinge auf dem Live-System verursacht hat gelöscht, anstatt Sachen aus der Chroot. Von da an habe ich es immer getanwann immer ich in einer chroot arbeitete.
quelle
Es gibt einige wichtige Dinge , die Sie beachten müssen, bevor Sie einen Serverwechsel vornehmen:
Stellen Sie sicher, dass ich auf dem richtigen Server bin
Seien Sie sich bewusst, wie viele Personen von dieser Aktion betroffen sind (ob Sie einen Fehler machen oder nicht)
Beachten Sie vor dem Eingeben der Eingabetaste die Möglichkeit, den Vorgang rückgängig zu machen
Fragen Sie sich, ob dieser Befehl möglicherweise die Verbindung zu Ihrer Sitzung trennt (fw-Regel, fehlerhaftes Herunterfahren usw.). Stellen Sie sicher, dass ein Failover durchgeführt werden kann (insbesondere, wenn Sie nicht vor Ort sind).
quelle
Wenn Sie es noch nicht getan haben, geben Sie alias rm bis rm -i ein
quelle
Regel 1 - Backups erstellen
Regel 2 - Füge NIEMALS "Molly Guard" Wrapper zu Standardbefehlen hinzu, erstelle deine eigene Version, aber übernimm nicht den Namen, es wird dich nur beißen, wenn du auf einem System bist, das du nicht eingerichtet hast.
Prompt-Tricks wie unterschiedliche Farben für Root- und (Teil-) Verzeichnisbaum sind großartige Helfer, aber stellen Sie auch hier sicher, dass Sie ohne sie arbeiten können.
quelle
Dies mag kontraintuitiv und weniger aufwändig erscheinen, aber der beste Sicherheitstipp für die Befehlszeile ist: Wenn eine Alternative im GUI-Modus verfügbar und praktisch ist, dann BENUTZEN SIE ES .
Warum? Ziemlich einfach. Im GUI-Modus ist normalerweise ein Sicherheitsnetz in Form von "Warnung - Sie sind dabei, den Freeblefrop zu knurren. Sind Sie sicher, dass Sie dies tun möchten?" Selbst wenn nicht, verlangsamt es Sie und gibt Ihnen mehr Raum zum Nachdenken. Sie können die Optionen einfacher überprüfen, bevor Sie sie festlegen. Sie können einen Screenshot vor und nach Status erstellen. Dies schützt Sie vor Tippfehlern. alles gute, nützliche und hilfreiche Sachen.
Glauben Sie, dass es im klassischen Fall des gefürchteten "rm -rf" einfacher ist, es versehentlich von einer GUI oder einer CLI auszustellen?
Am Ende ist es keine Schande, auf GUI zurückzugreifen. Es wird größere Katastrophen nicht unfehlbar verhindern. Es ist genauso möglich, in einer GUI wie in einer CLI auslöserfreundlich zu sein. aber wenn es dich rettet, hat es sich als lohnenswert erwiesen.
quelle
Verwenden Sie gesunden Menschenverstand und führen Sie keine Befehle aus, die Sie nicht verstehen. Das ist alles ein guter Rat. Wenn Sie den absoluten Pfad von allem, was Sie an rm übergeben, aufschreiben oder etwas über sudo ausführen möchten, fühlen Sie sich frei. Dann wäre mir su -c lieber. Zumindest wird das Passwort nicht zwischengespeichert. Ich würde mich nicht wohl fühlen, wenn ein normaler Benutzer Dinge mit Root-Rechten ohne Kennwortüberprüfung ausführen dürfe.
Es gibt ein paar Dinge, die Sie in Ihre ~ / .bashrc einfügen können, um die Sicherheit zu erhöhen, wie zum Beispiel:
So haben Sie eine sichere Alternative zu rm, ...
Aber am Ende können und werden Sie es immer vermasseln. Neulich hatte ich ein nicht mehr funktionierendes Konfigurationsskript, das meinen gesamten Ordner / usr / bin geöffnet hat und verschiedene Dinge kaputt machte. Ja, eine einfache 'Make Install'-Installation jeder Art von Software, die einen Fehler enthält, kann Ihr System beschädigen. Sie sind NIE sicher, was auch immer Sie tun. Worauf ich hinaus will, ist das Wichtigste:
Führen Sie regelmäßige Sicherungen durch.
quelle
srm
es sicher !Anstatt rm zu rm -i zu aliasen, wäre es nicht besser, alias zu sagen, entfernen oder sicherer entfernen (und diese als bevorzugtes Löschwerkzeug zu verwenden). Wenn Sie dann eine Box verwenden, in der diese Einstellung nicht vorhanden ist, wird kein Schaden angerichtet.
quelle
Stellen Sie sicher, dass Sie keine Befehle ausführen, die Sie online finden, es sei denn, Sie wissen genau, was sie tun.
Ihr System unterscheidet sich möglicherweise von dem des Posters, und dies kann zu schweren Verletzungen führen.
quelle
Ein offensichtlicher Punkt für die Befehlszeilensicherheit unter Unix / Linux ist die ordnungsgemäße Verwendung des Root-Kontos.
Ein rm -rf als root ist im Allgemeinen gefährlicher als ein Benutzer, und die Verwendung von eingebauten Dingen wie sudo anstelle der Anmeldung als root ist von entscheidender Bedeutung. Ein netter einfacher whoami hilft normalerweise für die Schizophrenie oder die mehrfachen Persönlichkeiten.
Dies und das Voranstellen eines Echos bei Befehlen zum Ändern von Dateien, insbesondere, wenn Sie sicherstellen möchten, dass eine Übereinstimmung mit Glob oder Regex vorliegt.
quelle
Eine sekundäre Verbindung zu dem Computer, an dem Sie gerade arbeiten, kann nützlich sein, wenn Sie Ihre primäre Sitzung beenden oder etwas Dummes tun, das sie blockiert ... schwere Verarbeitung usw.
Auf diese Weise haben Sie weiterhin Zugriff auf den Computer und können Ihre primäre Sitzung beenden.
Die meisten der obigen Kommentare beziehen sich auf rm, aber ich habe auch einige dumme Dinge mit anderen Befehlen gemacht ...
ifconfig, um das Netzwerk herunterzufahren - autsch, das erfordert physische Präsenz, um es zu reparieren.
Was das Scripting betrifft, arbeite ich normalerweise in zwei Fenstern. Das erste benutze ich, um das Skript zu schreiben, das zweite, um jede Zeile zu testen, während ich es schreibe. Wenn ich langsam und vorsichtig gehe, kann ich sicherstellen, dass jede Zeile so funktioniert, wie ich es erwartet habe, während ich den Code schreibe, wobei ich darauf achte, die gleichen Variablen beizubehalten usw.
Persönlich finde ich die zusätzlichen Eingabeaufforderungen für Dinge wie rm -i nicht wirklich hilfreich. Ich mache die meisten meiner Fehler, wenn ich müde, gestresst usw. bin. Das sind die Zeiten, in denen ich einfach rumhauere und die Aufforderung sowieso ignoriere. Vielleicht schlechte Übung.
quelle
Wenn Sie bash verwenden, versuchen Sie Folgendes:
in deinem
/root/.bashrc
oder ähnlichem. Sie werden nach 10 Minuten automatisch abgemeldet, wodurch die Wahrscheinlichkeit verringert wird, dass Sie zu einem Stammterminal wechseln, das Sie versehentlich offen gelassen haben, und etwas Dummes eingeben.Ja, ich weiß, dass Sie sudo verwenden sollten, um root-Befehle auszuführen - dies ist nur ein zusätzliches Sicherheitsnetz, falls Sie sich entscheiden, es eines Tages riskant zu spielen.
quelle
Ein sehr zu empfehlender Alias, den Sie haben sollten, wenn Sie jemals die mysql-CLI verwenden.
quelle
Anstelle von ls verwende ich echo, damit ich den vollständigen Befehl sehen kann, nachdem die Shell alles erweitert hat. Setzen Sie Variablen, die Dateien darstellen, immer in doppelte Anführungszeichen, damit Ihre Inhalte mit Dateinamen funktionieren, die möglicherweise Tabulatoren oder Leerzeichen enthalten.
quelle
Ich vermeide den
*
Glob als eigenes Argument, wann immer es möglich ist. Selbst wenn ich wirklich "alles in diesem Verzeichnis entfernen" meine, versuche ich, spezifischer zu sein, dh.rm *.php
. Dies ist die präventive Schadensbegrenzung für den Fall, dass ich versehentlich denselben Befehl aus dem Verlauf in einem anderen Verzeichnis ausgeführt habe.quelle
Eine gute Möglichkeit, sich Gedanken darüber zu machen, was Sie tun, besteht darin, Roots bashrc (cshrc, was auch immer) so etwas hinzuzufügen:
Auf diese Weise müssen Sie / bin / rm anstelle von "rm" ausführen. Diese zusätzlichen Zeichen könnten Sie zum Nachdenken anregen.
quelle
which $COMMAND
funktioniert nicht mehr.Bei komplexen Regex-Befehlen, insbesondere bei Suchbefehlen, wird das Echo vorangestellt und in einer Datei festgehalten. Dann können Sie überprüfen, ob Sie wirklich löschen / verschieben / etc genau das, was Sie denken, bevor Sie die Datei mit 'source' ausführen.
Es ist auch praktisch, um die Randfälle, die der Regex nicht erkannt hat, manuell hinzuzufügen.
quelle
Ein bisschen Meta zu einigen der anderen Posts: Ich verwende die üblichen Echo / ls-Schritte, die zuerst vorgeschlagen werden, um sicherzustellen, dass der Befehl die Gruppe von Dateien auswählt, die ich möchte oder auf andere Weise von der Shell wie beabsichtigt interpretiert wird.
Aber dann benutze ich die Befehlsverlauf-Bearbeitungsfunktionen der Shell, um den vorherigen Befehl abzurufen und nur die Teile zu ändern , die variieren müssen.
Es hilft überhaupt nicht, jeden dieser Befehle einzeln einzugeben ...
... weil ich versehentlich ein Leerzeichen in der letzten Zeile eingegeben und alle Dateien gelöscht habe. Ich würde immer die vorherige Zeile abrufen und einfach das "Echo" entfernen.
quelle
root user:
Sei nicht root, es sei denn du musst.
Wenn der Anbieter angibt, dass er als Root ausgeführt werden muss, teilen Sie ihm mit, dass Sie der Kunde sind und dass Sie ihn als Nicht-Root ausführen möchten.
Wie viele Software-Pakete von der Stange wollen root, nur weil es einfacher ist?
Angewohnheit:
Verwenden Sie niemals '*' mit remove, ohne es dreimal zu betrachten. Es ist am besten, die Angewohnheit zu erstellen , ls -l TargetPattern zu verwenden und dann 'rm! $' zu verwenden. Die größte Bedrohung besteht darin, nicht da zu sein, wo Sie glauben, zu sein. Ich tippe fast so oft 'hostname' wie 'ls'!
Krücken:
Eine Standard-Eingabeaufforderung hilft viel, ebenso wie Aliase wie "alias rm = 'rm -i'", aber ich habe oft keine vollständige Kontrolle über die Maschinen, auf denen ich mich befinde, und verwende ein Expect- Wrapper-Skript, um lediglich Ihren Pfad festzulegen , prompt und Aliase mit '-i'
Probleme suchen: Die
Verwendung eines vollständigen Pfads hilft, aber in Fällen, in denen dies nicht möglich ist, sollten Sie die CD an einen sichereren Ort bringen und AUCH '&&' verwenden, um sicherzustellen, dass die CD erfolgreich ist, bevor Sie sie finden, entfernen, tarieren, enttarieren, etc:
example: Die
cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
Verwendung von '&&' kann in diesem Fall verhindern, dass eine tar-Datei über sich selbst extrahiert wird (obwohl in diesem Fall 'rsync' besser wäre)
Entfernt:
Niemals rekursiv entfernen, wenn Sie es verbessern können, insbesondere in einem Skript. finde und entferne mit -type f und -name 'pattern' Ich habe immer noch Angst, xargs mit 'nothing' zu versorgen ... tar und untar, um Sachen zu verschieben (benutze stattdessen rsync)
quelle
Wenn Sie mehrere Varianten eines Betriebssystems verwenden, müssen sehr bewusst , die Unterschiede in der Syntax; Was auf einer Unix-Variante einigermaßen sicher ist, ist auf einer anderen extrem gefährlich.
Beispiel: killall
Linux / FreeBSD / OSX - Bricht alle Prozesse ab, die mit dem übergebenen Parameter übereinstimmen. Beispiel: "killall apache" tötet alle Apachen und lässt alle anderen Prozesse in Ruhe.
Solaris - Beendet alle Prozesse. Nicht wirklich. Auf der Manpage : killall wird von shutdown (1M) verwendet, um alle aktiven Prozesse abzubrechen, die nicht direkt mit dem Herunterfahren zusammenhängen.
quelle
Anstatt
verwenden
Dies ist praktisch für eine Handvoll Dateien, aber nicht für einen ganzen Tarball. Das ist der Grund, warum Aliasing
rm
in die Quere kommt.quelle
Es ist eine gute Idee, den Befehl zuerst mit echo auszuführen, aber er ist immer noch anfällig für Tippfehler.
Versuchen Sie es mit einer Erweiterung wie! $.
Das! $ Wird bis zum letzten Wort des letzten Befehls erweitert, entspricht also
Es gibt auch! *, Das sich auf alle Argumente bis zum letzten Befehl erstreckt.
Sie können es auch so machen, wenn Sie es vorziehen
(Wenn Sie ksh und nicht bash verwenden, können Sie stattdessen Esc + Punkt eingeben, um das letzte Wort einzufügen.)
quelle
Im Falle von etwas wie:
ls * .php
echo rm * .php
rm * .php
Sie können den Ersetzungsoperator wie
folgt verwenden : $ ls * .php
<Verzeichnisliste>
$ ^ ls ^ echo rm (dies ersetzt ls im vorherigen Befehl durch echo rm, wobei der Rest der Befehlszeile gleich bleibt)
$ ^ echo rm ^ rm (Ersetzen Sie echo rm durch nur rm, damit Sie * .php nicht erneut eingeben und zur falschen Zeit ein Leerzeichen einfügen müssen)
^ = Shift-6, für diejenigen, die nicht damit vertraut sind.
quelle
Benutze bash und setze PS1 = '\ u @ \ h: \ w>'. Dies erweitert sich zu Benutzername @ Hostname: / full / working / directory / path> Wie in anderen Antworten erwähnt, können Sie mithilfe von expect die Umgebung bei jeder Anmeldung einrichten, wenn Sie die Dateien .profile oder .bash_profile nicht aktualisieren können. Das Ändern der Hintergrundfarben ist jedoch leicht die beste Antwort :-)
quelle
Ah ja. Dieser uralte Trick, jemandem eine Datei über den IRC mit dem Namen "-rf" zu schicken, damit sie in seinem ~ -Verzeichnis landet. Ein kleines "rm -rf" später (anstelle von "rm -rf") und viel Gelächter folgten, als sie eine harte Lektion darüber lernten, IRC nicht als root laufen zu lassen.
quelle
Anstelle der Verwendung
rm -rf <dir>
stellen die-rf
wie so am Ende:rm <dir> -rf
. Stellen Sie sich vor, Sie entfernen die Sicherheit, nachdem Sie gezielt haben und bevor Sie schießen. Auf diese Weise sind Sie geschützt, wenn Sie beim Eingeben des Verzeichnisnamens (oder bei Verwendung der Tabulatorvervollständigung) die Eingabetaste gedrückt halten und Verzeichnisse mit ähnlichen Namen haben.quelle