Ich habe versehentlich ein Passwort in die Bash-Befehlszeile eingegeben

189

Ich habe versehentlich mein Passwort in die Bash-Befehlszeile eingegeben und die Last login: ...Zeile für falsch gehalten Wrong password(ich hatte es eilig). Was mache ich, um meine Spur abzudecken?

Ich .bash_historyhabe die betreffende Zeile bearbeitet und gelöscht (musste mich einmal neu anmelden, damit das Kennwort in der Datei angezeigt wurde, damit ich es löschen konnte, und erneut anmelden, damit es aus dem unter UPARROW-Taste verfügbaren Verlauf verschwindet).

Gibt es einen anderen Ort, an dem der Befehlsverlauf gespeichert werden könnte? Das System ist CentOS 6.5.

MaDa
quelle
59
Ändern Sie einfach das Passwort :)
Gronostaj
96
Das Passwort zu ändern ist nicht so einfach ... Ich muss den Administrator bitten, meinen neuen öffentlichen Schlüssel auf 15 verschiedenen Servern neu zu installieren - und der Typ ist wie /dev/null.
MaDa
71
Wenn Sie Ihr Passwort zu keinem Zeitpunkt leicht ändern können, besteht möglicherweise eine schwerwiegende Sicherheitslücke. Was wirst du tun, wenn jemand dein Passwort bekommt? Können Sie den Systemzugriff sofort widerrufen?
Gronostaj
42
Sie können das Passwort eines SSH - Schlüssel ändern , ohne den Schlüssel zu ändern: ssh-keygen -f id_rsa -p.
JWG
6
Kommen Sie einfach vorbei, um zu erwähnen, dass Sie zumindest unter vernetzten Windows-Anmeldungen abgespritzt sind. Der Administrator (in einigen hochrangigen Servertürmen) zeichnet standardmäßig alle Anmeldeversuche auf, und die Benutzernamen sind natürlich Klartext. Alles, was eine unternehmerische Person tun muss, ist, nach Zeichenfolgen zu suchen, die nicht für den Benutzernamen bestimmt sind, und sie mit dem nächsten gültigen Benutzernamen (oder dem nächsten Anmeldeversuch auf demselben Computer) zu korrelieren. Und es gibt keine einfache Möglichkeit, diese Admin-Protokolldatei zu löschen. Also musst du wirklich dein Passwort ändern.
Carl Witthoft

Antworten:

184

Sie können nur die fehlerhafte Zeile aus dem Verlauf entfernen bash, anstatt den gesamten Verlauf zu löschen. Entfernen Sie einfach die Zeile mit dem -dFlag und speichern Sie den neuen Verlauf mit dem -wFlag:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
quelle
1
Beachten Sie, dass dies nicht funktioniert, wenn Sie "PROMPT_COMMAND = history -a" festgelegt haben. Mit dieser Option wird der Befehl mit Ihrem Kennwort sofort in Ihre .bash_history geschrieben, wenn die Eingabeaufforderung nach Beendigung des Befehls angezeigt wird. Sie müssen Ihre .bash_history bearbeiten, um sie zu entfernen.
Benrifkah
1
Beachten Sie auch, dass, wenn die Zeile in die Hostory-Datei geschrieben wurde und später mehrere Shells (Terminal-Fenster) geöffnet wurden, ALLE diese Shells diese in der Verlaufsgeschichte haben! Sie müssen es entweder aus all diesen Shells entfernen oder zumindest aus der Verlaufs-LETZTEN Shell, die Sie schließen! Es ist besser, es vor der Shell abzurufen, die es verwendet hat. Geschichte im Umgang mit mehreren Muscheln kann zum Albtraum werden.
Anthony
121

Dazu gibt es zwei Teile:

  • bashSpeichert den Verlauf in einer Datei, in ~/.bash_historydie standardmäßig am Ende der Sitzung geschrieben wird
  • das history, was in Erinnerung bleibt

Um sicher zu gehen, müssen Sie es aus der Sitzung löschen:

history -c

und kürzen Sie die Verlaufsdatei nach Bedarf:

> ~/.bash_history

Wenn Ihre Sitzung , in dem Sie das Passwort eingegeben haben noch geöffnet ist, dann eine andere Art und Weise zu Ihrer Spur zu decken ist , die festlegen HISTFILEVariable auf die Null - Gerät so , dass die Geschichte nicht geschrieben werden würde , ~/.bash_historywenn die Sitzung verlässt:

export HISTFILE=/dev/null
devnull
quelle
205
Hey schau, es ist der Admin!
Raystafarian
5
Wortspiel nicht beabsichtigt, sorry :) Ich habe deinen Nick nicht angesehen, als ich meinen Kommentar geschrieben habe.
MaDa
7
Um paranoid zu sein (und dennoch aus irgendeinem Grund Ihr Passwort nicht zu ändern), sollten Sie shreddie Datei nicht mehrmals überschreiben oder auf andere Weise?
Kojiro
1
@MaDa Kein Problem. Ich habe der Antwort sogar einen anderen Weg hinzugefügt, um meinen Nick ins Bild zu bringen.
Devnull
5
Einstellung HISTFILE=ist genug. Von bash(1): Wenn nicht festgelegt, wird der Befehlsverlauf beim Beenden einer Shell nicht gespeichert.
Lekensteyn
23

Da bash (zumindest alle mir bekannten früheren und aktuellen Versionen) den Verlauf nicht automatisch speichert, bis Sie das Programm beenden, sollten Sie nach Eingabe eines Befehls, der niemals gespeichert werden soll, sofort Folgendes eingeben:

kill -9 $$

Dies tötet die Shell mit SIGKILL, die nicht abgefangen werden kann, so dass die Shell beim Beenden keine Möglichkeit hat, etwas zu speichern.

Bei den meisten anderen Ansätzen wird nachträglich gescrubbt (dh nachdem die Daten bereits auf der Festplatte abgelegt wurden), was die Wahrscheinlichkeit von Fehlern (Fehlen einer Kopie) erheblich erhöht, insbesondere wenn das System möglicherweise btrfs oder ähnliches verwendet.

R ..
quelle
2
+1, nicht nur mehr Wahrscheinlichkeit eines Fehlers, es kann sogar wiederherstellbar sein, je nachdem, ob / wie viele Befehle danach ausgeführt wurden
Cruncher
Vermissen Sie das Wort "automatisch"? Denn dotancohen hat einen Weg aufgezeigt, den Verlauf zu speichern, ohne die Shell zu verlassen.
Ben Voigt
3
Die Shell kann so konfiguriert werden, dass der Verlauf nach Ausführung jedes Befehls statt beim Beenden gespeichert wird.
Nick Matteo
1
+1 Genau das wollte ich empfehlen! Außerdem rm ~/.bash_history~, um die Sicherungsdatei im OP-Fall zu entfernen, wenn sie bereits gespeichert wurde
Tomas
Beachten Sie, dass dies nicht funktioniert, wenn Sie "PROMPT_COMMAND = history -a" festgelegt haben. Mit dieser Option wird der Befehl mit Ihrem Kennwort sofort in Ihre .bash_history geschrieben, wenn die Eingabeaufforderung nach Beendigung des Befehls angezeigt wird. Sie müssen Ihre .bash_history bearbeiten, um sie zu entfernen.
Benrifkah
11

Nachdem Sie versehentlich etwas eingegeben haben, das nicht im Verlauf gespeichert werden soll, können Sie Folgendes eingeben: unset HISTFILE

Bash weiß nicht, wo der Verlauf gespeichert werden soll, wenn Sie sich abmelden. Auf diese Weise wird die Verlaufsprotokollierung für die gesamte Sitzung deaktiviert.

mtak
quelle
Beachten Sie, dass dies nicht funktioniert, wenn Sie "PROMPT_COMMAND = history -a" festgelegt haben. Mit dieser Option wird der Befehl mit Ihrem Kennwort sofort in Ihre .bash_history geschrieben, wenn die Eingabeaufforderung nach Beendigung des Befehls angezeigt wird. Sie müssen Ihre .bash_history bearbeiten, um sie zu entfernen.
Benrifkah
11

Mein Lieblingstrick dabei ist, den Aufwärtspfeil zu drücken, die Rücktaste über dem Befehl zu drücken, etwas einzugeben (möglicherweise nicht erforderlich), den Abwärtspfeil zu drücken, "ls" einzugeben und die Eingabetaste zu drücken. Fühlt sich wirklich hokey an, aber es funktioniert tatsächlich. Das habe ich herausgefunden, als ich mich darüber geärgert habe, dass ich den falschen Befehl in meinem Verlauf bearbeitet und ihn dann ruiniert habe, indem ich nicht die Tastenkombination Strg-C gedrückt habe, um die Bearbeitung abzubrechen. Ich denke, Bash unterstützt die revisionistische Geschichte. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Sieht aus wie:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 
Mark Jerde
quelle
Das ist komisch . Ein Nachteil ist, dass Sie wahrscheinlich wissen, dass Sie den Verlauf bearbeitet haben. Gibt es also eine Möglichkeit, die alte Version wiederherzustellen?
MadTux
@MadTux - Völlig, aber die .bash_history ist nur eine reine Textdatei. So können Sie das obige Beispiel ausführen, beenden und die Verbindung wiederherstellen. Wenn Sie den vollständigen Inhalt der .bash_history-Datei anzeigen, gibt es keinen Unterschied zu "cd", sodass der Trail sauber ist.
Mark Jerde
Beachten Sie, dass dies nicht funktioniert, wenn Sie "PROMPT_COMMAND = history -a" festgelegt haben. Mit dieser Option wird der Befehl mit Ihrem Kennwort sofort in Ihre .bash_history geschrieben, wenn die Eingabeaufforderung nach Beendigung des Befehls angezeigt wird. Sie müssen Ihre .bash_history bearbeiten, um sie zu entfernen.
Benrifkah
10

Zusätzlich zu den anderen Antworten kann es relevant sein, dass das Kennwort jetzt auch im Bildlaufpuffer des Terminals - der Historie des angezeigten Texts - und, was eher ein Problem ist, möglicherweise auf der Festplatte gefunden wird, wenn der Terminalemulator das gespeichert hat Geschichte auf die Festplatte. Dies geschieht in KDE-Konsolen, wenn die Verlaufsgröße auf "unbegrenztes Zurückscrollen" eingestellt ist, um keine Ausgabe zu verwerfen.

Volker Siegel
quelle
6

Mit $<space> commandwird ein Befehl nicht zum Verlauf hinzugefügt, was manchmal nützlich ist

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
quelle
2
Es ist zwar interessant, aber es ist nicht klar, wie nützlich dies in dem beschriebenen Szenario ist. Schlagen Sie vor, dass jedes Kennwort mit einem Leerzeichen beginnen sollte?
Ben Voigt
1
Nein, was er vorschlägt, ist, dass mit dieser Option jede Zeile, die Sie eingeben, die Sie nicht für den Verlauf festlegen möchten, mit einem führenden Leerzeichen abgeschrieben werden sollte. Beispiel: "ls" wird zu "ls", und diese Zeile wird weder im Verlauf noch in der Liste der Aufwärtspfeile Ihrer Sitzungen angezeigt.
Bryan C.
4
Beachten Sie, dass dieser Trick mit dem führenden Leerzeichen nur funktioniert, wenn $ HISTCONTROL Leerzeichen enthält.
Bernd Jendrissek
2
@ jris198944 Wenn Sie ein Kennwort über ein Befehlszeilenargument bereitstellen, kann es potenziell allen Benutzern des Systems angezeigt werden, die ausgeführt werden ps.
Jamesdlin
2
Auch wenn dieser Trick nützlich ist, wenn Sie im Voraus planen, hilft dies nicht für das ursprüngliche Szenario, in dem jemand versehentlich ein Kennwort in einer Befehlszeile eingegeben hat.
Jamesdlin
4

Eine weitere Alternative, um das Speichern in der Verlaufsdatei zu vermeiden (bevor Sie sich abmelden), ist einfach zu

chmod 400 ~/.bash_history 

und dann abmelden. Beenden Sie das Schreiben des Verlaufs in eine Datei (da die Datei schreibgeschützt ist), damit die gesamte Bash-Sitzung verworfen und der vorherige Verlauf beibehalten wird.

Melden Sie sich erneut an und setzen Sie die Berechtigungen auf zurück 600(oder nicht, je nachdem, wie paranoid Sie sind!).

Adam
quelle
1

Ich sehe immer wieder erwähnt

Beachten Sie, dass dies nicht funktioniert, wenn Sie "PROMPT_COMMAND = history -a" [..] festgelegt haben. Sie müssen Ihre .bash_history bearbeiten, um sie zu entfernen.

Der erste Teil ist definitiv wahr, aber Sie müssen nicht manuell .bash_history bearbeiten, um es zu beheben. Wenn Sie die beiden Befehle in einer Zeile kombinieren, funktioniert dies einwandfrei:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Floris Kruisselbrink
quelle
Können Sie erklären, warum diese Methode genau funktioniert?
Kamil Maciorowski
Der PROMPT_COMMAND wird erst ausgeführt, bevor die nächste Eingabeaufforderung angezeigt wird. Das Problem bei der Eingabe der Befehle -d und -w in separaten Zeilen besteht darin, dass PROMPT_COMMAND den Befehl history -a dazwischen ausführt. Wenn Sie sowohl -d als auch -w in einer
Befehlszeile
0

Viele der Antworten hier versuchen, den fraglichen Befehl aus dem Verlauf der aktuellen Bash-Sitzung zu entfernen, bevor er in $HISTFILE(standardmäßig ~ / .bash_history) geschrieben wird. Wenn Sie PROMPT_COMMAND=history -a den Befehl jedoch mit Ihrem Kennwort festgelegt haben, wird er sofort an Ihre $HISTFILEAdresse gesendet, wenn die Eingabeaufforderung nach Beendigung des Befehls angezeigt wird. Sie müssen Ihre bearbeiten $HISTFILE, um es zu entfernen.

Diese Einstellung wird häufig zum Verschachteln von Befehlen aus mehreren offenen Bash-Sitzungen verwendet .

benrifkah
quelle
-3

Sie sollten auch die Syslog-Protokolle überprüfen. Ungültige Anmeldungen werden im Allgemeinen bei syslog protokolliert.

/ var / log / messages oder das Äquivalent für Ihr Betriebssystem.

bcarroll
quelle
1
Das Problem ist nicht, dass er ein falsches Passwort eingegeben hat. Er war bereits angemeldet und hat sein Passwort in die Eingabeaufforderung eingegeben und die Eingabetaste gedrückt. Dies wird in der Nachrichtendatei nicht angezeigt.
MaQleod