Ukryj „history -d” w historii bash

14

Jeśli przypadkowo wpisuję hasło lub cokolwiek innego wrażliwego w bash, mogę łatwo usunąć tę linię history -d ROW#, ale zawsze mam history -d ROW#w historii polecenie pokazujące wszystkim, że ktoś poprawił błąd.

Czy mogę dołączyć coś do polecenia, aby nie pojawiło się w historii bash?

Kalle Ling
źródło

Odpowiedzi:

27

Aby nie zapisywać ani jednego polecenia w historii, po prostu poprzedz go spacją (oznaczoną tutaj):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

To zachowanie jest ustawione w twoim ~/.bashrcpliku, a mianowicie w tym wierszu:

HISTCONTROL=ignoreboth

man bash mówi:

HISTCONTROL Rozdzielona
dwukropkami lista wartości kontrolujących sposób zapisywania poleceń na liście historii. Jeśli lista wartości zawiera ignorowanie , linie zaczynające się od spacji nie są zapisywane na liście historii . Wartość zignorowanych powoduje, że wiersze pasujące do poprzedniego wpisu historii nie są zapisywane. Wartość ignoreboth jest skrótem ignorespace i ignoredups .

ignoredupsprzy okazji jest powodem, dla którego history | tail -n2pojawia się tylko raz w historii w powyższym teście.


Historia terminala jest zapisywana w pamięci RAM i opróżniana na twój, ~/.bash_historygdy tylko go zamkniesz. Jeśli chcesz usunąć konkretny wpis ze swojego konta, ~/.bash_historymożesz to zrobić za pomocą sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

W ostatnim zmieniłem domyślny ogranicznik /na, _ponieważ jest on używany w wyszukiwanym haśle, w rzeczywistości jest to równe sed -i '/\/path\//d' .bash_history. Jeśli polecenie wyświetla tylko linie, które chcesz usunąć, dodaj -iopcję i zmień !dna, daby wykonać usuwanie:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
deser
źródło
12

Jednym ze sposobów byłoby ustawienie HISTIGNOREzmiennej środowiskowej. Odman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, jest to ustawienie domyślne, HISTCONTROLktóre zapewnia obejście typu przód-spacja].

Na przykład

HISTIGNORE='history -d*'

Jeśli chcesz, aby był trwały, wyeksportuj go ze swojego ~/.bashrc

export HISTIGNORE='history -d*'
steeldriver
źródło
6

Możesz

  • Zamknij okno (okna) terminala . Spowoduje to wyczyszczenie najnowszej historii w oknie terminala, które zamykasz najpóźniej (po zamknięciu innych okien) do pliku/home/$USER/.bash_history

  • Edytuj plik/home/$USER/.bash_history bez angażowania bash, na przykład uruchamiając ulubiony edytor za pomocą Alt+F2

    W ten sposób możesz sprawdzić całą historię i usunąć wszelkie polecenia, których już nie chcesz tam być.

    wprowadź opis zdjęcia tutaj

    wprowadź opis zdjęcia tutaj

sudodus
źródło
1

Zwykle używam:

history -w; history -c; $EDITOR $HISTFILE; history -r

Plik historii jest zapisywany na dysku, czyszczony w pamięci, edytujesz go tak, jak chcesz, a następnie edytowany plik historii jest odczytywany ponownie.

Pamiętaj, że jeśli edytor zapisuje pliki kopii zapasowej, niegrzeczne słowo może nadal pojawiać się na dysku.

Inną opcją -djest użycie predykcyjnych numerów historii:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

W tym przykładzie usuwam złą rzecz, usuwam polecenie, aby uzyskać numer historii, a następnie usuwam polecenie użyte do usunięcia historii. Wszystko wtedy jest dezynfekowane.

Seth Robertson
źródło
0

Jeśli chcesz uruchomić polecenie bez zapisywania go w historii, dodaj je z dodatkową spacją

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Aby to zadziałało, musisz albo ignorować, albo ignorować oba w HISTCONTROL. Na przykład uruchom

HISTCONTROL = ignorowanie Aby to ustawienie pozostało trwałe, umieść je w .bashrc.

bkdroid13
źródło