2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

Usuń określoną linię z pliku historii Bash

Jak mogę usunąć określoną linię z bazy danych history?

Odpowiedzi (12)

152
152
152
2012-01-31 16:09:25 +0000

Usunięcie z pliku historii za pomocą linii poleceń można zrealizować w dwóch krokach:

  1. Wpisanie history -d <line_number> powoduje usunięcie określonego wiersza z historii w pamięci.
  2. Wpisanie 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_.

118
118
118
2012-01-31 16:01:05 +0000

Musisz się wylogować i zalogować z powrotem lub uruchomić history -a, aby aktualna historia została zapisana na dysku.

Następnie po prostu edytuj plik ~/.bash_history.

41
41
41
2012-02-01 22:19:06 +0000

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
```.
33
33
33
2013-06-18 16:33:19 +0000

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.

17
17
17
2013-07-19 12:50:40 +0000

Kilka technik:

Zapobieganie zapisywaniu wrażliwych informacji w pliku historii

Jeśli wpisałeś jakieś hasło w wierszu poleceń, a następnie zorientowałeś się, że wszystkie polecenia są rejestrowane, możesz albo:

  1. Wymusić wyjście z bieżącej sesji bez zapisywania historii:

  2. 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.

Usuń poufne informacje z pliku historii

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.

Usuń wrażliwą informację z dowolnego pliku w określonym drzewie

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.

12
12
12
2015-04-01 16:00:26 +0000

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ą.

5
5
5
2013-01-07 05:53:04 +0000

Jeśli potrzebujesz usunąć kilka linii w tym samym czasie, zwykle używam tego:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Jeśli potrzebujesz usunąć ostatnią komendę możesz użyć:

history -d $((HISTCMD-2))
```.
3
3
3
2012-10-26 14:09:51 +0000

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).

3
3
3
2014-03-04 11:16:04 +0000

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 . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59 to numer linii. Nie może być nic słodszego niż to :)

2
2
2
2015-09-30 04:57:29 +0000

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:

  1. history -w : zapisuje zbuforowaną historię wewnątrz "${HISTFILE}"
  2. nano "${HISTFILE}" : pozwala mi na edycję "${HISTFILE}" Możesz użyć skryptu sed lub czegokolwiek innego, aby wyczyścić swoje "${HISTFILE}"
  3. history -c : wyczyść zbuforowaną historię, aby to ostatnie polecenie nie zostało dołączone.
  4. 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.

1
1
1
2017-03-27 14:10:10 +0000

Możesz również edytować plik historii bezpośrednio, np. nano .bash_history jeśli jesteś w powłoce bash?