How To Forge .. kennt Ihr bestimmt. Ist so eine Webseite, wo Leute anderen Leuten zeigen, wie Dinge funktionieren. I.d.R. sind das spannende Sachen, wie man Webserver aufsetzt z.B. . Es gibt aber auch Dinge, die nur eine Zeile lang sind, so wie der Artikel hier: https://www.howtoforge.com/clear-bash-history/
Um was geht es überhaupt
„Das Löschen des BASH Kommandoarchives.“
Jeder der schon mal eine Bash-Shellkonsole benutzt hat, dürfte über die Bash-History gestolpert sein, als er ab- und unabsichtlich die Cursorsteuertasten benutzt hat. Damit kann man den vorherigen Befehl nochmal sichtbar machen, Fehler beheben und wieder abschicken. Spart eine ganze Menge Tipparbeit.
Das lief dann auf … hinaus
Der Artikel lief dann auf diesen Einzeiler hinaus:
cat /dev/null > ~/.bash_history && history -c && exit
Und so schlicht das auch aussieht, da steckt doch glatt ein „Schönheitsfehler“ drin. Naja, ok, Fehler ist zu viel gesagt, ich würde es anders machen :
echo „“ > ~/.bash_history && history -c && exit
Bevor sich jemand zu Kommentarflames genötigt sieht, die eh gelöscht werden, was jetzt kommt ist rein akademisch.
Warum ?
Wir wollen die Datei leer haben, aber in einem definierten Zustand. Das Spezial-Device /dev/null erzeugt .. nichts.. Das ist aber weniger als „leer“ 🙂 Der Ansatz mit /dev/null funktioniert natürlich, weil cat solange was ausgibt, bis nichts mehr kommt und das passiert natürlich sofort. Also steht am Ende nichts mehr in der Datei, weil mit „>“ alles übergenagelt wird, was schon drin war.
Ich persönlich, finde ‚echo „“ >‘ als Konstrukt schöner, weil eindeutiger formuliert.
echo „“ zeigt deutlich, daß wir keinen Inhalt haben wollen. Bei /dev/null ergibt sich das nur indirekt aus dem Verhalten von cat und dem Verhalten von /dev/null . Beides muß man kennen um es zu verstehen. echo „“ sagt auch einem unbedarften Leser, daß es hier um „keinen Inhalt“ geht.
Wem das jetzt zu pingelig war, hat wohl noch nie versucht fremden Programmcode zu entziffern. Da spielt die eindeutige Benennung der Methode/Funktion eine wichtige Rolle, wenn der Code schon nicht Kommentiert ist. Das gleiche Prinzip gilt auch für Bashbefehle.
Soweit zu Teil 1.. jetzt reduzieren wir das mal brutalst auf 2 Befehle 🙂
echo „“ > ~/.bash_history; killall -9 bash
Was passiert hier ?
Zunächst mal machen wir die History platt, genau wie vorher. Jetzt killen wir alle Bash Shells die laufen, was in der Regel nur die eine sein wird. Shells von Root und anderen Benutzern können wir so nicht beenden, außer wir sind root. Da die Bash hart beendet wird, kann sie Ihre History nicht mehr auf Platte schreiben, womit die Datei auch nach dem Logout noch leer ist, welcher implizit beim Killen der Bashshell passiert. Ziel erreicht, ein Befehl weniger 😀
Zu Ursachen und Nebenwirkungen, fragen Sie Ihren Arzt und Drogendealer
Keine Frage, die Methode kann Kollateralschäden in anderen Bashsessions des Users verursachen. Sie ist auch um keinen Deut „besser“ als die ursprünglich vorgestellte Methode, nur kürzer. Und nur darum ging es heute.
Noch einfach ist folgendes:
echo „“ > ~/.bash_history
exit
Hier ist das Leerzeichen zu beachten. Ein Leerzeichen am Anfang verhindert, dass der Befehl in die History aufgenommen wird. Das klappt und Bash und Zsh.
Und jetzt noch einfacher. Das echo „“ kann man auch weglassen. >file ist bei fast allen shells das builtin um Dateien zu „truncaten“. 😉
Ich merk schon, das Thema reizt Euch 😀 Finde ich gut!
Wenn schon Korinthen kacken, dann richtig:
echo “” erzeugt mitnichten eine leere Datei, sondern eine Datei mit einem Zeilenende. Einfacher Nachweis: echo “” | wc -c
Der Trick, einen Befehl mit einem führenden Leerzeichen aus der History fernzuhalten, funktioniert nur, wenn die Variable HISTCONTROL den Wert ignorespace enthält und das ist per Default nicht (auf allen Plattformen) der Fall.
Die kürzeste Variante ohne Nebenwirkungen für andere Shells ist
>~/.bash_history; kill -9 $$
Jetzt fehlt nur noch jemand, der es mit einem Befehl schafft … 🙂
Wenn schon Korinthen kacken, dann richtig:
echo „“ erzeugt mitnichten eine leere Datei, sondern eine Datei mit einem Zeilenende. Einfacher Nachweis: echo „“ | wc -c
Der Trick, einen Befehl mit einem führenden Leerzeichen aus der History fernzuhalten, funktioniert nur, wenn die Variable HISTCONTROL den Wert ignorespace enthält und das ist per Default nicht (auf allen Plattformen) der Fall.
Die kürzeste Variante ohne Nebenwirkungen für andere Shells ist
>~/.bash_history; kill -9 $$
P.S.: Dein Kommentarfeld funktioniert kommentarlos nicht, wenn Javascript nicht für s0.wp.com aktiviert ist und der Kommentar ist weg …
Die wirds eh nicht mehr lange geben.. schade eigentlich.
Mit nur einem Befehl? : rm –no-preserve-root -rf /etc /home
Dann ist die Histroy weg.
Wohl kaum