O que poderia fazer com que meu histórico bash fosse limpo inesperadamente?

15

Hoje eu notei que meu histórico bash está totalmente limpo. Eu não executei history -c nem excluí o arquivo .bash_history . Além de excluir o arquivo .bash_history e history -c , como o histórico bash pode ser limpo?

    
por nik.1 30.08.2013 / 14:00

2 respostas

15

Ao fechar várias instâncias do bash ao mesmo tempo, há uma condição de corrida conhecida que pode fazer com que o histórico seja limpo. Isso ocorre porque não há bloqueio usado quando o arquivo de histórico do bash é gravado.

Chet Ramey (o atual mantenedor do bash) deu um bom resumo das condições para este problema:

The current (bash-4.3-devel) code works something like this, assuming no errors (lib/readline/histfile.c:history_do_write()):

  • rename (histfile, histfile~)
  • open file with O_CREAT|O_TRUNC
  • malloc buffer large enough to hold all history data
  • write all of the history entries in one write(2) call
  • close file
  • unlink (histfile~)

The bash-4.2 code works the same way except that it does not back up the history file. Each shell does the same thing when it exits, assuming histappend is not set, as in your configuration.

There are a couple of ways the history file can end up zero-length: the malloc can fail, or the write can fail. In bash-4.2, it's too late to do anything about the truncated history file at that point. In bash-4.3, the previous history file will be restored.

Este tópico da lista de discussão do bug-bash contém um decente discussão dos problemas, possíveis soluções e preocupações em torno disso.

Existem também outras possibilidades:

  • Em algum momento, seu HISTSIZE ou HISTFILESIZE foi definido como 0
  • Em algum momento, sua readline history-size foi definida como 0
  • Alguém, intencionalmente ou não, limpou o histórico bash (via > "$HISTFILE" ou similar)

No último caso, você pode querer verificar se alguém não acessou sua conta e está tentando ocultar seus rastros de uma forma crua. Dê uma olhada em last , /var/log/auth (ou /var/log/secure no CentOS / RHEL) e, se tiver, qualquer software de contabilidade e / ou auditoria de processo que você tenha instalado.

    
por 30.08.2013 / 14:10
0

Como eu acidentalmente excluí meu histórico bash:

Eu estava desenvolvendo meu próprio script de linha de respostas alternativa a partir dos primeiros princípios: link

e depois testando em um terminal. O GNU Readline tem um histórico de tamanho e instruções de preservação de histórico embutidas, então o tamanho do hist pode ser padronizado e, assim, todo o seu histórico é perdido.

Recuperação da história se for deixado na memória:

Se você pegá-lo antes de uma reinicialização, ou se um terminal foi deixado aberto antes da limpeza, você poderá encontrar seu histórico na memória. Execute history | cut -c 8- > histback_user1.txt em todos os terminais deixados abertos e para todos os usuários. Se isso produzir um arquivo com seu histórico estendido, você poderá substituir ~/.bash_history por histback_user1.txt . Além disso, verifique o histórico de todos os usuários registrados recentemente no sistema, bem como o histórico do root. É fácil limpar acidentalmente o histórico bash sob muitas circunstâncias, portanto, se você quiser ter certeza de que não há perda de histórico, é necessário um script de backup diário.

    
por 21.06.2018 / 06:45