Excluindo histórico de ~ / .bash_history

8

Tenho algumas perguntas sobre o histórico do terminal ou da linha de comando armazenado ~/.bash_history.

  1. Eu posso ver o arquivo no terminal com o historycomando, mas se eu tentar abri-lo, gedit bash_historyo arquivo estará completamente vazio. Por quê?

  2. Eu descobri como excluir um certo número de linhas no arquivo do terminal com esta linha de código:

    for i in {1..N}; do history -d N; done

    onde N é o número de linhas (ou comandos) que você deseja excluir, mas agora o arquivo de histórico mostra esse último comando e isso não é muito inteligente se você estiver tentando cobrir suas coisas. Portanto, a pergunta é: como posso fornecer a última linha de código e garantir que isso não seja registrado?

Sei lá
fonte
Para observação futura, se você iniciar qualquer comando com um espaço, esse comando não será salvo no seu histórico.
Paddy Landau

Respostas:

18
  1. Você acabou de esquecer o ponto anterior, o comando para abrir o arquivo de histórico do terminal (bash) é

    gedit ~/.bash_history

    Este arquivo é atualizado apenas quando você fecha um terminal.

  2. Para remover as últimas 10 linhas deste arquivo e não gravar esse comando, abra um novo terminal e execute a seguinte cadeia de comandos:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    ou

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    ou

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedou headapaga respectivamente as linhas selecionadas ~/.bash_history, history -climpa o histórico do terminal e exitfecha-o.

sobremesa
fonte
Uma alternativa mais curta e esperançosamente mais rápida a for+ sed: head -n -Nem maiúsculas Né o número de linhas a serem removidas. stackoverflow.com/a/13380679/711006
Melebius
2
@ Melebius Parece promissor, mas como você redireciona a saída para o arquivo de entrada que a substitui? head -n -N testfile > testfileapenas limpa o arquivo! Eu adicionei uma solução alternativa, no entanto, certamente não é mais curta.
dessert
Você está certo, eu esqueci que headnão pode funcionar no local como sed. Eu estava procurando principalmente um único sedcomando substituindo seu forloop. Existem algumas opções na página que vinculei, mas elas não parecem tão compreensíveis quanto o seu código.
Melebius
@ Melebius Veja sed1line.txt para isso - eu adicionei acima, não é muito menor, mas deve ser mais rápido.
dessert
4

O arquivo bash_history é um arquivo oculto, começando com um ponto. Você precisa fazer

gedit ~/.bash_history

Isso abrirá o arquivo no gedit.

George Udosen
fonte
1

Se você deseja excluir apenas certas partes do seu log de comandos , os métodos acima estão bem. Se você deseja interromper o log de comandos para uma sessão bash específica, emita o comando

unset HISTFILE

Para ser mais drástico, se você não deseja que nenhum de seus comandos seja registrado , você pode fazer

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

Observe que o primeiro método entraria em vigor apenas para uma única sessão, enquanto o segundo método interromperia o log de comandos para todas as sessões futuras.

Mukesh Sai Kumar
fonte
1

Sei que isso já tem uma resposta aceita, mas é assim que faço desde os anos 80. É uma ótima maneira de esconder suas faixas e é uma abordagem multifásica. Na maioria das vezes é aquele que não é notado, a menos que esteja prestando atenção. Aqui está como é feito.

Abra um terminal / shell / sessão e faça:

 chmod 444 ~/.bash_history

saia do shell, abra um terminal / shell / sessão e faça: Aqui estão algumas maneiras criativas de apagar o histórico permanentemente

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (crie um histórico falso)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

então, para uma boa medida:

 chmod 444 ~/.bash_history

sair do shell

abra um novo shell e digite

 history

o que o torna menos perceptível é que, se alguém fizer um ls -ratl, o ~ / .bash_history acabará por desaparecer no barulho da lista de diretórios. Não aparecerá como um link que atrairia atenção desnecessária. A maioria das pessoas não faz um -a em sua raiz, o que é útil quando a emulação é desejada.

A desvantagem dessa abordagem é que você perde a capacidade de voltar e recuperar seu histórico. o arquivo ~ / .bash_history real também pode acabar no topo de uma lista de diretórios, pois pode acabar com uma data de modificação muito antiga ao longo do tempo, o que por si só pode levar à descoberta de que algo está errado.

Div
fonte
se você usa 9999999 ddpara excluir todas as linhas no arquivo, em seguida :%d, :1,$dou dGtrabalho muito melhor
phuclv
0

1) corra sh; isso gera um subshell de cinzas, que não registra a história. Editar a partir daí

2) Adicione a linha HISTCONTROL=ignorebothpara .bashrc, e fazer exec bashpara substituir permanentemente o shell atual com um reinicializado um, em seguida, fazer todos os comandos que você não quer registrados com um espaço à esquerda.

Joshua
fonte
0

desde que eu não posso comentar ainda, adicionarei meus comentários como resposta:

man history vai responder tudo.

A resposta ao número 1 é que a história está na memória. history -apara salvar no arquivo imediatamente. history -wtambém salvará, mas poderá atrapalhar outras sessões.

resposta 2: history -agedit, exclua as linhas que você deseja,history -r

gcb
fonte
0

O histórico não é salvo até você sair do shell. Tente sair do shell e, em seguida, consulte .bash_history novamente. O histórico do comando deve estar lá.

O Espreitador do Raio
fonte
Editado como sugerido Good enough now?
The Lightning Stalker