Wykonaj polecenie bez przechowywania go w historii [zamknięte]

203

Chcę wykonać niektóre polecenia, ale nie chcę ich zapisywać w historii poleceń. Aby nikt nie mógł go przeszukać w .bash_historypliku.

Czy istnieje sposób na wykonanie poleceń bash w ten sposób?

Jan Vorcak
źródło
13
To pytanie powinno być prawdopodobnie przeniesione do ServerFault, ponieważ nie jest to „programowanie”, ale „administrator serwera” - ale dzięki za pytanie / odpowiedź, dokładnie to, czego potrzebowałem!
Andrew Theken,

Odpowiedzi:

294

Rozpocznij polecenie spacją i nie będzie ono uwzględnione w historii.

Należy pamiętać, że wymaga to ustawienia zmiennej środowiskowej $HISTCONTROL.

  • Sprawdź, czy następujące polecenie zwraca ignorespacelub ignoreboth

    #> echo $HISTCONTROL
  • Aby dodać zmienną środowiskową, jeśli jej brakuje, do profilu bash można dodać następujący wiersz. Na przykład%HOME/.bashrc

    export HISTCONTROL=ignorespace

Po uzyskaniu profilu ponownie polecenia z prefiksem spacji nie zostaną zapisane $HISTFILE

u-punkt
źródło
20
To nie działa, chyba że ignorancja jest uwzględniona w $ HISTCONTROL - chociaż jest to prawdopodobnie ustawienie domyślne w większości systemów.
pgl
2
Poprawny. Aby uzyskać więcej informacji, OP powinien zajrzeć do HISTCONTROL i HISTIGNORE na stronie podręcznika bash.
u-punkt
2
thegeekstuff.com/2008/08/… - więcej wskazówek dotyczących historii basha jest dostępnych tutaj, w tym ta metoda ukrywania poleceń w historii
użytkownik379997,
52

W każdej sesji Bash ustaw plik historii na / dev / null, wpisując:

export HISTFILE=/dev/null

Zauważ, że, jak wskazano w komentarzach, nie spowoduje to zapisania żadnych poleceń w tej sesji do historii!

Po prostu nie zadzieraj z ciężką pracą administratora systemu;)

Rozwiązanie Doodad jest bardziej eleganckie. Po prostu wyłącz zmienną: unset HISTFILE(dzięki!)

Miquel
źródło
5
Zapobiegnie to rejestrowaniu wszystkich poleceń. Pytający nie chce tego.
Noufal Ibrahim,
12
To spowodowało problemy związane z ustawieniem /dev/nulluprawnień na 0600 podczas wylogowywania. Zamiast tego użyłem unset HISTFILE.
Doodad
36
echo "discreet";history -d $(history 1)
nieznany z nazwiska
źródło
4
Ooh, kontrola poszczególnych poleceń? Miły.
Kyle Strand
21

Rozszerzenie odpowiedzi @John Doe & @ user3270492. Ale wydaje mi się, że to działa.

<your_secret_command>; history -d $((HISTCMD-1))

Nie powinieneś widzieć wpisu polecenia w swojej historii.

Oto wyjaśnienie ..

„Historia -d” usuwa wspomniany wpis z historii.

HISTCMD przechowuje numer polecenia, który ma zostać wykonany w następnej kolejności. Tak więc (HISTCMD-1) odnosi się do ostatnio wykonanego polecenia.

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

Rangaraj KS
źródło
Niestety to nie działało dla mnie.
Magick
10

Możesz rozważyć użycie powłoki bez historii, na przykład

/bin/sh << END
   your commands without history
END

(być może /bin/dashlub /bin/sashmoże być bardziej odpowiednie niż /bin/sh)

lub jeszcze lepiej skorzystać z narzędzia partii , np

batch << EOB
   your commands
EOB

Historia będzie zawierało shlub batchktóry nie jest bardzo sensowne

Basile Starynkevitch
źródło
8

Możesz rozpocząć sesję od

export HISTFILE=/dev/null ;history -d $(history 1)

następnie kontynuujcie swoje podstępne działania. Ustawienie pliku histogramu na/dev/null zostanie zarejestrowane w pliku historii, ale ten wpis zostanie łatwo usunięty i nie zostaną wyświetlone żadne ślady (przynajmniej w pliku historii).

Jest to również niestałe.

chrześcijanin
źródło
To była już odpowiedź wiele razy. Co powiedziałbyś, że twoja odpowiedź dodaje do tego wątku (oprócz niepotrzebnego hałasu)?
gniourf_gniourf
Nie ujęto go w jedną odpowiedź , aby nie wyświetlać samego polecenia w historii i nie wyświetlać niczego, co wprowadzono później.
Christian
1
Ale teraz ten wątek to prawdziwy bałagan! w tym przypadku, szczególnie w przypadku tak starego pytania, uważam, że lepiej jest edytować istniejące już dobre odpowiedzi i / lub zostawić komentarz…
gniourf_gniourf
5

Jak wspominał Doodad w komentarzach , unset HISTFILErobi to ładnie, ale jeśli chcesz również usunąć trochę historii, zrób to, echo $HISTFILEaby uzyskać lokalizację pliku historii (zwykle ~/.bash_history) unset HISTFILEi edytować ~/.bash_history(lub cokolwiek innego HISTFILE- oczywiście teraz unset, abyś mógł ” czytać to).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Następnie zredagowałeś swoją historię i fakt, że ją edytowałeś!

drkvogel
źródło
Próbowałem tego na: GNU bash, wersja 3.2.57 (1) -release (x86_64-apple-darwin15) i to nie działa. I używane po wyłączonym HISTORII polecenia były przechowywane w ~ / .bash_history
Krystian
@Krystian Mój błąd - napisałem „rozbrojoną HISTORIĘ”, kiedy powinno to być „rozbrojoną HISTORIĘ” - poprawione. Czy to działa teraz? Działa na GNU bash, wersja 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel
nie jestem pewien. Prosty test: unset HISTFILE; echo TEST; historyda ci polecenie echo TESTjak poprzednie do ostatniego. Chociaż po zakończeniu sesji i ponownym nawiązaniu połączenia historia rzeczywiście nie ma tego wpisu. Powiedziałbym więc, że to działa :)
Krystian
unset HISTFILEnie wydaje się, aby polecenia były zapisywane w historii w pamięci, ale nie zatrzymuje ich w jakimkolwiek pliku $ HISTFILE. Sądzę więc, że wciąż masz w pamięci historię lokalną, ale nie jest ona już zapisywana w pliku, czego możesz chcieć! ;)
drkvogel
4

Możesz także użyć następującego polecenia:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Myślę, że to bardzo przenośne polecenie.

Cédric ROYER
źródło
Stworzyłem z tego alias: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"i teraz możesz zrobić coś takiego:mysql -uroot -pSecretPassword ; forget
sobi3ch
1
Przepraszam, ale zdaję sobie sprawę, że musisz utworzyć funkcję zamiast aliasu, ponieważ znaki cudzysłowu zmieniają znaczenie $si inne rzeczy w sed. function forget() { // put code here // }
sobi3ch
3

Jeśli używasz zsh , możesz uruchomić:

setopt histignorespace

Po tym ustawieniu każde polecenie zaczyna się od spacji zostanie wykluczone z historii.

Możesz użyć aliasów w .zshrccelu włączenia / wyłączenia :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'
Rotareti
źródło
Fajnie, ale to pytanie jest specjalnie oznaczone jako bash
tripleee
2

Można to osiągnąć na kilka sposobów. To ustawia rozmiar pliku historii na 0:

export HISTFILESIZE=0

Spowoduje to ustawienie pliku historii na /dev/nullskuteczne wyłączenie:

export HISTFILE=/dev/null

W przypadku pojedynczych poleceń można poprzedzić je spacją i nie zostanie ono zapisane w pliku historii. Zauważ, że wymaga to włączenia ignorespacewartości do $HISTCONTROLzmiennej środowiskowej (man bash i poszukaj ignorespacewięcej szczegółów).

pgl
źródło
2
Zapobiegnie to rejestrowaniu wszystkich poleceń. Pytający nie chce tego.
Noufal Ibrahim,
Cóż, w pewnym sensie założyłem, że pytający zresetuje wartości po zrobieniu tego, czego chciał, a czego nie należy rejestrować.
pgl
1

Jest to przydatne, jeśli chcesz usunąć całą historię, w tym fakt, że skasowałeś całą historię!

rm .bash_history;export HISTFILE=/dev/null;exit
cnd
źródło
0

Musisz tylko uruchomić:
$ set +o history

Aby zobaczyć więcej, uruchom:
$ man set

Igor Santos
źródło
2
To wyłącza historię dla wszystkich przyszłych poleceń, a nie dla pojedynczych poleceń. Większość ludzi, którzy tu przychodzą, powinna zamiast tego spojrzeć na zaakceptowaną odpowiedź.
tripleee
Jest to poprawne lub w porządku, ale niekompletne. Tak długo, jak dodamy set -x historypóźniej polecenie odwrotne , działa.
Abdillah
0

To polecenie może się przydać. Nie zarejestruje to wykonanego polecenia

history -d $((HISTCMD-1)) && <Your Command Here>
RAVI THEJA
źródło