Ocultar "history -d" no histórico do bash


14

Se digitar minha senha acidentalmente ou qualquer outra coisa sensível no bash, posso facilmente remover essa linha history -d ROW#, mas sempre fico com o history -d ROW#comando no histórico, mostrando a todos que alguém corrigiu um erro.

Posso acrescentar algo a um comando para impedir que ele apareça no histórico do bash?

Respostas:


27

Para não salvar um único comando no seu histórico, basta precedê-lo com um espaço (marcado aqui):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Esse comportamento é definido no seu ~/.bashrcarquivo, ou seja, nesta linha:

HISTCONTROL=ignoreboth

man bash diz:

HISTCONTROL
Uma lista de valores separados por dois pontos que controla como os comandos são salvos na lista de histórico. Se a lista de valores incluir ignorespace , as linhas que começam com um caractere de espaço não serão salvas na lista de histórico . Um valor de ignoredups faz com que as linhas correspondentes à entrada do histórico anterior não sejam salvas. Um valor de ignoreboth é uma abreviação de ignorespace e ignoredups .

ignoredupsa propósito, é a razão pela qual history | tail -n2aparece apenas uma vez na história no teste acima.


O histórico de um terminal é salvo na RAM e liberado para você ~/.bash_historyassim que você fecha o terminal. Se você deseja excluir uma entrada específica da sua, ~/.bash_historyvocê pode fazê-lo com sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

No último, alterei o delimitador padrão /para _como ele é usado dentro do termo de pesquisa, na verdade, é igual a sed -i '/\/path\//d' .bash_history. Se o comando exibir apenas as linhas que você deseja excluir, adicione a -iopção e mude !dpara dpara executar a exclusão:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere

12

Uma maneira seria definir a HISTIGNOREvariável de ambiente. A partir deman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, é o padrão HISTCONTROL que fornece a solução do tipo digitar um espaço na frente].

Então, por exemplo

HISTIGNORE='history -d*'

Se você quiser que ele seja persistente, exporte-o do seu ~/.bashrc

export HISTIGNORE='history -d*'

6

Você pode

  • Feche a (s) janela (s) do terminal . Isso liberará o histórico mais atual na janela do terminal que você fechar mais recente (depois que as outras janelas forem fechadas) no arquivo/home/$USER/.bash_history

  • Edite o arquivo/home/$USER/.bash_history sem envolver bash, por exemplo, iniciando seu editor favorito viaAlt +F2

    Dessa forma, você pode inspecionar todo o histórico e remover todos os comandos que não deseja mais estar lá.

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui


1

Eu costumo usar:

history -w; history -c; $EDITOR $HISTFILE; history -r

O arquivo de histórico é gravado no disco, limpo na memória, você o edita para fazer o que deseja e, em seguida, o arquivo de histórico editado é lido novamente.

Observe que, se o editor salvar arquivos de backup, a palavra maliciosa ainda poderá aparecer no disco.

Outra opção usada -dé usar números de histórico preditivo:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

Neste exemplo, excluo a coisa ruim, excluo o comando para obter o número do histórico e excluo o comando que usei para excluir o histórico. Tudo é higienizado então.


0

Se você deseja executar um comando sem salvá-lo no histórico, acrescente um espaço extra

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Para que isso funcione, você precisa ignorar o espaço ou ignorar ambos no HISTCONTROL. Por exemplo, execute

HISTCONTROL = ignorespace Para tornar essa configuração persistente, coloque-a no seu .bashrc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.