Como posso remover uma determinada linha do history
banco de dados?
linux
bash
history
command-history
w0rldart
fonte
fonte
vim ~/.bash_history
) com um espaço; Os comandos que começam com um espaço geralmente não são registrados (consulte$HISTCONTROL
).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 da memória no~/.bash_history
arquivo.As duas etapas juntas removem a linha permanentemente do histórico da memória e também do arquivo .bash_history .
fonte
history -w
do histórico?<line_number>
apenashistory | grep [unwanted_content]
para obter uma lista com todas as linhas que contêm[unwanted_content]
(como senhas).Para impedir que um comando seja adicionado ao histórico em primeiro lugar, verifique se a variável de ambiente
HISTCONTROL
contém entre seus valores separados por dois pontos o valorignorespace
, por exemplo (adicione, por exemplo, a.bashrc
):Isso impedirá que qualquer comando com um espaço à esquerda seja adicionado ao histórico. Você pode limpar o histórico completamente executando
fonte
Primeiro de tudo, se o comando que você está prestes a emitir for sensível, inseguro ou se você não precisar dele, bagunçando seu histórico, é melhor / mais rápido impedir que ele entre no histórico. Certifique-se de que
$HISTCONTROL
contémignorespace
:Em seguida, prossiga com qualquer espaço que você não desejar em seu histórico:
Se você acidentalmente colocar um comando indesejado no histórico, desde que sua sessão do bash ainda esteja aberta, o comando ainda não tocou o disco. Para excluir o comando anterior no histórico, emita:
Observe o espaço à esquerda; Este comando requer
ignorespace
, caso contrário, ele será excluído!Se você deseja excluir os últimos comandos, localize o último e o primeiro número do histórico:
Nesse caso, 602 e 599. Emita:
(Sem
ignorespace
, seria 603..599.)Se você não deseja que nenhum histórico da sua sessão atual atinja o disco, saia usando:
A abordagem até agora é nem mesmo permitir que itens sensíveis do histórico sejam gravados no disco para segurança extra, porque, em teoria, os dados excluídos da mídia não volátil ainda podem ser recuperados.
Se, no entanto, os comandos que você deseja remover forem de uma sessão anterior, eles já terão sido anexados à
$HISTFILE
saída. Manipulando a história com os comandos acima ainda só vai acrescentar os restantes novos itens para o$HISTFILE
, na saída . Para sobrescrever a$HISTFILE
exibição da sessão atual de todo o histórico, instale agora :Obviamente, para itens do histórico que já estão no disco, a alternativa para editar o histórico com
history -d
comandos e depois emitirhistory -w
é editá-lo$HISTFILE
com um editor de texto.fonte
$HISTFILE
, na saída .” Na verdade, isso não é exatamente verdade. Parece apenas acrescentar os novos itens restantes que se destacam do tamanho do histórico original. Por exemplo, se eu remover 5 itens originais e adicionar 15 novos, apenas os 10 últimos serão anexados, enquanto eu esperaria que todos os 15 novos fossem anexados. Eu acho que isso é um bug, porque não consigo ver como isso é uma funcionalidade desejável.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, percebe que todos os comandos estão registrados, você pode:
Forçar a saída da sessão atual sem salvar o histórico:
Isso eliminará todo o histórico atual.
Digite ↑ (up arrow)na sessão do bash aberto até que as informações sigilosas sejam exibidas, use as teclas de edição de linha como Ctrl+ Wpara excluir as informações sigilosas e , ↓ (down arrow) até que uma nova linha vazia seja solicitada, antes de digitar Enter.
Excluir informações confidenciais do arquivo de histórico
Se você perceber que informações confidenciais já estão armazenadas e deseja excluí-las, mas não todo o seu histórico:
Um
sed
comando simples pode fazer o trabalho:mas, ao digitar isso, você cria outra linha do histórico contendo o padrão de pesquisa (informações confidenciais) que está tentando excluir. Então você poderia:
Isso será executado
head -n1
com a entrada do terminal. Parece que o seu terminal está travado (não haverá um prompt); basta digitar as informações que você deseja excluir do arquivo. Esse é 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 seguidased
, usará o texto digitado para pesquisar.bash_history
e excluir todas as linhas que contêm as informações confidenciais. Nota: se o seu padrão de informações confidenciais contiver barras, você deve escapá-las com barras invertidas ou alterar osed
comando para usar esta sintaxe para especificar um delimitador que não apareça no padrão:Outra maneira 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:
Excluir informações confidenciais de qualquer arquivo em uma árvore específica
Por fim, para garantir que isso não fique em outro arquivo esquecido:
listará todos os arquivos em questão.
substituirá todas as ocorrências de informações confidenciais em todos os arquivos na árvore de diretórios enraizada em
.
. Nota: mesmo que este comando usexargs -0
, ele não manipulará arquivos com novas linhas em seus nomes.fonte
Localize a linha que deseja excluir pressionando ↑ (up arrow)até que apareça e, em seguida, pressione Ctrl+ U. Isso deve remover a linha.
Se você usar o
history
comando, poderá ver que a linha foi substituída por um asterisco.fonte
*
.Se você precisar remover várias linhas ao mesmo tempo, normalmente uso isso:
Se você precisar remover o último comando, poderá usar:
fonte
history | grep <string>
ainda mostra todas as linhas que pretendiam excluir ...history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Se você precisar remover um intervalo de linhas do histórico, a seguinte função do bash poderá economizar algum tempo:
A função deve ser normalmente adicionada a
$HOME/.bashrc
. Para usar a função imediatamente, você precisará que o arquivo seja lido novamente pelo shell em execução (. $HOME/.bashrc
). Em seguida, para excluir, por exemplo, os comandos 200-210 do histórico:(Nota: esta pergunta está entre os principais resultados da pesquisa, se você excluir um intervalo de comandos do histórico do bash. Portanto, embora o acima seja mais do que o que a pergunta faz, pode ser útil para alguns leitores.)
fonte
for
declaração:for n in $(seq "$2" "$1")
é estilisticamente preferida por alguns e, seseq
não funcionar, tentefor ((n="$2"; n>="$1"; n--))
.59 é o número da linha. Não pode ser nada mais doce do que isso :)
fonte
Apenas tente estes,
isso exibirá o ID do histórico e o comando, por exemplo
usar,
Aqui 211 é o id da história. Agora verifique isso usando
fonte
Sei que já faz muito tempo 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 ele faz é simples:
history -w
: escreve o histórico em cache dentro"${HISTFILE}"
nano "${HISTFILE}"
: permita-me editar"${HISTFILE}"
Você pode usar um script sed ou o que quiser 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.
fonte
Você também pode editar o arquivo de histórico diretamente, por exemplo,
nano .bash_history
se estiver no shell bash?fonte