Eliminar una determinada línea del archivo de historial de Bash

Eliminar una determinada línea del archivo de historial de Bash

¿Cómo puedo eliminar una determinada línea de historyla base de datos?

Respuesta1

Debe cerrar sesión y volver a iniciarla o ejecutarla history -apara que el historial actual se guarde en el disco.

Luego simplemente edite el archivo ~/.bash_history.

Respuesta2

Puede lograr la eliminación del archivo histórico usando la línea de comando en dos pasos:

  1. Al escribir history -d <line_number>se elimina una línea específica del historial en la memoria.
  2. Al escribir history -wse escribe el historial actual en memoria en el ~/.bash_historyarchivo.

Los dos pasos juntos eliminan la línea permanentemente de la memoriahistoriay desde el.bash_historyarchivo también.

Respuesta3

AprevenirPara evitar que un comando se agregue al historial en primer lugar, asegúrese de que la variable de entorno HISTCONTROLcontenga entre sus valores separados por dos puntos el valor ignorespace, por ejemplo (agregar, por ejemplo, a .bashrc):

$ export HISTCONTROL=ignorespace

Esto evitará que se agregue al historial cualquier comando con un espacio inicial. Luego puede borrar el historial por completo ejecutando

$  history -c -w
  ^-- additional space character

Respuesta4

Varias técnicas:

Evite que se almacene información confidencial en el archivo histórico

Si ingresó alguna contraseña en una línea de comando y se da cuenta de que todos los comandos están registrados, puede:

  1. Forzar la salida de la sesión actual sin guardar el historial:

     kill -9 $$
    

    Esto eliminará todo el historial actual.

    1. Como señala correctamentecomentario de S0AndS0, otra forma es modificarnombre del archivo histórico:

      HISTFILE=
      
  2. Escriba ↑ (up arrow)la sesión abierta de bash hasta que se muestre la información confidencial, luego use las teclas de edición de líneas como Ctrl+ Wpara eliminar la información confidencial yentonces ↓ (down arrow)hasta que se solicite una nueva línea vacía,antesmecanografía Enter.

Eliminar información confidencial del archivo de historial

Si te das cuenta de que la información confidencial ya está almacenada y deseas eliminarla, pero no todo tu historial:

Un comando simple sedpodría hacer el trabajo:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

pero, a medida que escribe esto, crea otra línea del historial que contiene el patrón de búsqueda (información confidencial) que está intentando eliminar. Entonces podrías:

sed -e "/$(head -n1)/d" -i .bash_history

Esto se ejecutará head -n1con la entrada del terminal. Parecerá que tu terminal está colgado (no aparecerá ningún mensaje); simplemente escriba la información que desea eliminar del archivo. Este es un truco que le permite ingresar (parte de) un comando sin tener que escribirlo en la línea de comando, lo que lo hace no elegible para su inclusión en el registro del historial. Luego sedutilizará el texto que escribió para buscar .bash_history y eliminar todas las líneas que contengan información confidencial. Nota: si su patrón de información confidencial contiene barras diagonales, debe escaparlas con barras invertidas o cambiar el sedcomando para usar esta sintaxis para especificar un delimitador que no aparece en el patrón:

sed -e "\|$(head -n1)|d" -i .bash_history

Otra forma podría ser eliminar sólo la información confidencial, pero conservar los comandos que contienen la información. Para ello, simplemente puede reemplazar la información confidencial con el texto sustituto de su elección:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Elimine información confidencial de cualquier archivo en un árbol específico

Finalmente, para estar seguros de que esto no se quedará enotroarchivo olvidado:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

enumerará todos los archivos interesados.

find . -type f -print0 |
    xargs -0 grep -lZ "$SENSITIVEINFO" |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

reemplazará todas las apariciones de información confidencial en todos los archivos en el árbol de directorios con raíz en .. Nota: aunque este comando usa xargs -0, no manejará archivos con nuevas líneas en sus nombres.

información relacionada