Odpowiedzi:
Musisz się wylogować i ponownie zalogować lub uruchomić, history -a
aby bieżąca historia została zapisana na dysku.
Następnie po prostu edytuj plik ~/.bash_history
.
vim ~/.bash_history
) ze spacją; polecenia zaczynające się od spacji zwykle nie są rejestrowane (patrz $HISTCONTROL
).
Usunięcie z pliku historii można osiągnąć za pomocą wiersza polecenia w dwóch krokach:
history -d <line_number>
usuwa określony wiersz z historii w pamięci.history -w
zapisuje bieżącą historię w pamięci do ~/.bash_history
pliku.Te dwa kroki razem trwale usunąć wiersz z pamięci w historii iz .bash_history pliku, jak również.
history -w
z historii?
<line_number>
tylko history | grep [unwanted_content]
uzyskać listę ze wszystkimi wierszami zawierającymi [unwanted_content]
(jak hasła).
Aby przede wszystkim zapobiec dodawaniu polecenia do historii, upewnij się, że zmienna środowiskowa HISTCONTROL
zawiera między wartościami oddzielonymi dwukropkami wartość ignorespace
, na przykład (dodaj np. Do .bashrc
):
$ export HISTCONTROL=ignorespace
Zapobiegnie to dodaniu do historii poleceń z wiodącym odstępem. Następnie możesz całkowicie wyczyścić historię, uruchamiając
$ history -c -w
^-- additional space character
Przede wszystkim, jeśli polecenie, które zamierzasz wydać, jest wrażliwe, niebezpieczne lub po prostu nie potrzebujesz go zaśmiecać w swojej historii, najlepiej / najszybciej jest po prostu uniemożliwić jego wejście do historii. Upewnij się, że $HISTCONTROL
zawiera ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Następnie wykonaj dowolne polecenie, którego nie chcesz w swojej historii, spacją:
(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 nadal otwarta, polecenie jeszcze nie dotknęło dysku. Aby usunąć poprzednie polecenie z historii, wydaj:
(bash)$ history -d $((HISTCMD-1))
Zwróć uwagę na wiodące miejsce; to polecenie wymaga ignorespace
, w przeciwnym razie po prostu się skasuje!
Jeśli chcesz usunąć kilka ostatnich poleceń, znajdź ostatni i pierwszy numer historii:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn\'t-work
602 otherwise-unwanted
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 jakaś historia z bieżącej sesji trafiła na dysk, wyjdź, używając:
(bash)$ kill -9 $$
Dotychczasowe podejście polegało na tym, aby nawet nie zapisywać wrażliwych elementów historii na dysku dla dodatkowego bezpieczeństwa, ponieważ teoretycznie dane usunięte z nieulotnych nośników można nadal odzyskać.
Jeśli jednak polecenia, które chcesz usunąć, pochodzą z poprzedniej sesji, zostaną już dołączone do $HISTFILE
wyjścia. Manipulowanie historią za pomocą powyższych poleceń nadal dołącza tylko pozostałe nowe elementy do $HISTFILE
, przy wyjściu . Aby nadpisać$HISTFILE
z widokiem na bieżącej sesji użytkownika w całej historii, w tej chwili , issue:
(bash)$ history -w
Oczywiście w przypadku elementów historii znajdujących się już na dysku alternatywą do edycji historii za pomocą history -d
poleceń, a następnie wydawania history -w
, jest edycja $HISTFILE
za pomocą edytora tekstu.
$HISTFILE
, na wyjściu ”. Faktycznie, nie jest to do końca prawda. Wydaje się, że dołącza tylko pozostałe nowe elementy, które „wystają” z pierwotnej długości historii. Np. Jeśli usunę 5 oryginalnych elementów i dodam 15 nowych, dołączonych zostanie tylko 10 ostatnich, podczas gdy oczekuję, że wszystkie 15 nowych zostanie dołączonych. Myślę, że to błąd, ponieważ nie widzę, jak to zawsze jest pożądana funkcjonalność.
Kilka technik:
Jeśli wpiszesz jakieś hasło w wierszu poleceń, to wiedz, że wszystkie polecenia są zarejestrowane, możesz:
Wymuś wyjście z bieżącej sesji bez zapisywania historii:
kill -9 $$
Spowoduje to usunięcie całej bieżącej historii.
Wpisz ↑ (up arrow)sesję otwartej bash, aż zostaną wyświetlone poufne informacje, a następnie użyj klawiszy edycji linii, takich jak Ctrl+, Waby usunąć wrażliwe informacje, a następnie ↓ (down arrow) do momentu wyświetlenia monitu o nową pustą linię, zanim zaczniesz pisać Enter.
Jeśli zdajesz sobie sprawę, że poufne informacje są już przechowywane i chcesz je usunąć, ale nie całą historię:
Proste sed
polecenie może wykonać zadanie:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
ale podczas wpisywania tworzona jest kolejna linia historii zawierająca wzorzec wyszukiwania (informacje poufne), który próbujesz usunąć. Więc możesz:
sed -e "/$(head -n1)/d" -i .bash_history
To będzie działać head -n1
z wejściem z terminala. Wygląda na to, że twój terminal jest zawieszony (nie pojawi się monit); po prostu wpisz informacje, które chcesz usunąć z pliku. Jest to sztuczka pozwalająca na wprowadzenie (części) polecenia bez wpisywania go w wierszu poleceń, przez co nie można go włączyć do rekordu historii. Następnie sed
użyje wpisanego tekstu, aby wyszukać .bash_history
i usunąć wszystkie wiersze zawierające poufne informacje. Uwaga: jeśli wzorzec poufnych informacji zawiera ukośniki, musisz je uciec za pomocą ukośników odwrotnych lub zmienić sed
polecenie, aby użyć tej składni, aby określić separator, który nie pojawia się we wzorcu:
sed -e "\|$(head -n1)|d" -i .bash_history
Innym sposobem może być usunięcie tylko poufnych informacji, ale zachowanie poleceń zawierających te informacje. W tym celu możesz po prostu zastąpić poufne informacje wybranym tekstem zastępczym:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Na koniec, aby upewnić się, że nie pozostanie w innym zapomnianym pliku:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
wyświetli listę wszystkich zainteresowanych plików.
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 poufnych informacji we wszystkich plikach w drzewie katalogów zrootowanym .
. Uwaga: nawet jeśli to polecenie używa xargs -0
, nie obsługuje plików z nowymi liniami w nazwach.
Znajdź wiersz, który chcesz usunąć, naciskając, ↑ (up arrow)aż się pojawi, a następnie naciśnij Ctrl+ U. To powinno usunąć linię.
Jeśli użyjesz history
polecenia, zobaczysz, że linia została zastąpiona gwiazdką.
*
.
Jeśli chcesz usunąć kilka linii jednocześnie, zwykle używam tego:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Jeśli chcesz usunąć ostatnie polecenie, możesz użyć:
history -d $((HISTCMD-2))
history | grep <string>
nadal pokazuje wszystkie linie Twierdzi, aby usunąć ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Jeśli musisz usunąć zakres linii z historii, następująca funkcja bash może zaoszczędzić 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ć zazwyczaj dodawana do $HOME/.bashrc
. Aby użyć tej funkcji bezpośrednio, musisz ponownie odczytać plik przez działającą powłokę ( . $HOME/.bashrc
). Następnie, aby usunąć np. Polecenia 200-210 z historii:
$ histdel 200 210
(Uwaga: to pytanie jest jednym z najlepszych wyników wyszukiwania, jeśli szukasz usunięcia szeregu 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.)
for
oświadczenia: for n in $(seq "$2" "$1")
jest przez niektórych preferowany stylistycznie, a jeśli seq
nie działa, spróbuj for ((n="$2"; n>="$1"; n--))
.
Po prostu spróbuj tych
$ history
to wyświetli identyfikator historii i polecenia, np
.
.
211 ls
212 javac Welcome.java
213 java welcome
.
.
posługiwać się,
$ history -d 211
Tutaj 211 jest id historii. Teraz sprawdź to za pomocą
$ history
.
.
211 javac Welcome.java
212 java welcome
.
.
Wiem, że minęło dużo czasu, odkąd pytanie zostało zadane i udzielono odpowiedzi, ale pokażę ci moją metodę czyszczenia mojego pliku historii i wylogowywania się w tym samym czasie.
Biegnę :
history -w && nano "${HISTFILE}" && history -c && exit
To, co robi, jest proste:
history -w
: zapisuje w pamięci podręczną historię "${HISTFILE}"
nano "${HISTFILE}"
: pozwól mi edytować "${HISTFILE}"
Możesz użyć skryptu sed lub cokolwiek chcesz wyczyścić"${HISTFILE}"
history -c
: wyczyść historię buforowaną, aby to ostatnie polecenie nie było dołączane.exit
: wyloguj mnie dołączając historię z pamięci podręcznej ... ale jest pusta;)Po tym poleceniu nastąpi wylogowanie z czystym plikiem historii. Zaloguj się, aby sprawdzić swoją historię;)
Mam nadzieję, że to komuś pomoże.