
Como posso remover uma determinada linha do history
banco de dados de?
Responder1
Você precisa sair e entrar novamente ou executar history -a
para 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:
- Digitar
history -d <line_number>
exclui uma linha especificada do histórico na memória. - A digitação
history -w
grava o histórico atual da memória no~/.bash_history
arquivo.
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 HISTCONTROL
conté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:
Forçar a saída da sessão atual sem salvar o histórico:
kill -9 $$
Isso eliminará todo o histórico atual.
Como corretamente apontado porS0AndS0'comentário, outra maneira é modificarnome do arquivo histórico:
HISTFILE=
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 sed
poderia 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 -n1
com 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, sed
usará 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 sed
comando 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.