Respostas:
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:
HISTSIZE
ou HISTFILESIZE
foi definido como 0history-size
foi definida como 0> "$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/secure
no CentOS / RHEL), e se você tem isso, qualquer processo de contabilização e / ou software de auditoria que você pode ter instalado.
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.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á substituí-lo ~/.bash_history
por 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.
>.bash_history
. Talvez alguém estivesse em sua conta e tentou esconder suas trilhas. Verifique horários incomuns de login comlast
, pesquisar até/var/log/auth.log
(dependendo do seu sistema).