Chcę wykonać niektóre polecenia, ale nie chcę ich zapisywać w historii poleceń. Aby nikt nie mógł go przeszukać w .bash_history
pliku.
Czy istnieje sposób na wykonanie poleceń bash w ten sposób?
Chcę wykonać niektóre polecenia, ale nie chcę ich zapisywać w historii poleceń. Aby nikt nie mógł go przeszukać w .bash_history
pliku.
Czy istnieje sposób na wykonanie poleceń bash w ten sposób?
Odpowiedzi:
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 ignorespace
lub
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
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!)
/dev/null
uprawnień na 0600 podczas wylogowywania. Zamiast tego użyłem unset HISTFILE
.
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.
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/dash
lub /bin/sash
moż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 sh
lub batch
który nie jest bardzo sensowne
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.
Jak wspominał Doodad w komentarzach , unset HISTFILE
robi to ładnie, ale jeśli chcesz również usunąć trochę historii, zrób to, echo $HISTFILE
aby uzyskać lokalizację pliku historii (zwykle ~/.bash_history
) unset HISTFILE
i 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ś!
unset HISTFILE; echo TEST; history
da ci polecenie echo TEST
jak 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 :)
unset HISTFILE
nie 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ć! ;)
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.
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
$s
i inne rzeczy w sed. function forget() { // put code here // }
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 .zshrc
celu 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."'
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/null
skuteczne 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 ignorespace
wartości do $HISTCONTROL
zmiennej środowiskowej (man bash i poszukaj ignorespace
więcej szczegółów).
Musisz tylko uruchomić:
$ set +o history
Aby zobaczyć więcej, uruchom:
$ man set
set -x history
później polecenie odwrotne , działa.
To polecenie może się przydać. Nie zarejestruje to wykonanego polecenia
history -d $((HISTCMD-1)) && <Your Command Here>