Você precisa fazer logout e voltar ou executar history -a
para que o histórico atual seja confirmado no disco.
Em seguida, basta editar o arquivo ~/.bash_history
.
Como posso remover uma determinada linha do banco de dados de history
?
Você pode conseguir a remoção do arquivo de histórico usando a linha de comando em duas etapas:
history -d <line_number>
exclui uma linha especificada do histórico na memória. history -w
grava o histórico atual na memória no arquivo ~/.bash_history
. Os dois passos juntos removem a linha permanentemente do histórico memória e do arquivo .bash_history também.
Para impedir que um comando seja adicionado ao histórico, certifique-se de que a variável de ambiente HISTCONTROL
contenha 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 um espaço à esquerda seja adicionado ao histórico. Você pode então limpar completamente o histórico executando
$ history -c -w
^-- additional space character
Primeiro de tudo, se o comando que você está prestes a emitir é confidencial, inseguro, ou você simplesmente não precisa dele enchendo seu histórico, é melhor / mais rápido apenas impedir que ele entre no histórico no primeiro. Lugar, colocar. Certifique-se de que $HISTCONTROL
contenha ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Em seguida, continue com qualquer comando que você não deseja em seu histórico com um espaço:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Se você acidentalmente colocar um comando indesejado no histórico, desde que sua sessão bash ainda esteja aberta, o comando ainda não tocou no disco. Para excluir o comando anterior no histórico, problema:
(bash)$ history -d $((HISTCMD-1))
Observe o espaço principal; este comando requer ignorespace
, caso contrário, ele simplesmente deletará a si mesmo!
Se você quiser excluir os últimos comandos, encontre o último e o primeiro número do histórico:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn\'t-work
602 otherwise-unwanted
Neste caso, 602 e 599. Em seguida, emita:
(bash)$ for i in {602..599}; do history -d $i; done
(Sem ignorespace
, seria 603..599.)
Se você não quiser que nenhum histórico de sua sessão atual acesse o disco, saia usando:
(bash)$ kill -9 $$
A abordagem até agora é a de não deixar que itens de histórico sensíveis sejam gravados em disco para segurança extra, porque, em teoria, os dados excluídos de mídias não voláteis ainda podem ser recuperados.
Se, no entanto, o (s) comando (s) que você deseja remover forem de uma sessão anterior, eles já terão sido anexados à $HISTFILE
na saída. Manipular o histórico com os comandos acima ainda só acrescentará os itens restantes novos ao $HISTFILE
, ao sair . Para sobrescrever o $HISTFILE
com a visualização da sessão atual do histórico inteiro , agora , edição:
(bash)$ history -w
É claro que, para itens de histórico já em disco, a alternativa para editar o histórico com os comandos history -d
e, em seguida, emitir history -w
, é editar o $HISTFILE
com um editor de texto.
Várias técnicas:
Se você inseriu alguma senha em uma linha de comando, então perceba que todos os comandos estão registrados, você poderia:
Forçar a saída da sessão atual sem salvar o histórico:
kill -9 $$
Isso eliminará todo o histórico atual.
Digite ↑ (seta para cima) na sessão bash aberta até que as informações sensíveis sejam mostradas, então use as teclas de edição de linha como Ctrl + W para deletar as informações sensíveis, e então ↓ (seta para baixo) até que uma nova linha vazia seja solicitada, antes digitando Digite .
Se você perceber que informações confidenciais já estão armazenadas e deseja excluí-las, mas não todo o histórico:
Um simples comando sed
pode fazer o trabalho:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
mas, conforme você digita isso, você cria outra linha do histórico que contém o padrão de pesquisa (informações confidenciais) que você está tentando excluir. Então você poderia:
sed -e "/$(head -n1)/d" -i .bash_history
Isso executará head -n1
com entrada do terminal.
Aparecerá que seu terminal está travado (não haverá um prompt);
basta digitar as informações que você deseja excluir do arquivo.
Este é um truque para você entrar (parte de) um comando
sem realmente digitá-lo na linha de comando,
tornando-o inelegível para inclusão no registro histórico.
Então, sed
usará o texto que você digitou para pesquisar .bash_history
e apague todas as linhas contendo as informações sensíveis.
Nota: se o seu padrão de informações confidenciais contiver barra (s),
você deve escapar deles com barras invertidas,
ou então altere o comando sed
para usar esta sintaxe
para especificar um delimitador que não apareça no padrão:
sed -e "\|$(head -n1)|d" -i .bash_history
Outra maneira seria 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.
Por fim, para ter certeza de que isso não ficará em outro arquivo esquecido:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
listará todos os arquivos relacionados.
find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \n \0 |
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: mesmo que este comando use xargs -0
,
ele não manipulará arquivos com novas linhas em seus nomes.
Localize a linha que deseja apagar pressionando ↑ (seta para cima) até que apareça, depois pressione Ctrl + U . Isso deve remover a linha.
Se você usar o comando history
, poderá ver que a linha foi substituída por um asterisco.
Se você precisar remover várias linhas ao mesmo tempo, normalmente uso isso:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
Se você precisar remover o último comando, use:
history -d $((HISTCMD-2))
Se você precisar remover um intervalo de linhas do histórico, a seguinte função bash pode economizar algum tempo:
function histdel() {
[ $# -eq 1 ] && history -d "$1" && history -w
if [ $# -eq 2 -a "$1" -le "$2" ]; then
for n in 'seq "$2" "$1"'; do
history -d "$n"
done
history -w
fi
}
A função deve ser normalmente adicionada a $HOME/.bashrc
. Para usar a função imediatamente, você precisará ter o arquivo lido novamente pelo seu shell em execução ( . $HOME/.bashrc
). Então, para excluir, e. comandos 200-210 do histórico:
$ histdel 200 210
(Nota: Esta questão está entre os principais resultados da pesquisa se você procurar por excluir um intervalo de comandos do histórico bash. Então, enquanto o acima é mais do que a pergunta, ele pode ser útil para alguns leitores). / p>
history | sed -i 59d
59 é o número da linha. Não pode ser nada mais doce do que isso:)
Apenas tente isso,
$ history
isso exibirá o id do histórico e o comando, por exemplo
.
.
211 ls
212 javac Welcome.java
213 java welcome
.
.
usar,
$ history -d 211
Aqui 211 é o id do histórico. Agora, verifique isso usando
$ history
.
.
211 javac Welcome.java
212 java welcome
.
.
Eu sei que já faz muito tempo desde que essa pergunta foi feita e respondida, mas mostrarei meu método para limpar meu arquivo de histórico e fazer logout ao mesmo tempo.
Eu corro:
history -w && nano "${HISTFILE}" && history -c && exit
O que isso faz é simples:
history -w
: escreve o histórico em cache dentro de "${HISTFILE}"
nano "${HISTFILE}"
: permite que eu edite "${HISTFILE}"
Você pode usar um script sed ou o que você quiser para limpar seu "${HISTFILE}"
history -c
: limpe o histórico em cache para que este último comando não seja anexado. exit
: desconecte-me anexando o histórico em cache ... mas está vazio;) Após esse comando, você será desconectado com um arquivo de histórico limpo. Faça o login para verificar seu histórico;)
Espero que isso ajude alguém.
Você também pode editar o arquivo de histórico diretamente, por exemplo, nano .bash_history
se você estiver no bash shell?
Tags bash history linux command-history