Kommandozeilen-Sicherheitstricks [geschlossen]


34

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 ".


3
+1 für Verweis auf "Am Anfang war die Befehlszeile" cryptonomicon.com/command.zip
Avery Payne

Ist das nicht eine Community-Wiki-Frage? Es wird keine Antwort geben, die verbindlich oder vollständig ist.
Bill Weiss

Antworten:


45

Eine Funktion, die gut funktioniert, ist die Verwendung verschiedener Hintergrundfarben auf Ihrer Shell für Prod- / Staging- / Testserver.


6
Ja, und verwenden Sie auch leuchtend schreiendes Rot oder Orange, wenn Sie Root-Rechte haben.
Adam D'Amico

1
Gibt es eine Möglichkeit, die Farbe der Remote-Computerterminals automatisch so einzustellen, dass sie von Ihrer Anmeldezeit abweicht? Gnome benutzen - Vielleicht sollte dies eine separate Frage sein.
Jona

2
Habe einfach eine switch-Anweisung, die deine PS1-Variable abhängig vom Hostnamen des Rechners ändert.
Neil

2
Für alle Windows-Benutzer gibt es dieses Juwel von Sysinternals, das Host-Informationen auf dem Hintergrundbild hervorhebt. technet.microsoft.com/en-us/sysinternals/…
squillman

Ja, ja, ja - meine Produktions-iSeries-Sitzung ist jetzt weiß auf rot, um mich daran zu hindern: Neustart der Option pwrdwnsys (* IMMED) (* YES)
Peter T. LaComb Jr.

14

Denken Sie daran, bevor Sie anfangen, einen Plan für das Zurücksetzen zu erstellen.

  • ZIPen Sie eine Datei / ein Verzeichnis, anstatt es sofort zu löschen
  • Stellen Sie den (Cisco-) Router so ein, dass er in 'x' Minuten neu startet und nicht sofort 'wr'
  • Stellen Sie sicher, dass die Schnittstelle, die Sie ändern, nicht die ist, auf der Sie das System betreten haben. Dies kann die Router-Schnittstelle sein, an die Sie telneten, oder der Ethernet-Port, an den VNC-Verbindungen hergestellt wurden.
  • niemals als 'root' einloggen
  • Erstelle eine Sicherung. Überprüfen Sie, ob es gut ist. mach noch einen.
  • Fragen Sie jemanden, dem Sie vertrauen. "Bin ich dabei, hier etwas Dummes zu tun?"

3
+1 Cisco ios nicht speichern, bis es funktioniert. Verdammt, ich erinnere mich an die Amiga-Tage, als alle OS-Dialoge "Verwenden", "Speichern" und "Abbrechen" hatten - wobei "Verwenden" die Einstellungen nur übernahm, sie aber nicht für den nächsten Neustart speicherte. Das war äußerst nützlich!
Oskar Duveborn

Ich denke, eine noch bessere Lösung besteht heute darin, alle Systemänderungen unbegrenzt rückgängig zu machen - auf diese Weise sind Sie viel sicherer. Natürlich, wenn die Einstellung, die Sie geändert haben, die Funktion zum Rückgängigmachen des Systems unbrauchbar machen würde, wären Sie sowieso
durcheinander

1
+1 für "Nachladen in 5". Ich habe meinen Hintern mehr als ein paar Mal gespeichert, als mich eine ACL-Änderung von einem entfernten Router / Switch ferngehalten hat.
Greg Work

+1 für den letzten Punkt - Sanity Check. Einfach zu tun, und dann haben Sie mindestens zwei Personen mit begründetem Interesse, um alle auftretenden Probleme zu beheben;)
Ashley

10

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):

  • Melden Sie sich zuerst als normaler Benutzer sudo su - rootan 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 .
  • Jeder Befehl wird eingegeben, aber die [Return] -Taste wird niemals gedrückt. Niemals .
  • Kein Befehl wird jemals ausgeführt, ohne genau zu verstehen , was er tut. Wenn Sie dies tun, ohne zu wissen, was es tut, spielen Sie russisches Roulette mit Ihrem System.
  • Vor dem Drücken der [Return] -Taste wird der Befehl, der auf der CLI ausgegeben wurde, sorgfältig per Auge überprüft. Wenn es ein Zögern oder einen Hinweis auf ein mögliches Problem gibt, wird es erneut überprüft. Wenn dieses Zögern anhält, bleibt der Befehl in der Zeile und ich drücke Alt-F2 auf eine andere Konsole, um Manpages usw. aufzurufen. Wenn ich mich in einer grafischen Sitzung befinde, starte ich einen Browser und führe eine Suche durch.
  • Kein gewöhnlicher Benutzer wird jemals sudoan 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 cdin das Verzeichnis und benutze dann ein Präfix von, ./um sicherzustellen, dass das Verzeichnis korrekt ist, d. H

cd /usr/some/directory ; rm ./targetfile

oder ich gebe den gesamten Pfad der Datei an

rm /usr/some/directory/targetfile

Das ist eine PITA, aber ... besser sicher als leid.


1
Ich gebe sudo nur für eine vorausgewählte Liste von Befehlen aus, wie zum Beispiel apache2 reload. Ansonsten müssen Benutzer mich durchgehen. Es ist eine Qual, aber die beste Verteidigung, um eine Devbox für 15 Leute zu betreiben.
Artem Russakovskii

2
Zitat: "Aber ohne Vorbereitung und Training ist das so, als würde man einem Affen eine geladene Waffe geben. Es ist amüsant und macht erst Spaß, bis der Affe auf den Lauf schaut und drückt ..." Eigentlich ist es nach diesem Punkt immer noch lustig. .. nur ziemlich chaotisch
Mikeage

Sie sollten sudo -i anstelle von sudo su verwenden, und im Allgemeinen ist es sicherer, sudo zum Ausführen bestimmter Befehle zu verwenden.
LapTop006

Wie führe ich den Befehl aus, wenn ich NIE die Eingabetaste drücke?
g.

1
&& ist dein Freund! Anstatt cd / usr / some / directory auszuführen; rm ./targetfile sollten Sie cd / usr / some / directory && rm ./targetfile Auf diese Weise werden Sie nie rm'ing targetfile in Ihrem ursprünglichen Verzeichnis aufwickeln, wenn die CD fehlschlug. Es ist jedoch besser, den vollen Weg zu gehen.
Mike G.

10

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:

  1. Admin-Powershell-Konsolenfenster haben eine dunkelrote Hintergrundfarbe
  2. Administrator wird zum Titel hinzugefügt
  3. Die Meldung "Warnung: PowerShell wird als Administrator ausgeführt." wird beim Start geschrieben
  4. Der Titelleiste wird "Administrator:" vorangestellt.
  5. Standard-Dienstprogramme (wie Corporate Shell-Skripte, vim und infozip) befinden sich im Pfad.
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ())
& {
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        (get-host) .UI.RawUI.Backgroundcolor = "DarkRed"
        klarer Wirt
        Write-Host "Warnung: PowerShell wird als Administrator ausgeführt."
    }

    $ utilities = $ null
    if ([IntPtr] :: size * 8 -eq 64)
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)" 
        $ utilities = "$ {env: programfiles (x86)} \ Utilities"
    }
    sonst
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x86)"
        $ utilities = "$ {env: programfiles} \ Utilities"
    }
    if ((Test-Path $ utilities) -und! ($ env: path -match $ utilities.Replace ("\", "\\")))
    {
        $ env: path = "$ utilities; $ {env: path}"
    }
}

Funktion Eingabeaufforderung
{
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        if (! $ host.UI.RawUI.WindowTitle.StartsWith ("Administrator:"))
        {$ Host.UI.RawUI.WindowTitle = "Administrator:" + $ host.UI.RawUI.WindowTitle}
    }
    'PS' + $ (if ($ nestedpromptlevel -ge 1) {'>>'}) + '>'
}

Das ist cool - ich wünschte, Sie könnten so etwas problemlos unter Linux auf all Ihren Servern ausführen.
Jason Tan

1
In Powershell erfolgt dies durch Bearbeiten von $ pshome / profile.ps1 (Maschinenprofil). Warum können Sie unter Linux in /etc/.bash_profile nichts Vergleichbares tun?
Brian Reiter

2
Auch nützlich, um $ ConfirmPreference in "medium" zu ändern (Standardeinstellung "high"), und um weitere Dinge zur Bestätigung aufzufordern.
Richard

6

Ich kann allen obigen Antworten zustimmen, aber ich muss diesen sehr, sehr wichtigen Tipp hervorheben:

Wissen Sie, wann Sie Multitasking vermeiden sollten.


5

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 getan

export PS1="(chroot) $PS1"

wann immer ich in einer chroot arbeitete.


1
+1 - Ich finde es auch hilfreich, das aktuelle Arbeitsverzeichnis (oder die letzten n Ebenen davon, wenn Sie in tief verschachtelten Dateisystemen arbeiten) in der Eingabeaufforderung zu haben.
Murali Suriar

Das offizielle Gentoo-Handbuch schlägt genau das vor, wenn Sie von der Live-CD auf das neu erstellte Gentoo!
CD1

CD1: Ja, aber die x86-Schnellinstallationsanleitung ( gentoo.org/doc/de/gentoo-x86-quickinstall.xml ) funktioniert nicht, und genau das habe ich damals verwendet. Aber jetzt mache ich es reflexartig :)
Tim

5

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).


4

Wenn Sie es noch nicht getan haben, geben Sie alias rm bis rm -i ein


7
Nein nein Nein Nein. Dies ist eines der schlimmsten Dinge, die Sie tun können. Eines Tages wirst du dich auf einer Kiste wiederfinden, auf der es keinen Alias ​​gibt, oder du hast unser Env irgendwie zerstört. Lernen Sie stattdessen, rm -i zu verwenden.
olle

Nein nein Nein Nein. Mach das. Eines Tages wirst du versehentlich das Falsche tun und dich selbst retten. Es kommt öfter vor, dass Sie vergessen, -i in die Leitung zu stellen und das Falsche zu vermasseln und zu löschen.
Jerub

Ich würde es nicht tun, wenn ich jemals an mehr als einer Maschine arbeiten würde ... Mit einer neuen Maschine zu arbeiten, bis sie eingerichtet ist, ist eine zu große Herausforderung.
Slovon

Das Schreckliche ist, dass sowohl @olle als auch @Jerub Recht haben. Vielleicht wäre es klug, einige, möglicherweise farbige, Flaggen in die PS1 zu setzen, die "Sicherheit aus" / "Sicherheit ein"
anzeigen

4

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.


Was ist ein "Molly Guard", den ich noch nie gehört habe?
Jason Tan


4

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.


3

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:

alias srm='rm -i'

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.


2
Nochmals - NIEMALS ALIAS "rm". Sie werden irgendwann verarscht sein, wenn Sie an einem System arbeiten, bei dem kein Alias ​​vorliegt.
SilentW

Eine sehr schlechte Idee. Wenn Sie sich jemals auf Mac OS X (vielleicht auf anderen Plattformen?) Wiederfinden, entfernen Sie srmes sicher !
morgant

3

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.


2

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.


2

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.


2

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.


2

Wenn Sie bash verwenden, versuchen Sie Folgendes:

TMOUT=600

in deinem /root/.bashrcoder ä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.


2
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`

Ein sehr zu empfehlender Alias, den Sie haben sollten, wenn Sie jemals die mysql-CLI verwenden.


1

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.


1

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.


Ich habe gelernt, nie "cd dir; rm -rf *", sondern immer "rm -rf dir", so spezifisch wie möglich.
Slovon

1

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:

unset PATH

Auf diese Weise müssen Sie / bin / rm anstelle von "rm" ausführen. Diese zusätzlichen Zeichen könnten Sie zum Nachdenken anregen.


OK, wo ist dieser Befehl, den ich ausführen möchte? which $COMMANDfunktioniert nicht mehr.
Kevin M

/ usr / bin / $ COMMAND suchen?
Bill Weiss

Noch besser, / usr / bin / locate -r / $ COMMAND $
Bill Weiss

1

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.


1

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 ...

$ ls *.bak
$ echo rm *.bak
$ rm * .bak

... 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.


1

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)


1

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.


Ich habe das auf dem Backup-Server eines früheren Arbeitgebers erfahren. Während es lief, liefen die Bänder der Nacht. Ow.
Bill Weiss

1
Sie könnten stattdessen pkill verwenden, das unter Solaris und Linux funktioniert.
Jason Tan

0

Anstatt

rm foo*

verwenden

rm -i foo*

Dies ist praktisch für eine Handvoll Dateien, aber nicht für einen ganzen Tarball. Das ist der Grund, warum Aliasing rmin die Quere kommt.


Dafür gibt es den Schalter -f: Alle vorherigen Schalter -i überschreiben. Wenn Sie dies in Ihr .bash_profile-Skript oder ein ähnliches Shell-Initialisierungsskript einfügen, müssen Sie sich darüber keine Gedanken machen. Stellen Sie einfach sicher, dass Sie das tun möchten, aber es wurde schon früher und beredter gesagt.
Kevin M

0

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! $.

echo foo*
rm -rf !$

Das! $ Wird bis zum letzten Wort des letzten Befehls erweitert, entspricht also

echo foo*
rm -rf foo*

Es gibt auch! *, Das sich auf alle Argumente bis zum letzten Befehl erstreckt.

Sie können es auch so machen, wenn Sie es vorziehen

echo rm -rf foo*
!*

(Wenn Sie ksh und nicht bash verwenden, können Sie stattdessen Esc + Punkt eingeben, um das letzte Wort einzufügen.)


Esc +. funktioniert auch in bash
olle

0

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.


Ick. Ich verwende lieber meine Pfeiltasten und bearbeite die vorherige Zeile. Auf diese Weise kann ich sehen, welcher Befehl ausgeführt wird, wenn ich die Eingabetaste drücke, anstatt mich blindlings darauf zu verlassen, dass das Substitutionsmuster richtig ist.
Marius Gedminas

Beispiel: Nach "echo rm * .php" führen Sie <Nach oben> <Nach Hause> <Alt-D> und dann <Eingabe> aus.
Marius Gedminas

0

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 :-)


-1

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.


+1 für den Rofl-Faktor
David Z

Wie soll "rm-rf" Ihnen schaden?
Kubanczyk

Vielleicht wurde die Datei tatsächlich "-rf *" genannt?
Marius Gedminas

-1

Anstelle der Verwendung rm -rf <dir>stellen die -rfwie 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.