Usuwanie historii z ~ / .bash_history


8

Mam kilka pytań na temat historii terminala lub wiersza poleceń, która jest przechowywana ~/.bash_history.

  1. Widzę plik w terminalu z historypoleceniem, ale jeśli spróbuję go otworzyć, gedit bash_historyplik jest całkowicie pusty. Dlaczego?

  2. Znalazłem sposób usunięcia określonej liczby wierszy w pliku z terminala za pomocą tej linii kodu:

    for i in {1..N}; do history -d N; done

    gdzie N to liczba wierszy (lub poleceń), które chcesz usunąć, ale teraz plik historii pokazuje to ostatnie polecenie i nie jest to zbyt mądre, jeśli próbujesz ukryć swoje rzeczy. Pytanie brzmi: jak mogę podać ostatnią linię kodu i upewnić się, że nie zostanie ona nagrana?



W przyszłości, jeśli uruchomisz dowolne polecenie ze spacją, polecenie to nie zostanie zapisane w twojej historii.
Paddy Landau,

Odpowiedzi:


18
  1. Właśnie zapomniałeś poprzedniej kropki, polecenie otwarcia pliku historii terminali (bash) to

    gedit ~/.bash_history

    Ten plik jest aktualizowany tylko po zamknięciu terminala.

  2. Aby usunąć 10 ostatnich wierszy z tego pliku i nie rejestrować samego polecenia, otwórz nowy terminal i wykonaj następujący łańcuch poleceń:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    lub

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    lub

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedlub headodpowiednio usuwa wybrane linie z ~/.bash_history, history -cczyści historię terminala i exitzamyka ją.


Krótsza i miejmy nadzieję szybsza alternatywa dla for+ sed: head -n -Ngdzie wielkimi literami Njest liczba linii do usunięcia. stackoverflow.com/a/13380679/711006
Melebius

2
@ Melebius Wygląda obiecująco, ale jak przekierować dane wyjściowe do nadpisującego je pliku wejściowego? head -n -N testfile > testfilepo prostu usuwa plik! Dodałem obejście, jednak z pewnością nie jest ono krótsze.
deser

Masz rację, zapomniałem, że headnie może tak działać w miejscu sed. Szukałem przede wszystkim jednego sedpolecenia zastępującego twoją forpętlę. Na stronie, którą utworzyłem link, jest kilka opcji, ale nie wyglądają one tak zrozumiale jak Twój kod.
Melebius

@Melebius Zobacz sed1line.txt - dodałem go powyżej, nie jest tak naprawdę krótszy, ale powinien być szybszy.
deser

4

Plik bash_history jest plikiem ukrytym, zaczynającym się od kropki. Musisz zrobić

gedit ~/.bash_history

Spowoduje to otwarcie pliku w gedit.


1

Jeśli chcesz usunąć tylko niektóre części dziennika poleceń, powyższe metody są w porządku. Jeśli chcesz zatrzymać rejestrowanie poleceń dla określonej sesji bash, wydaj polecenie

unset HISTFILE

Aby być bardziej drastycznym, jeśli nie chcesz, aby którekolwiek z twoich poleceń były rejestrowane , możesz to zrobić

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

Zauważ, że pierwsza metoda byłaby skuteczna tylko dla jednej sesji, podczas gdy druga metoda zatrzymałaby rejestrowanie poleceń dla wszystkich przyszłych sesji.


1

Zdaję sobie sprawę, że ma to już zaakceptowaną odpowiedź, ale tak właśnie robiłem od lat 80. To świetny sposób na ukrycie swoich utworów i podejście wielofazowe. W przeważającej części jest to ten, który nie jest zauważany, chyba że ktoś naprawdę zwraca uwagę. Oto jak to się robi.

Otwórz terminal / powłokę / sesję i wykonaj:

 chmod 444 ~/.bash_history

wyjdź z powłoki otwórz terminal / powłokę / sesję i wykonaj: Oto kilka kreatywnych sposobów na trwałe usunięcie historii

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (stwórz fałszywą historię)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

następnie na wszelki wypadek:

 chmod 444 ~/.bash_history

wyjdź z muszli

otwórz nową powłokę i wpisz

 history

co czyni go mniej zauważalnym, jeśli wykonamy ls -ratl, ~ / .bash_history ostatecznie zniknie w grzechotce listy katalogów. Nie pojawi się jako link, który przyciągnie niepotrzebną uwagę. Większość ludzi nie robi -a na swoim katalogu głównym, co jest przydatne, gdy pożądana jest emulacja.

Minusem tego podejścia jest to, że tracisz zdolność do powrotu i odzyskania swojej historii. Rzeczywisty plik ~ / .bash_history może również znaleźć się na górze listy katalogów, ponieważ z czasem może skończyć się naprawdę stara data modyfikacji, co samo w sobie może prowadzić do odkrycia, że ​​coś jest nie tak.


jeśli użyjesz 9999999 dddo usunięcia wszystkich wierszy z pliku :%d, :1,$dlub dG
działasz

0

1) Uruchom sh; powoduje to powstanie skorupy popiołu, która w ogóle nie zapisuje historii. Edytuj stamtąd

2) Dodaj wiersz HISTCONTROL=ignorebothdo .bashrci zrób, exec bashaby trwale zastąpić bieżącą powłokę ponownie zainicjalizowaną, a następnie wykonaj wszystkie polecenia, których nie chcesz rejestrować, używając spacji wiodącej.


0

ponieważ nie mogę jeszcze komentować, dodam moje komentarze jako odpowiedź:

man history odpowie na wszystko.

odpowiedź na nr 1 jest taka, że ​​historia jest w pamięci. history -aaby natychmiast zapisać do pliku. history -wrównież zaoszczędzi, ale może popsuć inne sesje.

odpowiedź # 2 history -a:, gedit, usuń wiersze, które chcesz,history -r


0

Historia nie jest zapisywana, dopóki nie wylogujesz się z powłoki. Spróbuj wylogować się z powłoki, a następnie ponownie spójrz na .bash_history. Powinna tam być historia poleceń.


Edytowane zgodnie z sugestią Wystarczająco dobrze?
Lightning Stalker,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.