Usunięcie z pliku historii za pomocą linii poleceń można zrealizować w dwóch krokach:
history -d <line_number>
powoduje usunięcie określonego wiersza z historii w pamięci. history -w
zapisuje bieżącą historię w pamięci do pliku ~/.bash_history
. Te dwa kroki razem usuwają wiersz na stałe z pamięci historii oraz z pliku .bashhistory_.
Aby zapobiec dodaniu polecenia do historii w pierwszej kolejności, upewnij się, że zmienna środowiskowa HISTCONTROL
zawiera wśród swoich wartości rozdzielonych dwukropkami wartość ignorespace
, na przykład (dodaj np. do .bashrc
):
$ export HISTCONTROL=ignorespace
Zapobiegnie to dodaniu do historii każdego polecenia z początkową spacją. Możesz wtedy całkowicie wyczyścić historię, uruchamiając
$ history -c -w
^-- additional space character
```.
Po pierwsze, jeśli polecenie, które zamierzasz wydać jest wrażliwe, niebezpieczne, lub po prostu nie chcesz, aby zaśmiecało historię, najlepiej/najszybciej jest po prostu nie dopuścić, aby w ogóle weszło do historii. Upewnij się, że $HISTCONTROL
zawiera ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Następnie wykonaj spacją każde polecenie, którego nie chcesz w historii:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Jeśli przypadkowo umieścisz niechciane polecenie w historii, pod warunkiem, że twoja sesja bash jest wciąż otwarta, polecenie nie dotknęło jeszcze dysku. Aby skasować poprzednie polecenie w historii, wydaj:
(bash)$ history -d $((HISTCMD-1))
Uwaga na spację na początku; to polecenie wymaga ignorespace
, w przeciwnym razie samo się skasuje!
Jeśli chcesz skasować kilka ostatnich poleceń, znajdź ostatni i pierwszy numer historii:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn
W tym przypadku 602 i 599. Następnie wydaj:
(bash)$ for i in {602..599}; do history -d $i; done “`
(Bez ignorespace
byłoby to 603..599.)
Jeśli nie chcesz, aby jakakakolwiek historia z bieżącej sesji trafiła na dysk, wyjdź używając:
(bash)$ kill -9 $$
Dotychczasowe podejście polega na tym, aby nie pozwalać nawet na zapisywanie wrażliwych elementów historii na dysku dla dodatkowego bezpieczeństwa, ponieważ teoretycznie dane usunięte z nieulotnych nośników nadal mogą być odzyskane.
Jeśli jednak polecenie(a), które chcesz usunąć pochodzą z poprzedniej sesji, to zostaną one już dołączone do $HISTFILE
przy wyjściu. Manipulowanie historią za pomocą powyższych poleceń nadal będzie dodawać tylko pozostałe nowe elementy do $HISTFILE
, przy wyjściu. Aby nadpisać plik $HISTFILE
widokiem całej historii bieżącej sesji, już teraz, wydaj:
(bash)$ history -w
Oczywiście dla elementów historii już znajdujących się na dysku, alternatywą do edycji historii za pomocą poleceń history -d
, a następnie wydania history -w
, jest edycja $HISTFILE
za pomocą edytora tekstu.t-work
602 otherwise-unwanted
”`
W tym przypadku 602 i 599. Następnie wydaj:
0x1&
(Bez 0x6& byłoby to 603..599.)
Jeśli nie chcesz, aby jakakakolwiek historia z bieżącej sesji trafiła na dysk, wyjdź używając:
0x1&
Dotychczasowe podejście polega na tym, aby nie pozwalać nawet na zapisywanie wrażliwych elementów historii na dysku dla dodatkowego bezpieczeństwa, ponieważ teoretycznie dane usunięte z nieulotnych nośników nadal mogą być odzyskane.
Jeśli jednak polecenie(a), które chcesz usunąć pochodzą z poprzedniej sesji, to zostaną one już dołączone do 0x6& przy wyjściu. Manipulowanie historią za pomocą powyższych poleceń nadal będzie dodawać tylko pozostałe nowe elementy do 0x6&, przy wyjściu. Aby nadpisać plik 0x6& widokiem całej historii bieżącej sesji, już teraz, wydaj:
0x1&
Oczywiście dla elementów historii już znajdujących się na dysku, alternatywą do edycji historii za pomocą poleceń 0x6&, a następnie wydania 0x6&, jest edycja 0x6& za pomocą edytora tekstu.
Kilka technik:
Jeśli wpisałeś jakieś hasło w wierszu poleceń, a następnie zorientowałeś się, że wszystkie polecenia są rejestrowane, możesz albo:
Wymusić wyjście z bieżącej sesji bez zapisywania historii:
Wpisać ↑ (strzałka w górę) w otwartej sesji basha aż do wyświetlenia wrażliwych informacji, następnie użyć klawiszy edycji linii, takich jak Ctrl+W, aby usunąć wrażliwe informacje, a następnie następnie ↓ (strzałka w dół) aż do wyświetlenia nowej pustej linii, przed wpisaniem Enter.
Jeśli zdajesz sobie sprawę, że poufne informacje są już zapisane i chcesz je usunąć, ale nie całą historię:
Proste polecenie sed
mogłoby wykonać to zadanie:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
ale, gdy to wpisujesz, tworzysz kolejny wiersz historii zawierający wzorzec wyszukiwania (wrażliwe informacje), który próbujesz usunąć. Mógłbyś więc:
sed -e "/$(head -n1)/d" -i .bash_history
To uruchomi head -n1
z wejściem z terminala. Będzie się wydawać, że twój terminal jest zawieszony (nie będzie znaku zachęty); po prostu wpisz informacje, które chcesz usunąć z pliku. Jest to sztuczka pozwalająca na wprowadzenie (części) polecenia bez wpisywania go do wiersza poleceń, co czyni je niekwalifikującym się do włączenia do zapisu historii. Następnie sed
użyje wpisanego przez Ciebie tekstu do przeszukania .bash_history
i usunięcia wszystkich wierszy zawierających poufne informacje. Uwaga: jeśli wzorzec wrażliwych informacji zawiera ukośniki, musisz je wyłączyć za pomocą odwrotnych ukośników, albo zmienić polecenie sed
tak, aby używało tej składni do określenia separatora, który nie występuje we wzorcu:
sed -e "\|$(head -n1)|d" -i .bash_history
Innym sposobem może być usunięcie tylko wrażliwych informacji, ale zachowanie poleceń zawierających te informacje. W tym celu można po prostu zastąpić wrażliwą informację tekstem zastępczym:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Na koniec, aby mieć pewność, że nie zostanie ona w kolejnym zapomnianym pliku:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
wyświetli listę wszystkich plików, których to dotyczy.
find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \n \0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
zastąpi wszystkie wystąpienia wrażliwych informacji we wszystkich plikach w drzewie katalogów zakorzenionym w .
. Uwaga: pomimo, że polecenie to używa xargs -0
, nie będzie ono obsługiwać plików z nowymi liniami w ich nazwach.
Zlokalizuj linię, którą chcesz usunąć, naciskając ↑ (strzałka w górę), aż się pojawi, a następnie naciśnij Ctrl+U. To powinno usunąć linię.
Jeżeli użyjesz polecenia history
, możesz zobaczyć, że linia została zastąpiona gwiazdką.
Jeżeli potrzebujesz usunąć z historii pewien zakres wierszy, to poniższa funkcja bash może zaoszczędzić Ci trochę czasu:
function histdel() {
[$# -eq 1] && history -d "$1" && history -w
if [$# -eq 2 -a "$1" -le "$2"]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}
Funkcja powinna być zwykle dodana do $HOME/.bashrc
. Aby użyć tej funkcji natychmiast, należy ponownie odczytać plik przez uruchomioną powłokę (. $HOME/.bashrc
). Następnie usunąć np. polecenia 200-210 z historii:
$ histdel 200 210
(Uwaga: To pytanie znajduje się wśród najlepszych wyników wyszukiwania, jeśli wyszukujesz usuwanie zakresu poleceń z historii bash. Tak więc, chociaż powyższe jest więcej niż to, o co pyta pytanie, może być przydatne dla niektórych czytelników).
Po prostu spróbuj tych,
$ history
to wyświetli id historii i komendę, np.
. . 211 ls 212 javac Welcome.java 213 java welcome .
użyj,
$ history -d 211
Tutaj 211 jest id historii. Teraz sprawdź to używając
$ history
. . 211 javac Welcome.java 212 java welcome . .
Wiem, że minęło sporo czasu odkąd to pytanie zostało zadane i udzielono na nie odpowiedzi, ale pokażę ci moją metodę czyszczenia pliku historii i wylogowywania się w tym samym czasie.
Uruchamiam :history -w && nano "${HISTFILE}" && history -c && exit
Co to robi jest proste:
history -w
: zapisuje zbuforowaną historię wewnątrz "${HISTFILE}"
nano "${HISTFILE}"
: pozwala mi na edycję "${HISTFILE}"
Możesz użyć skryptu sed lub czegokolwiek innego, aby wyczyścić swoje "${HISTFILE}"
history -c
: wyczyść zbuforowaną historię, aby to ostatnie polecenie nie zostało dołączone. exit
: wyloguj mnie dołączając zbuforowaną historię… ale jest pusta ;) Po tym poleceniu zostaniesz wylogowany z czystym plikiem historii. Zaloguj się, aby sprawdzić swoją historię ;)
Mam nadzieję, że komuś to pomoże.