Es ist bekannt, dass zusätzlicher Speicherplatz in env.variable zum Löschen des Verzeichnisses / im Bash-Skript führen kann.
#!/bin/bash
...
rm -rf /$MYPATH
Wenn $ MYPATH Werte wie "dir" oder "dir /" enthält , führt dies zu "rm -rf / dir" oder "rm -rf dir /" . Und führt zu "rm -rf /"
Gibt es Best Practices, um diese Situation zu verhindern?
rm of / is not allowed
Antworten:
IIRC --preserve-root ist die Standardeinstellung in neueren Versionen von Coreutils.
quelle
shopt -s expand_aliases
Aliase nicht in Skripten erweitert , es sei denn, Sie tun dies . Aliasingrm
ist auch eine schlechte Idee - was ist, wenn Sie vom Aliasing-Verhalten abhängig sind und der Alias nicht vorhanden ist? Einige Versionen von habenrm
möglicherweise nicht--preserve-root
.Zitieren Sie immer Ihre Argumente. Selbst wenn Sie wissen, dass sie gesund sind, tut es fast nie weh, sie in Skripten zu zitieren.
rm -rf "/$FOO"
wird nicht gelöscht / wenn $ FOO ein führendes Leerzeichen hat, werden Sie stattdessen einfach nichts löschen. Dies setzt voraus, dass die Anführungszeichen in der Zeile vorhanden sindrm -rf
und natürlich nicht Folgendes enthalten:Wenn Sie das tun , werden Sie wieder in eine Menge Ärger geraten.
Außerdem neige ich dazu, einen guten alten zu denken:
(Oder
-e
wenn es nur eine Datei ist) ist immer eine gute Idee, bevor Sie etwas löschen.quelle
Das Wichtigste zuerst: Backups haben. :-)
Aber während ich diese potenziell gefährlichen Skripte zerhacke, gebe ich immer zuerst die gefährlichen Zeilen wieder, damit ich sehen kann, was passieren würde.
Sie können auch eine Datei mit dem Namen
-i
wichtiger Verzeichnisse hinzufügen , sodass rm in einigen Situationen beim Versuch, diese zu entfernen, zur Eingabe aufgefordert wird. Wenn Sie das Löschen über eine andere Methode wie das Perl-Skript oder sogar mit anderen rm-Parametern durchführen, hilft dies natürlich nicht weiter.Es ist auch möglich, ein unveränderliches Flag für wichtige Dateien und Verzeichnisse zu setzen
chattr +i
, aber seien Sie vorsichtig mit diesem. Das kann dich beißen , wenn Sie tatsächlich sollen Dateien aus einem Verzeichnis entfernen oder die Dateien ändern ...quelle
Eine Möglichkeit, das Problem zu vermeiden, besteht darin, ein Betriebssystem zu verwenden, das verhindert, dass ein solcher Befehl aufgrund seines Designs erfolgreich ist, da er möglicherweise nicht POSIX-kompatibel ist. Es wurde von Solaris 10 (2005) initiiert, gefolgt von BSD und Gnu rm im Jahr 2006.
quelle
Überprüfen Sie zuerst Ihren Code. Im Ernst, alles, was Ihnen jemand sagt, entspricht nur der Überprüfung, die Sie in Ihrem Code hätten durchführen sollen, um den Wert von $ MYPATH zu überprüfen. Wenn das Skript interaktiv ausgeführt wird, können Sie das -f entfernen.
quelle
Sie können die
MYPATH
Variable trimmen , bevor Sie den Befehl rm ausführen. Verwenden Sie einfach echo:quelle
Nach einem peinlichen Vorfall vor vielen Jahren auf einer Ultrix-Box, bei der ich als Root ein
userdel -r sccs
(oder Ultrix-Äquivalent, es ist lange her) durchgeführt habe, ohne vorher zu überprüfen, wie das Home-Verzeichnis des sccs-Benutzers war, und das $ HOME des sccs-Benutzers sich herausstellte /, und das Dateisystem ging weg, ich habe es vermieden,rm -rf $ANYTHING
Skripte einzufügen. Sie können die Variable überprüfen, bis Sie ein blaues Gesicht haben. Stattdessen drucke ich eine Nachricht aus wie "Wenn Sie mit der Idee zufrieden sind, sollten Sie sie jetzt ausführensudo rm -rf $ANYTHING
".quelle
Sie könnten MYPATH durch sed führen und überprüfen, ob das, was Sie eingeben, das gleiche ist, was Sie herausholen
quelle
Sie machen hier eine wirklich lustige Sache, indem Sie einen relativen Weg einschlagen und ihn in einen absoluten verwandeln. Wenn Sie den angegebenen Pfad als den angegebenen Pfad behandeln, ist dies ein guter Anfang, um das zu erreichen, was Sie möchten. Befolgen Sie jedoch die Ratschläge anderer Kommentatoren und zitieren Sie auf jeden Fall alles.
quelle