Remova uma determinada linha do arquivo de histórico do Bash

Remova uma determinada linha do arquivo de histórico do Bash

Como posso remover uma determinada linha do historybanco de dados de?

Responder1

Você precisa sair e entrar novamente ou executar history -apara que o histórico atual seja confirmado no disco.

Depois é só editar o arquivo ~/.bash_history.

Responder2

Você pode conseguir a remoção do arquivo de histórico usando a linha de comando em duas etapas:

  1. Digitar history -d <line_number>exclui uma linha especificada do histórico na memória.
  2. A digitação history -wgrava o histórico atual da memória no ~/.bash_historyarquivo.

As duas etapas juntas removem a linha permanentemente da memóriahistóriae do.bash_historyarquivo também.

Responder3

Paraevitarum comando seja adicionado ao histórico em primeiro lugar, certifique-se de que a variável de ambiente HISTCONTROLcontém entre seus valores separados por dois pontos o valor ignorespace, por exemplo (adicione, por exemplo, a .bashrc):

$ export HISTCONTROL=ignorespace

Isso impedirá que qualquer comando com espaço à esquerda seja adicionado ao histórico. Você pode então limpar o histórico completamente executando

$  history -c -w
  ^-- additional space character

Responder4

Várias técnicas:

Impedir que informações confidenciais sejam armazenadas no arquivo de histórico

Se você digitou alguma senha em uma linha de comando e percebe que todos os comandos estão registrados, você pode:

  1. Forçar a saída da sessão atual sem salvar o histórico:

     kill -9 $$
    

    Isso eliminará todo o histórico atual.

    1. Como corretamente apontado porS0AndS0'comentário, outra maneira é modificarnome do arquivo histórico:

      HISTFILE=
      
  2. Digite ↑ (up arrow)na sessão open bash até que as informações confidenciais sejam mostradas e, em seguida, use as teclas de edição de linha como Ctrl+ Wpara excluir as informações confidenciais eentão ↓ (down arrow)até que uma nova linha vazia seja solicitada,antesdigitando Enter.

Exclua informações confidenciais do arquivo de histórico

Se você perceber que informações confidenciais já estão armazenadas e quiser excluí-las, mas não todo o seu histórico:

Um comando simples sedpoderia fazer o trabalho:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

mas, ao digitar isso, você cria outra linha de histórico contendo o padrão de pesquisa (informações confidenciais) que está tentando excluir. Então você poderia:

sed -e "/$(head -n1)/d" -i .bash_history

Isso será executado head -n1com entrada do terminal. Parecerá que seu terminal está travado (não haverá aviso); basta digitar as informações que deseja excluir do arquivo. Este é um truque para permitir que você insira (parte de) um comando sem realmente digitá-lo na linha de comando, tornando-o inelegível para inclusão no registro do histórico. Em seguida, sedusará o texto que você digitou para pesquisar .bash_history e excluir todas as linhas que contenham informações confidenciais. Nota: se o seu padrão de informações confidenciais contiver barras, você deverá escapá-las com barras invertidas ou então alterar o sedcomando para usar esta sintaxe para especificar um delimitador que não aparece no padrão:

sed -e "\|$(head -n1)|d" -i .bash_history

Outra forma poderia ser excluir apenas as informações confidenciais, mas manter os comandos que contêm as informações. Para isso, você pode simplesmente substituir informações confidenciais por um texto substituto de sua escolha:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Exclua informações confidenciais de qualquer arquivo em uma árvore específica

Finalmente, para ter certeza de que isso não permaneceráoutroarquivo esquecido:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

listará todos os arquivos em questão.

find . -type f -print0 |
    xargs -0 grep -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

substituirá todas as ocorrências de informações confidenciais em todos os arquivos na árvore de diretórios com raiz em .. Nota: embora este comando use xargs -0, ele não manipulará arquivos com novas linhas em seus nomes.

informação relacionada