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

65

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

atualização: eu não sabia que isso poderia ser específico do shell. Minha concha é zsh. Você pode responder a outras conchas para que as pessoas saibam como fazer isso em sua concha.

xenoterracida
fonte
cross-linking a resposta zsh: superuser.com/questions/352788/...
Michael Shigorin

Respostas:

52

Em ZSH :

Primeiro insira setopt HIST_IGNORE_SPACEno seu ~/.zshrc. Agora, depois de fazer login novamente, você pode prefixar os comandos que não deseja que sejam armazenados no histórico com a space.

No manual do usuário , as três opções a seguir podem ser usadas para dizer que determinadas linhas não devem entrar no histórico:

  • HIST_IGNORE_SPACE não armazena comandos prefixados com um espaço
  • HIST_NO_STORE não armazena o comando history ( fc -l )
  • HIST_NO_FUNCTIONS não armazena definições de função
dogbane
fonte
alguma chance de resposta @mmckinst funciona no zsh? ou algo assim? ou talvez qualquer comando que inclui o comando| somecommand
xenoterracide
AFAIK não existe equivalente ao HISTIGNORE do bash no zsh.
21411 dogbane
O @xeno zsh fornece uma função de gancho preexecque pode ser usada para isso. Se retornar diferente de zero, o comando não será salvo no histórico.
Keith
11
para que o zsh ignore vários comandos comuns básicos, aliastei todos eles para ter um espaço à frente ... para c (trabalhos de ls fg bg saem de redefinição clara); faça o alias $ c = "$ c"; feito
Will Norris
4
Para futuros leitores preguiçosos como eu, que ainda não sabem como fazê-lo: setopt HIST_IGNORE_SPACEin~/.zshrc
Al.G.
25

Se você estiver executando o comando repetidamente, convém usar o recurso de ignorar o histórico do seu shell. Digamos que você tenha secret.server.com para o qual você ssh, arquivos FTP etc., que você não deseja que nenhuma linha que mencione secret.server.com seja salva:

Em bashvocê definiria

HISTIGNORE="*secret.server.com*"

enquanto que no zshparâmetro é chamado

HISTORY_IGNORE="*secret.server.com*"

Você pode listar vários padrões com dois pontos separando-os. Observe que cada padrão é comparado com a linha de entrada completa ; portanto, você pode precisar incluir um *. Por exemplo, o seguinte excluirá fortunedo 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 que você lista será salvo .bash_history/ .zsh_historye até a tecla de seta para cima, que normalmente lembra o comando anterior, não funcionará se corresponder ao seu padrão.

Mark McKinstry
fonte
3
alguma chance de isso funcionar no zsh?
Xenoterracide
Existe uma opção para ignorar apenas as linhas que começam com fortuna. Algo como HISTIGNORE="^fortune*"ignorar, fortune -lmas manter myfortune?
Bernhard
@xenoterracide Sim, mas o parâmetro tem um nome diferente. Eu apenas editei na resposta.
n.st
23

No bash, use a HISTCONTROLvariável

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

Mesmo assim, acontece que você esquece de adicionar o espaço e depois quer voltar. Para excluir uma entrada no histórico, use history -d <index>, com indexo número encontrado com o historycomando (primeira coluna).

shellholic
fonte
11
Isso funciona zsh?
Gert
11

A maneira mais fácil de fazer uma viagem única é

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

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

Como alternativa, você pode fazer com que o bash ou o zsh ignore as linhas correspondentes a determinados padrões (isso já é coberto por outras respostas).

Outra possibilidade no zsh é

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

fc -pcoloca a lista de histórico atual em uma pilha e inicia uma nova que não está associada a um arquivo salvo. fc -Paparece aquele histórico não salvo da lista e esquece completamente.

Enquanto um processo estiver em execução, o comando e seus argumentos (e em alguns sistemas também o ambiente) serão exibidos na tabela de processos ( pssaída). O Root pode ver comandos passados ​​no banco de dados de contabilidade do sistema e pode fazer mais registros sem o seu controle. E provavelmente haverá todo tipo de evidência forense que pode mostrar aproximadamente qual comando você executou (como tempos de modificação de arquivo). Portanto, você não obtém privacidade contra bisbilhoteiros determinados.

Gilles 'SO- parar de ser mau'
fonte