2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

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?

Respuestas (12)

152
152
152
2012-01-31 16:09:25 +0000

Puede lograr la eliminación del archivo del historial utilizando la línea de comandos en dos pasos:

  1. Al teclear history -d <line_number> se borra una línea específica del historial en la memoria.
  2. Escribir 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.

118
118
118
2012-01-31 16:01:05 +0000

Es necesario cerrar la sesión y volver a entrar o ejecutar history -a para que el historial actual se confirme en el disco.

Luego sólo hay que editar el archivo ~/.bash_history.

41
41
41
2012-02-01 22:19:06 +0000

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
33
33
33
2013-06-18 16:33:19 +0000

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.

17
17
17
2013-07-19 12:50:40 +0000

Varias técnicas:

Evitar que se almacene información sensible en el archivo del historial

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:

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

  2. 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.

Borrar información sensible del archivo del historial

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.

Borrar la información sensible de cualquier archivo en un árbol específico

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.

12
12
12
2015-04-01 16:00:26 +0000

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.

5
5
5
2013-01-07 05:53:04 +0000

Si necesitas eliminar varias líneas al mismo tiempo normalmente uso esto:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Si necesitas eliminar el último comando puedes usar:

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

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).

3
3
3
2014-03-04 11:16:04 +0000

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 . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59 es el número de línea. No puede haber nada más dulce que esto :)

2
2
2
2015-09-30 04:57:29 +0000

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:

  1. history -w : escribe el historial en caché dentro de "${HISTFILE}"
  2. nano "${HISTFILE}" : permite editar "${HISTFILE}" Puedes usar un script sed o lo que quieras para limpiar tu "${HISTFILE}"
  3. history -c : limpia el historial de la caché para que este último comando no se añada.
  4. 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.

1
1
1
2017-03-27 14:10:10 +0000

También puedes editar el archivo del historial directamente, por ejemplo nano .bash_history si estás en el shell bash?