Ocultar "history -d" no histórico bash

12

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

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

    
por Kalle Ling 07.12.2017 / 15:51

4 respostas

25

Para não salvar um único comando em seu histórico, basta precedê-lo com um espaço (marcado com 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

Este comportamento está definido no seu arquivo ~/.bashrc , 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   salvo 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 são   salvo na lista de histórico . Um valor de ignorados causa linhas   correspondendo a entrada do histórico anterior para não ser salvo. Um valor de    ignoreboth é um atalho para ignorespace e ignorados .

ignoredups , a propósito, é a razão pela qual history | tail -n2 aparece apenas uma vez no histórico do teste acima.

O histórico de um terminal é salvo na RAM e liberado para o seu ~/.bash_history assim que você fecha o terminal. Se você quiser excluir uma entrada específica do seu ~/.bash_history , poderá 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, mudei o delimitador padrão / para _ como é usado dentro do termo de pesquisa. Na verdade, isso é igual a sed -i '/\/path\//d' .bash_history . Se o comando gerar apenas as linhas que você deseja excluir, adicione a opção -i e altere !d para d para realizar 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
    
por dessert 07.12.2017 / 15:59
11

Uma maneira seria definir a variável de ambiente HISTIGNORE . De man 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 alternativa tipo-a-espaço].

Então, por exemplo

HISTIGNORE='history -d*'

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

export HISTIGNORE='history -d*'
    
por steeldriver 07.12.2017 / 16:08
6

Você pode

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

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

    Desta forma, você pode inspecionar todo o histórico e remover quaisquer comandos que você não queira mais estar lá.

por sudodus 07.12.2017 / 16:29
1

Eu geralmente uso history -w; history -c; $EDITOR $HISTFILE; history -r

O arquivo de histórico é gravado no disco, apagado na memória, você o edita para fazer o que quiser 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 usando -d é usar números preditivos de histórico:

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, eu excluo a coisa ruim, eu excluo o comando para obter o número do histórico e, em seguida, excluo o comando que usei para excluir o histórico. Tudo é higienizado então.

    
por Seth Robertson 08.12.2017 / 01:30