Ein überaus praktisches Feature der Bash ist die Möglichkeit, Kommandos erneut ausführen zu lassen, indem man einfach ein Ausrufezeichen gefolgt von den ersten paar Buchstaben eines Befehls eintippt. Die History wird dabei durchsucht, bis der letzte Befehl gefunden wird, der mit genau diesen Buchstaben anfing. Anschliessend wird er ausgeführt, was allerdings nicht immer das gewünschte Ergebnis liefert.
Beispiel:
Kollege H ist als User root auf einem Server angemeldet und spielt irgendwann ein Backup einer Datenbank ein mit
mysql –u sox –p soxpw sox < /var/backups/sox.bck.2013-01-14.sql
Kollege L meldet sich als root auf dem Server an und hat im Hinterkopf, dass er irgendwann mal
mysql –u root
eingegeben hat.
Kollege L denkt sich: “hach, wie praktisch, Bash History Expansion ist schon genial…” und tippt
!my
Eine Nanosekunde später haut Kollege L auf CTRL-C und verhält sich anschliessend betont unauffällig.
Eine halbe Stunde später schreibt Kollege H: “hat irgendwer was mit der sox-Datenbank gemacht?”
Langer Rede kurzer Sinn: folgende Zeilen, ans Ende von /root/.profile gehängt, sorgen dafür, dass History Expansion ausgeschaltet wird, sobald sich jemand von L’s Rechnern einloggt.
clntaddr=${SSH_CLIENT%% *} if [[ $clntaddr =~ 10.37.112.* ]] || [ $clntaddr = "10.37.2.146" ]; then echo hello lausser set +H fi