Przypadkowo wpisałem hasło w linii poleceń bash

189

Przypadkowo wpisałem hasło w linii poleceń bash, myląc Last login: ...wiersz z Wrong password(bardzo się spieszyłem). Co mam zrobić, żeby zatrzeć ślad?

To, co zrobiłem, to edytowanie .bash_historyi usuwanie obrażającej linii (musiałem ponownie się zalogować, aby zobaczyć hasło pojawiające się w pliku, abym mógł je usunąć, i ponownie się zalogować, aby zniknęło z historii dostępnej pod klawiszem UPARROW).

Czy jest inne miejsce, w którym można zapisać historię poleceń? System to CentOS 6.5.

MaDa
źródło
59
Wystarczy zmienić hasło :)
gronostaj
96
Zmiana hasła nie jest taka prosta ... Muszę poprosić administratora, aby ponownie zainstalował mój nowy klucz publiczny na 15 różnych serwerach - i ten facet jest podobny /dev/null.
MaDa
71
Jeśli nie możesz łatwo zmienić hasła w dowolnym momencie, możesz mieć poważną lukę w zabezpieczeniach. Co zrobisz, gdy ktoś rzeczywiście dostanie twoje hasło? Czy masz jakieś środki, aby natychmiast cofnąć dostęp do systemu?
gronostaj
42
Można zmienić hasło z klucza ssh bez zmiany klucza: ssh-keygen -f id_rsa -p.
jwg
6
Wystarczy wpaść, aby wspomnieć, że przynajmniej pod logowaniem do Windows w sieci, jesteś chowany. Domyślnie admin (w niektórych wysokich serwerach) zapisuje wszystkie próby logowania, a nazwy użytkowników są oczywiście zwykłym tekstem. Jedyne, co musi zrobić przedsiębiorcza osoba, to wyszukiwanie ciągów znaków innych niż nazwa użytkownika i korelowanie ich z następną prawidłową nazwą użytkownika (lub następną próbą logowania na tym samym komputerze). I nie ma prostego sposobu na usunięcie tego pliku dziennika administratora. Więc naprawdę musisz zmienić swoje hasło.
Carl Witthoft,

Odpowiedzi:

184

Możesz usunąć z bashhistorii tylko niepoprawną linię , zamiast wyczyścić całą historię. Po prostu usuń linię z -dflagą, a następnie zapisz (zapisz) nową historię z -wflagą:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
źródło
1
Pamiętaj, że to nie działa, jeśli ustawiłeś „PROMPT_COMMAND = historia -a”. Po wprowadzeniu tego polecenia polecenie z hasłem jest natychmiast zapisywane w historii .bash po wyświetleniu monitu po zakończeniu polecenia. Będziesz musiał edytować swoją .bash_history, aby ją usunąć.
benrifkah
1
Zauważ też, że jeśli wiersz został zapisany w pliku hosta, a później otwartych było wiele powłok (okien terminala), WSZYSTKIE te powłoki będą miały je w historii! Będziesz musiał albo usunąć go ze wszystkich tych pocisków, albo przynajmniej z historii OSTATNIEJ powłoki, którą zamkniesz! Lepiej go zdobyć, zanim powłoka, która go użyła, istnieje. Historia w kontaktach z wieloma pociskami może stać się koszmarem.
Anthony
121

Składają się na to dwie części:

  • bashprzechowuje historię w pliku, ~/.bash_historyktóry jest domyślnie zapisywany na końcu sesji
  • historyktóre są przechowywane w pamięci

Aby być bezpiecznym, musisz usunąć go z sesji:

history -c

i w razie potrzeby obetnij plik historii:

> ~/.bash_history

Jeśli sesja, w której wpisałeś hasło, jest nadal otwarta, innym sposobem na zakrycie śladu jest ustawienie HISTFILEzmiennej na urządzenie zerowe, aby historia nie była zapisywana ~/.bash_historypo zakończeniu sesji:

export HISTFILE=/dev/null
diabelnie
źródło
205
Cześć, to admin!
Raystafarian
5
Pun nie zamierzony, przepraszam :) Nie patrzyłem na twój nick, kiedy pisałem swój komentarz.
MaDa,
7
Zachowując paranoję (a jednak z jakiegoś powodu nadal nie zmieniaj hasła), czy nie powinieneś zrobić shredpliku lub w inny sposób go zastąpić wiele razy?
kojiro
1
@MaDa Nie ma problemu. Dodałem nawet inny sposób w odpowiedzi, aby umieścić mój nick na zdjęciu.
devnull
5
Ustawienie HISTFILE=wystarczy. Od bash(1): Jeśli nieustawione, historia poleceń nie jest zapisywana po wyjściu powłoki.
Lekensteyn,
23

Ponieważ bash (przynajmniej wszystkie historyczne i bieżące wersje, o których wiem) nie zapisuje automatycznie historii do momentu wyjścia, ogólnie obowiązującą strategią po wpisaniu polecenia, którego nie chcesz nigdy zapisywać, jest natychmiastowe wpisanie:

kill -9 $$

To zabija powłokę SIGKILL, której nie można złapać, więc nie ma możliwości ocalenia niczego przy wyjściu.

Większość innych podejść polega na szorowaniu po fakcie (tj. Po tym, jak dane już trafiły na dysk), co ma znacznie większą szansę na błąd (brak kopii), szczególnie jeśli system może używać btrfs lub podobnego.

R ..
źródło
2
+1, nie tylko większa szansa na błąd, można go nawet odzyskać w zależności od tego, czy / ile poleceń zostało wykonanych po nim
Cruncher
Brakuje słowa „automatycznie”? Ponieważ dotancohen pokazał sposób na uratowanie historii bez wychodzenia z powłoki.
Ben Voigt
3
Powłokę można skonfigurować do zapisywania historii po wykonaniu każdego polecenia, zamiast przy wyjściu.
Nick Matteo
1
+1 Właśnie to chciałem polecić! Poza tym, rm ~/.bash_history~aby usunąć plik kopii zapasowej w przypadku PO, gdy został już zapisany
Tomas
Pamiętaj, że to nie działa, jeśli ustawiłeś „PROMPT_COMMAND = historia -a”. Po wprowadzeniu tego polecenia polecenie z hasłem jest natychmiast zapisywane w historii .bash po wyświetleniu monitu po zakończeniu polecenia. Będziesz musiał edytować swoją .bash_history, aby ją usunąć.
benrifkah
11

Po przypadkowym wpisaniu czegoś, czego nie chcesz przechowywać w historii, możesz wpisać: unset HISTFILE

Bash nie będzie wiedział, gdzie przechowywać historię po wylogowaniu, więc w efekcie spowoduje to wyłączenie rejestrowania historii dla całej sesji.

mtak
źródło
Pamiętaj, że to nie działa, jeśli ustawiłeś „PROMPT_COMMAND = historia -a”. Po wprowadzeniu tego polecenia polecenie z hasłem jest natychmiast zapisywane w historii .bash po wyświetleniu monitu po zakończeniu polecenia. Będziesz musiał edytować swoją .bash_history, aby ją usunąć.
benrifkah
11

Moją ulubioną sztuczką jest uderzenie w strzałkę w górę, cofanie się nad poleceniem, wpisanie czegoś (może nie być konieczne), naciśnięcie strzałki w dół, wpisanie „ls” i naciśnięcie klawisza Enter. Czuje się naprawdę hokey, ale tak naprawdę działa. Przekonałem się, kiedy zirytowałem się po edycji niewłaściwego polecenia w mojej historii, a następnie zrujnowaniu go, nie naciskając klawisza Ctrl-C, aby przerwać edycję. Myślę, że bash obsługuje historię rewizjonistyczną. ;-)

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

Wygląda jak:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 
Mark Jerde
źródło
To dziwne . Wadą jest to, że wydaje się, że wiesz, że edytowałeś historię, więc może być jakiś sposób na przywrócenie starej wersji?
MadTux
@MadTux - Całkowicie, ale .bash_history to tylko zwykły plik tekstowy. Możesz więc zrobić powyższy przykład, wyjść i połączyć się ponownie. Gdy przeglądasz pełną zawartość pliku .bash_history, nie ma nic, co by ją różniło od tego, jeśli właśnie uruchomiłeś „cd”, więc ślad jest czysty.
Mark Jerde,
Pamiętaj, że to nie działa, jeśli ustawiłeś „PROMPT_COMMAND = historia -a”. Po wprowadzeniu tego polecenia polecenie z hasłem jest natychmiast zapisywane w historii .bash po wyświetleniu monitu po zakończeniu polecenia. Będziesz musiał edytować swoją .bash_history, aby ją usunąć.
benrifkah
10

Oprócz innych odpowiedzi może być istotne, że hasło znajduje się również w buforze przewijania terminala - historii wyświetlanego tekstu - teraz, a co więcej, prawdopodobnie na dysku twardym, jeśli emulator terminala zapisał historia na dysk. Dzieje się tak w konsoli KDE, gdy rozmiar historii jest ustawiony na „nieograniczone przewijanie”, aby nigdy nie odrzucać żadnych wyników.

Volker Siegel
źródło
6

Za $<space> commandpomocą polecenia nie dodaje się do historii, czasem jest to przydatne

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
źródło
2
Chociaż jest interesujące, nie jest jasne, w jaki sposób jest to przydatne w opisanym scenariuszu. Czy sugerujesz, że każde hasło powinno zaczynać się od spacji?
Ben Voigt
1
Nie, sugeruje on, że dzięki temu miejscu, każdy wpisany wiersz, którego nie chcesz przypisywać historii, powinien zostać wpisany z wiodącym odstępem. np .: „ls” staje się „ls”, a linia ta nigdy nie pojawia się w historii ani na liście strzałek w górę sesji.
Bryan C.
4
Zauważ, że ta sztuczka wiodąca w przestrzeni działa tylko wtedy, gdy $ HISTCONTROL zawiera ignorowanie.
Bernd Jendrissek
2
@ jris198944 Podanie hasła za pomocą argumentu wiersza polecenia może potencjalnie narazić go na działanie w systemie ps.
jamesdlin
2
W każdym razie, chociaż ta sztuczka jest przydatna, jeśli planujesz z wyprzedzeniem, nie pomaga to w oryginalnym scenariuszu, w którym ktoś przypadkowo wprowadził hasło w wierszu polecenia.
jamesdlin
4

Jeszcze inną alternatywą, aby uniknąć zapisywania do pliku historii (przed wylogowaniem), jest po prostu

chmod 400 ~/.bash_history 

a następnie wyloguj się. Zatrzymaj zapisywanie historii do pliku (ponieważ plik jest tylko do odczytu), aby cała sesja bash została odrzucona, a poprzednia historia została zachowana.

Zaloguj się ponownie i zresetuj uprawnienia do 600(lub nie, w zależności od tego, jak jesteś paranoikiem!).

Adam
źródło
1

Widzę wielokrotnie wspomniane

Pamiętaj, że to nie działa, jeśli ustawiłeś „PROMPT_COMMAND = history -a” [..] Będziesz musiał edytować swoją .bash_history, aby ją usunąć.

Pierwsza część jest zdecydowanie prawdą, ale nie musisz uciekać się do ręcznej edycji .bash_history, aby to naprawić. Jeśli połączysz dwa polecenia w jednym wierszu, działa to doskonale:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Floris Kruisselbrink
źródło
Czy możesz wyjaśnić, co dokładnie powoduje, że ta metoda działa?
Kamil Maciorowski
PROMPT_COMMAND jest wykonywany tylko przed wyświetleniem następnego wiersza polecenia. Problem z wprowadzaniem poleceń -d i -w w osobnych wierszach polega na tym, że PROMPT_COMMAND wykona polecenie history -a pomiędzy nimi. Jeśli wykonasz zarówno -d, jak i -w w jednym
wierszu
0

Wiele odpowiedzi tutaj próbuje usunąć dane polecenie z historii sesji curren't bash, zanim zostanie zapisane $HISTFILE(domyślnie ~ / .bash_history). Jeśli jednak ustawisz PROMPT_COMMAND=history -a polecenie za pomocą hasła, zostanie ono natychmiast zapisane, $HISTFILEgdy wyświetli się monit po zakończeniu polecenia. Musisz go edytować, $HISTFILEaby go usunąć.

To ustawienie jest powszechnie używane do przeplatania poleceń z wielu otwartych sesji bash .

benrifkah
źródło
-3

Będziesz także chciał sprawdzić dzienniki syslog. Niepoprawne dane logowania będą na ogół rejestrowane w syslog.

/ var / log / messages lub odpowiednik dla twojego systemu operacyjnego.

bcarroll
źródło
1
Problemem nie jest to, że podał nieprawidłowe hasło, był już zalogowany i podał swoje hasło w wierszu polecenia i naciśnij klawisz Enter. Nie pojawi się to w pliku wiadomości.
MaQleod,