¿Qué podría causar que mi historial de bash se borre inesperadamente?

16

Hoy noté que mi historial de bash se borró por completo. No he ejecutado history -cni eliminado el .bash_historyarchivo. Además de eliminar el .bash_historyarchivo y history -c, ¿cómo se puede borrar el historial de bash?

nik.1
fuente
2
Podría haber sucedido por ej >.bash_history. Tal vez alguien estaba en su cuenta e intentó ocultar sus rastros. Verifique los tiempos de inicio de sesión inusuales con last, busque a través /var/log/auth.log(dependiendo de su sistema).
ott--

Respuestas:

17

Al cerrar varias instancias de bash al mismo tiempo, hay una condición de carrera conocida que puede hacer que se borre el historial. Esto ocurre porque no se usa bloqueo cuando se escribe el archivo de historial de bash.

Chet Ramey (el actual mantenedor de bash) dio un buen resumen de las condiciones para este problema:

El código actual (bash-4.3-devel) funciona de esta manera, suponiendo que no haya errores (lib / readline / histfile.c: history_do_write ()):

  • renombrar (histfile, histfile ~)
  • abrir archivo con O_CREAT | O_TRUNC
  • búfer malloc lo suficientemente grande para contener todos los datos del historial
  • escribir todas las entradas del historial en una llamada de escritura (2)
  • cerrar el archivo
  • desvincular (histfile ~)

El código bash-4.2 funciona de la misma manera, excepto que no realiza una copia de seguridad del archivo de historial. Cada shell hace lo mismo cuando sale, suponiendo que histappend no está configurado, como en su configuración.

Hay un par de formas en que el archivo de historial puede terminar de longitud cero: el malloc puede fallar o la escritura puede fallar. En bash-4.2, es demasiado tarde para hacer algo sobre el archivo de historial truncado en ese punto. En bash-4.3, se restaurará el archivo de historial anterior.

Este hilo de la lista de correo de bug-bash contiene una discusión decente de los problemas, las posibles soluciones y las preocupaciones que lo rodean.

También hay algunas otras posibilidades:

  • En algún momento, su HISTSIZEo HISTFILESIZEse estableció en 0
  • En algún momento, su línea de lectura history-sizese estableció en 0
  • Alguien, ya sea intencionalmente o no, borró el historial de bash (a través de > "$HISTFILE"o similar)

En el último caso, es posible que desee verificar que alguien no haya accedido a su cuenta y esté tratando de ocultar sus pistas de una manera cruda. Echar un vistazo a last, /var/log/auth(o /var/log/secureen CentOS / RHEL), y si lo tiene, cualquier proceso de contabilidad y / o software de auditoría que pueda haber instalado.

Chris Down
fuente
1

Cómo eliminé accidentalmente mi historial de bash:

Estaba desarrollando mi propio script alternativo de readline de terminal desde los primeros principios: https://tiswww.cwru.edu/php/chet/readline/rluserman.html

y luego probándolo en una terminal. Esa línea de lectura de GNU tiene un tamaño de historial e instrucciones de preservación de historial incorporadas, por lo que el tamaño de hist puede ser predeterminado y, por lo tanto, todo su historial queda anonadado.

Recuperación del historial si se deja en la memoria:

Si lo detecta antes de un reinicio, o si un terminal se dejó abierto antes del borrado, es posible que pueda encontrar su historial en la memoria. Ejecutar history | cut -c 8- > histback_user1.txten todos los terminales abiertos y para cada usuario. Si eso produce un archivo con su historial extendido, puede reemplazarlo ~/.bash_historypor histback_user1.txt. Compruebe también el historial de todos los usuarios que iniciaron sesión recientemente en el sistema, así como el historial de la raíz. Es fácil borrar accidentalmente el historial de bash en muchas circunstancias, por lo que si desea asegurarse de que no se pierda el historial, necesita un script de copia de seguridad diario.

Eric Leschinski
fuente
Gracias . No sé qué demonios pasó, pero mi historia se restableció ayer y no fue hasta ahora que me di cuenta. Pero, por suerte, no tenía una ventana de terminal abierta, sino 10 (!). Todo está bien ahora.
Marc.2377