Remove uma certa linha do arquivo de histórico do Bash

130

Como posso remover uma determinada linha do banco de dados de history ?

    
por w0rldart 31.01.2012 / 16:43

12 respostas

97

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 .

    
por 31.01.2012 / 17:01
141

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

  1. A digitação de history -d <line_number> exclui uma linha especificada do histórico na memória.
  2. Digitar 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.

    
por 31.01.2012 / 17:09
37

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
    
por 01.02.2012 / 23:19
30

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.

    
por 18.06.2013 / 18:33
14

Várias técnicas:

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

Se você inseriu alguma senha em uma linha de comando, então perceba que todos os comandos estão registrados, você poderia:

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

     kill -9 $$
    

    Isso eliminará todo o histórico atual.

  2. 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 .

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 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.

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

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.

    
por 19.07.2013 / 14:50
10

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.

    
por 01.04.2015 / 18:00
4

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))
    
por 07.01.2013 / 06:53
3

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>     

por 26.10.2012 / 16:09
3
history | sed -i 59d

59 é o número da linha. Não pode ser nada mais doce do que isso:)

    
por 03.04.2013 / 23:16
3

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
.
.

    
por 04.03.2014 / 12:16
2

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:

  1. history -w : escreve o histórico em cache dentro de "${HISTFILE}"
  2. nano "${HISTFILE}" : permite que eu edite "${HISTFILE}" Você pode usar um script sed ou o que você quiser para limpar seu "${HISTFILE}"
  3. history -c : limpe o histórico em cache para que este último comando não seja anexado.
  4. 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.

    
por 30.09.2015 / 06:57
-1

Você também pode editar o arquivo de histórico diretamente, por exemplo, nano .bash_history se você estiver no bash shell?

    
por 27.03.2017 / 16:10