Existe alguma maneira de impedir que um comando seja adicionado ao seu histórico?

63

Existe alguma maneira de impedir que um comando seja adicionado ao seu histórico? Eu tenho um comando que eu quero manter fora do meu arquivo de histórico, e eu realmente não me importo de tê-lo lá quando eu pesquisar o histórico armazenado na memória, embora isso seja menos preocupante. Existe alguma maneira de evitar isso, ou eu só tenho que voltar e editar o meu arquivo de histórico.

update: Eu não sabia que isso poderia ser específico do shell. Meu shell é zsh . Você é bem-vindo para responder por outros shells para que as pessoas saibam como fazer isso no shell.

    
por xenoterracide 19.01.2011 / 04:06

4 respostas

49

No ZSH :

Primeiro, insira setopt HIST_IGNORE_SPACE no seu ~/.zshrc . Agora, depois de efetuar login novamente, você pode prefixar os comandos que você não deseja armazenar no histórico com um space .

No manual do usuário , as três opções a seguir podem ser usadas para dizem que certas linhas não devem entrar na história:

  • HIST_IGNORE_SPACE não armazena comandos prefixados com um espaço
  • HIST_NO_STORE não armazena o histórico ( fc -l ) comando
  • HIST_NO_FUNCTIONS não armazena definições de função
por 19.01.2011 / 10:08
25

Se você estiver executando o comando várias vezes, talvez queira usar o recurso de ignorar histórico do seu shell. Vamos dizer que você tem secret.server.com que você ssh para, arquivos FTP para, etc, que você não quer qualquer linha que menciona secret.server.com salvo:

Em bash , você deve definir

HISTIGNORE="*secret.server.com*"

enquanto em zsh o parâmetro é chamado

HISTORY_IGNORE="*secret.server.com*"

Você pode listar vários padrões com dois pontos separados por eles. Observe que cada padrão é comparado com a linha de entrada completa , portanto, talvez seja necessário incluir um *. Por exemplo, o seguinte excluirá fortune do histórico, mas armazenará fortune -l :

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Com HISTIGNORE definido, nada que corresponda aos padrões listados será salvo em .bash_history / .zsh_history e até a tecla de seta para cima, que normalmente lembra o comando anterior, não funcionará se corresponder ao padrão.

    
por 19.01.2011 / 05:08
23

No bash, use a variável HISTCONTROL .

Defina como HISTCONTROL=ignorespace (ou HISTCONTROL=ignoreboth ). A partir de agora, quando você inicia uma linha com um espaço , ele não será salvo no histórico. Isso evita incluir o comando não-para-ser-divulgado em algum arquivo de configuração.

Mesmo assim, acontece de esquecer de adicionar o espaço e depois querer voltar. Para excluir uma entrada no histórico, use history -d <index> , com index o número encontrado com o comando history (primeira coluna).

    
por 19.01.2011 / 06:27
11

A maneira mais fácil para um one-off é

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

em que $ representa o prompt do shell inicial e $$ representa o prompt do subshell. Isso funciona no bash e zsh; em ksh você precisa de HISTFILE=/notwritable . Observe que o que importa é o valor de HISTFILE quando o arquivo de histórico é gravado, não quando o comando é executado. Bash, ksh e zsh escrevem no arquivo de histórico quando saem (o zsh pode fazer isso com mais frequência dependendo da configuração).

Alternativamente, você pode obter bash ou zsh para ignorar linhas que correspondam a certos padrões (isso já é coberto por outras respostas).

Outra possibilidade no zsh é

% fc -p
% secret-command
% fc -P

fc -p coloca a lista de histórico atual em uma pilha e inicia uma nova que não está associada a um arquivo salvo. fc -P mostra a lista de histórico que não foi salva na pilha e se esquece completamente dela.

Enquanto um processo está em execução, o comando e seus argumentos (e também em alguns sistemas seu ambiente) serão exibidos na tabela de processos ( ps output). O Root pode ver os comandos anteriores no banco de dados de contabilidade do sistema e pode fazer mais registros sem o seu controle. E provavelmente haverá todos os tipos de evidências forenses que podem mostrar mais ou menos o comando que você executou (como tempos de modificação de arquivo). Então você não tem privacidade contra espiões determinados.

    
por 19.01.2011 / 20:10