
¿Cómo puedo eliminar una determinada línea de history
la base de datos?
Respuesta1
Debe cerrar sesión y volver a iniciarla o ejecutarla history -a
para 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:
- Al escribir
history -d <line_number>
se elimina una línea específica del historial en la memoria. - Al escribir
history -w
se escribe el historial actual en memoria en el~/.bash_history
archivo.
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 HISTCONTROL
contenga 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:
Forzar la salida de la sesión actual sin guardar el historial:
kill -9 $$
Esto eliminará todo el historial actual.
Como señala correctamentecomentario de S0AndS0, otra forma es modificarnombre del archivo histórico:
HISTFILE=
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 sed
podrí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 -n1
con 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 sed
utilizará 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 sed
comando 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.