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

16

Hoje notei que minha história do bash está completamente limpa. Não executei history -cnem excluí o .bash_historyarquivo. Além de excluir o .bash_historyarquivo e history -c, como o histórico do bash pode ser limpo?

nik.1
fonte
2
Poderia ter acontecido por exemplo >.bash_history. Talvez alguém estivesse em sua conta e tentou esconder suas trilhas. Verifique horários incomuns de login com last, pesquisar até /var/log/auth.log(dependendo do seu sistema).
#

Respostas:

17

Ao fechar várias instâncias do bash ao mesmo tempo, existe 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) fez um bom resumo das condições para esse problema:

O código atual (bash-4.3-devel) funciona assim, assumindo que não há erros (lib / readline / histfile.c: history_do_write ()):

  • renomear (arquivo histórico, arquivo histórico ~)
  • abrir arquivo com O_CREAT | O_TRUNC
  • buffer malloc grande o suficiente para armazenar todos os dados do histórico
  • escreva todas as entradas do histórico em uma chamada de gravação (2)
  • fechar arquivo
  • desvincular (arquivo de histórico ~)

O código bash-4.2 funciona da mesma maneira, exceto que não faz backup do arquivo de histórico. Cada shell faz a mesma coisa quando sai, assumindo que o histappend não está definido, como na sua configuração.

Existem algumas maneiras pelas quais o arquivo de histórico pode acabar com tamanho zero: o malloc pode falhar ou a gravação pode falhar. No bash-4.2, é tarde demais para fazer qualquer coisa sobre o arquivo de histórico truncado nesse momento. No bash-4.3, o arquivo de histórico anterior será restaurado.

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

Existem também outras possibilidades:

  • Em algum momento, seu HISTSIZEou HISTFILESIZEfoi definido como 0
  • Em algum momento, sua linha de leitura history-sizefoi definida como 0
  • Alguém, intencional ou não, limpou a história do bash (via > "$HISTFILE"ou similar)

No último caso, convém verificar se alguém não acessou sua conta e está tentando ocultar seus rastros de maneira grosseira. Dê uma olhada last, /var/log/auth(ou /var/log/secureno CentOS / RHEL), e se você tem isso, qualquer processo de contabilização e / ou software de auditoria que você pode ter instalado.

Chris Down
fonte
1

Como excluí acidentalmente meu histórico do bash:

Eu estava lançando meu próprio script readline de terminal alternativo a partir dos primeiros princípios: https://tiswww.cwru.edu/php/chet/readline/rluserman.html

e depois testá-lo em um terminal. Que o GNU Readline possui um tamanho de histórico e instruções de preservação de histórico incorporadas, para que o tamanho do histórico possa ser padronizado e, portanto, todo o seu histórico seja deslumbrado.

Recuperação do histórico se deixada na memória:

Se você capturá-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.txtem todos os terminais deixados abertos e para todos os usuários. Se isso produzir um arquivo com seu histórico estendido, você poderá substituí-lo ~/.bash_historypor histback_user1.txt. Verifique também o histórico de todos os usuários que efetuaram login recentemente no sistema, bem como o histórico do root. É fácil limpar acidentalmente o histórico do bash em muitas circunstâncias; portanto, se você quiser ter certeza de que não há perda de histórico, precisará de um script de backup diário.

Eric Leschinski
fonte
Obrigado . Não sei o que diabos aconteceu, mas minha história foi redefinida ontem e não foi até agora que eu notei. Mas, para minha sorte, eu não tinha uma janela de terminal aberta, mas 10 (!). Está tudo bem agora.
Marc.2377