Eliminar una determinada línea del archivo del historial de Bash
¿Cómo puedo eliminar una determinada línea de la base de datos de history
?
¿Cómo puedo eliminar una determinada línea de la base de datos de history
?
Puede lograr la eliminación del archivo del historial utilizando la línea de comandos en dos pasos:
history -d <line_number>
se borra una línea específica del historial en la memoria. history -w
escribe el historial actual en memoria en el archivo ~/.bash_history
. Los dos pasos juntos eliminan la línea permanentemente del historial en memoria y del archivo .bash_history también.
Para evitar que un comando se añada 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 (añada por ejemplo a .bashrc
):
$ export HISTCONTROL=ignorespace
Esto evitará que cualquier comando con un espacio inicial se añada al historial. A continuación, puede borrar el historial por completo ejecutando
$ history -c -w
^-- additional space character
En primer lugar, si el comando que está a punto de emitir es sensible, inseguro, o simplemente no necesita que se llene el historial, es mejor/ más rápido evitar que entre en el historial en primer lugar. Asegúrese de que $HISTCONTROL
contiene ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Luego proceda con cualquier comando que no quiera en su historial con un espacio:
(bash)$ sensitive-cmd-with --password 82cf7dfe
(bash)$ rm -r... # One-off recursive remove; mustn't be accidentally repeated!
Si accidentalmente pone un comando no deseado en el historial, siempre que su sesión de bash esté todavía abierta, el comando no ha tocado todavía el disco. Para borrar el comando anterior en el historial, emita:
(bash)$ history -d $((HISTCMD-1))
Note el espacio inicial; este comando requiere ignorespace
, de lo contrario se borrará solo!
Si quiere borrar los últimos comandos, encuentre el último y el primer número del historial:
(bash)$ history 5
598 ok
599 sensitive
600 unsafe
601 doesn
En este caso 602 y 599. Entonces emite:
(bash)$ for i in {602..599}; do history -d $i; done “`
(Sin ignorespace
, sería 603..599.)
Si no quieres que ningún historial de tu sesión actual llegue al disco, sal con:
(bash)$ kill -9 $$
El enfoque hasta ahora es no dejar que los elementos sensibles del historial se escriban en el disco para mayor seguridad, porque en teoría los datos borrados de los medios no volátiles aún pueden ser recuperados.
Sin embargo, si el comando o los comandos que desea eliminar son de una sesión anterior, ya se habrán añadido al $HISTFILE
al salir. Manipulando el historial con los comandos anteriores sólo se aplicarán los elementos nuevos restantes al $HISTFILE
, al salir. Para sobrescribir el $HISTFILE
con la vista de la sesión actual del todo el historial, ahora, emita:
(bash)$ history -w
Por supuesto, para los elementos del historial que ya están en el disco, la alternativa a editar el historial con comandos history -d
y luego emitir history -w
, es editar el $HISTFILE
con un editor de texto.t-work
602 otherwise-unwanted
”`
En este caso 602 y 599. Entonces emite:
0x1&
(Sin 0x6&, sería 603..599.)
Si no quieres que ningún historial de tu sesión actual llegue al disco, sal con:
0x1&
El enfoque hasta ahora es no dejar que los elementos sensibles del historial se escriban en el disco para mayor seguridad, porque en teoría los datos borrados de los medios no volátiles aún pueden ser recuperados.
Sin embargo, si el comando o los comandos que desea eliminar son de una sesión anterior, ya se habrán añadido al 0x6& al salir. Manipulando el historial con los comandos anteriores sólo se aplicarán los elementos nuevos restantes al 0x6&, al salir. Para sobrescribir el 0x6& con la vista de la sesión actual del todo el historial, ahora, emita:
0x1&
Por supuesto, para los elementos del historial que ya están en el disco, la alternativa a editar el historial con comandos 0x6& y luego emitir 0x6&, es editar el 0x6& con un editor de texto.
Varias técnicas:
Si ha introducido alguna contraseña en una línea de comandos y luego se da cuenta de que todos los comandos se registran, podría:
Forzar la salida de la sesión actual sin guardar el historial:
Teclear ↑ (flecha arriba) en la sesión abierta de bash hasta que se muestre la información sensible, entonces utilizar las teclas de edición de línea como Ctrl+W para borrar la información sensible, y entonces ↓ (flecha abajo) hasta que se solicite una nueva línea vacía, antes de teclear Enter.
Si te das cuenta de que la información sensible ya está almacenada, y quieres borrarla, pero no todo tu historial:
Un simple comando sed
podría hacer el trabajo:
sed -e '/SeNsItIvE InFo/d' -i .bash_history
pero, mientras escribes esto, creas otra línea del historial que contiene el patrón de búsqueda (información sensible) que estás intentando borrar. Así que podrías:
sed -e "/$(head -n1)/d" -i .bash_history
Esto ejecutará head -n1
con la entrada de la terminal. Parecerá que su terminal está colgada (no habrá un prompt); simplemente escriba la información que quiere borrar del archivo. Este es un truco para permitirle introducir (parte de) un comando sin escribirlo realmente en la línea de comandos, haciendo así que no pueda ser incluido en el registro del historial. Entonces sed
utilizará el texto que usted escribió para buscar .bash_history
y borrar todas las líneas que contengan la información sensible. Nota: si su patrón de información sensible contiene barras inclinadas, debe escaparlas con barras invertidas, o bien cambiar el comando sed
para usar esta sintaxis para especificar un delimitador que no aparezca en el patrón:
sed -e "\|$(head -n1)|d" -i .bash_history
Otra forma podría ser borrar sólo la información sensible, pero mantener los comandos que contienen la información. Para esto, podría simplemente reemplazar la info sensible con un texto sustituto de su elección:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Finalmente, para estar seguro de que esto no se quedará en otro archivo olvidado:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
listará todos los archivos afectados.
find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \n \0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i
reemplazará todas las apariciones de información sensible en todos los archivos del árbol de directorios con raíz en .
. Nota: aunque este comando utiliza xargs -0
, no manejará los archivos con nuevas líneas en sus nombres.
Localiza la línea que quieres eliminar pulsando ↑ (flecha arriba) hasta que aparezca, y luego pulsa Ctrl+U. Esto debería eliminar la línea.
Si utilizas el comando history
, puedes ver que la línea ha sido sustituida por un asterisco.
Si necesita eliminar un rango de líneas del historial, la siguiente función de bash podría ahorrarle algo de tiempo:
function histdel() {
[$# -eq 1] && history -d "$1" && history -w
if [$# -eq 2 -a "$1" -le "$2"]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}
La función debería añadirse típicamente a $HOME/.bashrc
. Para utilizar la función de forma inmediata, necesitará que su shell en funcionamiento vuelva a leer el archivo (. $HOME/.bashrc
). Luego, para borrar, por ejemplo, los comandos 200-210 del historial:
$ histdel 200 210
(Nota: Esta pregunta está entre los primeros resultados de búsqueda si se busca cómo borrar un rango de comandos del historial de bash. Así que, aunque lo anterior es más de lo que pide la pregunta, podría ser útil para algunos lectores).
Sólo pruebe esto,
$ history
esto mostrará el id del historial y el comando, por ejemplo,
. . 211 ls 212 javac Welcome.java 213 java welcome . .
use,
$ history -d 211
Aquí 211 es el id del historial. Ahora comprueba esto usando
$ history
. . 211 javac Welcome.java 212 java welcome . .
Sé que hace mucho tiempo que no se hace esta pregunta y se responde, pero os voy a mostrar mi método para limpiar mi archivo de historial y cerrar la sesión al mismo tiempo.
Ejecuto :history -w && nano "${HISTFILE}" && history -c && exit
Lo que hace es sencillo:
history -w
: escribe el historial en caché dentro de "${HISTFILE}"
nano "${HISTFILE}"
: permite editar "${HISTFILE}"
Puedes usar un script sed o lo que quieras para limpiar tu "${HISTFILE}"
history -c
: limpia el historial de la caché para que este último comando no se añada. exit
: cerrar la sesión anexando el historial en caché… pero está vacío ;) Después de este comando, se cerrará la sesión con un archivo de historial limpio. Entra para comprobar tu historial ;)
Espero que esto ayude a alguien.