Terminal „tryb incognito”?

230

Często używam terminala i czasami uruchamiam polecenia, których nie chcę, aby inni widzieli, ale więcej poleceń, które gdybym przypadkowo wskazał strzałkę i wykonał przypadkowo, spowodowałoby wiele problemów.

Zastanawiam się więc, czy istnieje jakiś tryb terminalu „incognito”, który może mi umożliwić, po wykonaniu określonego polecenia, zaprzestać zapisywania mojej historii, a następnie rozpocząć nagrywanie dopiero po wykonaniu polecenia ponownie rozpocząć rejestrowanie historii i wyjść z trybu incognito, czy po prostu zrestartować Terminal?

Ponieważ później znajduję się i usuwam rzeczy z siebie .bash_history, kiedy byłoby o wiele łatwiej, gdybym mógł zatrzymać to nagrywanie tam w pierwszej kolejności, lub przynajmniej poprosić, aby spróbowało nagrać gdzieś, gdzie po prostu nie byłoby wolno, i po prostu nie nagrałbym tego.


źródło
6
Cóż, przypuszczalnie jesteś paranoikiem, że inni czytają twoją historię?
Sparhawk
6
@Sparhawk: Cóż, częściowo dlatego, że i na imprezie nie chcę przypadkowo wykonać śmiertelnie niebezpiecznej komendy serwisowej, kiedy po prostu wstaję w przyszłości! : D
19
Wystarczy dodać, że nie musisz się usprawiedliwiać: „nie są to rzeczy, których inni nie chcą widzieć” . Byłby to również dla mnie zupełnie uzasadniony powód. (Zwłaszcza w czasach, w których wszyscy starają się sprawić, byś wyglądał na winnego z powodu „rzeczy do ukrycia”)
2015 r
2
Jeśli otworzysz dwie zakładki, zrób rzeczy w pierwszej, zrób w drugiej, a następnie zamknij drugą PRZED pierwszą, tylko historia pierwszej wydaje się być zapisana .bash_history. (Zniszczony terminal Ubuntu 15.04, na szczęście to USB na żywo.)
Hitechcomputergeek
1
Zobacz to pytanie dotyczące błędu serwera
Luc M

Odpowiedzi:

265

Uruchom polecenie bez zapisywania go w historii:

Po prostu wstaw spację przed poleceniem. Bash zignoruje polecenia ze spacją:

Przykład: Spaceecho "Some secret text"

Uwaga: Działa to tylko wtedy, gdy HISTCONTROLzmienna jest ustawiona na ignorespacelub ignoreboth.


Tymczasowo wyłącz historię:

  • Uruchom Spaceset +o historylub, Spaceshopt -uo historyaby wyłączyć historię.
  • Uruchom set -o historylub, shopt -so historyaby włączyć ponownie.

Wyłącz historię dla bieżącej sesji (nie zapamięta żadnych poleceń z sesji):

unset HISTFILE

Uwaga: Zobaczysz naciskane polecenia, Updopóki nie zamkniesz terminala.


Usuń polecenie z historii:

Biegać Spacehistory | grep "part of your secret command"

Wyświetli listę wcześniej uruchomionych poleceń, w tym formacie:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

Wybierz numer pozycji po lewej stronie polecenia. Możesz go skopiować za pomocą Ctrl+ Shift+C

Uruchom Spacehistory -d <number>gdzie <number>jest numer wpisu, aby usunąć wpis.
Możesz wkleić ten numer za pomocą Ctrl+ Shift+V


Inne interesujące odpowiedzi:

Helio
źródło
7
Jeśli użyjesz history -ddo usunięcia linii, spowoduje to usunięcie jej zawartości, ale nigdy nie możesz usunąć faktu, że uruchomiłeś history -d(chyba że użyjesz go set +o historyprzed uruchomieniem history -d)
AJFaraday
1
Przypomniało mi to logikę super nakazu, to wszystko;)
AJFaraday
4
(OT) Nakazy są dokumentem prawnym, który powstrzymuje ludzi przed publikowaniem czegoś. Super nakaz powstrzymuje ich również przed publikowaniem faktu, że odmówiono im możliwości publikacji. Niektóre logiczne argumenty pytają, czy mogą opublikować, że odmówiono im możliwości opublikowania niektórych informacji. Potem staje się argumentem cyklicznym.
AJFaraday
1
@Helio Myślę, że lepiej jest, aby użytkownicy znali „właściwy” sposób kopiowania - zwłaszcza jeśli przypadkowo przejdą i wybiorą tekst. Nie jestem pewien, jak zrobić przestrzeń, może wyjaśnić więcej, że przestrzeń jest tam? [Kosmos] wydaje mi się trochę niezdarny ...
Tim
2
unset HISTFILEPodejście działa również z mocą wsteczną do wszystkich poleceń, które nie zostały napisane do .bash_historywyświetlenia.
kasperd
40

Możesz po prostu usunąć historię jednej konkretnej sesji terminala , dodając polecenie history -cwpo pracy.

Nie zamykaj terminala przed wydaniem tego polecenia.

Moithil Biswas
źródło
To nie usunie całej historii?
Helio
6
Spowoduje to jedynie usunięcie historii konkretnej sesji terminala.
Moithil Biswas
28

shopt -uo history powinien zrobić to najlepiej.

Nukowanie HISTFILEzmiennych (i in.) Nie zatrzyma zapisywania Uphistorii, po prostu nie wypchnie jej na dysk. To może, ale nie musi być dla ciebie pozytywna rzecz, ale biorąc pod uwagę, że o tym wspomniałeś, myślę, że chcesz czegoś lepszego. Zmiana shoptustawienia historii uniemożliwia uruchomienie całego mechanizmu historii.

Możesz ponownie włączyć logowanie za pomocą shopt -so history( -si odpowiednio -usą ustawione i wyłączone).

Zauważ, że samo polecenie prawdopodobnie zostanie zarejestrowane, więc dodaj je spacją, aby zatrzymać dodawanie do historii, zanim wyczyścisz zmienną.

Oli
źródło
17

Innym sposobem na zabicie bieżącej powłoki bez logowania do pliku historii jest:

kill -9 $$

Powoduje to, że bash (i prawdopodobnie także inne powłoki) wysyła do siebie sygnał SIGKILL, zabijając go na miejscu i uniemożliwiając zapisywanie czegokolwiek na dysku.

głupek
źródło
7
alias „Strzel sobie w głowę” :). Ma to tę zaletę, że nie trzeba nic robić przed napisaniem poleceń.
Guido
3
Używam zsh z przyrostowym zapisem historii, więc wątpię, żeby to zadziałało w moim przypadku
Wayne Werner
13

Aby tymczasowo wyłączyć historię poleceń dla bieżącej sesji, możesz tymczasowo wyłączyć zmienną środowiskową HISTFILE.

unset HISTFILE

gdy sesja jest aktywna, możesz uzyskać dostęp do historii jak zwykle, ale nie zostanie ona zapisana na dysku.

Aby cofnąć w tej samej sesji (wszystkie zmiany zostaną zapisane)

HISTFILE=$HOME/.bash_history
Bruni
źródło
1
I czy w bieżącej sesji istnieje prosty sposób, aby to odwrócić i kontynuować?
@ParanoidPanda Dodałem polecenie przywracania w bieżącej sesji.
Bruni
1
@ParanoidPanda: Dlaczego potrzebujesz polecenia, aby ustawić HISTFILEponownie w bieżącej sesji? Jeśli cofniesz zmianę (nawet po uruchomieniu tajnych poleceń), zostaną one zapisane w historii po wyjściu.
Helio
@Helio: Och, nie, miałem na myśli polecenie, które następnie zacznie nagrywać ponownie, ale nie zapisz poleceń, których nie chciałem, aby zostały zapisane.
1
@ParanoidPanda, Helio wydaje się mieć rację, ponieważ historia jest zapisywana przy wyjściu. Nie zastanawiałem się nad tym.
Bruni
10

Możesz modyfikować wiersze historii w bieżącej sesji powłoki. Jeśli przejdziesz wstecz przez historię (np. Za pomocą Uplub Ctrl+ P) i zmienisz linię bez jej wykonania , tylko zmodyfikowana wersja linii zostanie zapisana. Możesz go modyfikować w dowolny sposób; dobrym wyborem będzie obejmować korzystanie Ctrl+ Ucałkowicie pusty wiersz lub używając Esc#umieścić #komentarz charakter na początku.

Aby pozostawić linię bez jej wykonania, pamiętaj, aby nie uderzać Return( Enter). To, co robię, to powrót do najnowszej linii w historii za pośrednictwem Esc>.

(Zamiast Escnastępnie >, w większości terminali można trzymać Alti naciśnij >, to samo tyczy się Esc#sugestią powyżej).

Uwaga: W ten sposób nie można trwale modyfikować wpisów z poprzednich sesji. Zmiany te nie zostaną zastosowane HISTFILEna koniec sesji.

echristopherson
źródło
6

Możesz także ustawić .bash_history tylko do odczytu. Najpierw opróżnię plik, a następnie:

 chattr +i .bash_history
WebTM
źródło
5

Możesz wykonać wrażliwe polecenia w sesji ekranowej, a następnie zniszczyć sesję po zakończeniu.

Alternatywnie, możesz utrzymać tę sesję ekranu przy życiu, ale odłączoną, i uzyskać do niej dostęp tylko wtedy, gdy naprawdę chcesz być w stanie skierować strzałkę w górę do niebezpiecznych poleceń.

keag
źródło
1

Ja osobiście używam mksh, a ta powłoka domyślnie nie ma pliku historii. Oznacza to, że możesz uruchomić alternatywną powłokę, taką jak mkshlub dash(która jest domyślnie przy okazji), aby uruchomić polecenie, którego użytkownicy nie chcą widzieć, i zakończyć po zakończeniu. bashHistoria zapisze tylko, że uruchomiłeś alternatywną powłokę i to wszystko.

Sergiy Kolodyazhnyy
źródło
1

Można również użyć terminala multiplekser, takich jak tmux, screen. Tak więc historia tmuxlub screenhistoria nie zostałyby zapisane.

Vusan
źródło