Pregunta Eliminar una cierta línea del archivo del historial de Bash


¿Cómo puedo eliminar una determinada línea de history¿Base de datos?


128


origen




Respuestas:


Debe cerrar sesión y volver a iniciar o ejecutar history -a por lo que el historial actual está comprometido con el disco.

Entonces solo edita el archivo ~/.bash_history.


95



Si se establece la variable de entorno HISTFILE, el archivo de historial no es ~ / .bash_history sino más bien $ {HISTFILE}. - Karolos
Las entradas se escriben en el archivo de historial cuando sale del shell. Por lo tanto, después de ingresar un comando que le gustaría eliminar, debe cerrar la sesión y volver a ingresar, o usar 'history -d xxxx' para eliminarlos de la sesión de shell actual. - harmic
pero ¿cómo eliminarías el registro de edición del archivo de historial? - chiliNUT
@chiliNUT: solo comienza tu comando (p. vim ~/.bash_history) con un espacio; Los comandos que comienzan con un espacio generalmente no se registran (ver $HISTCONTROL) - cYrus
No creo que sea el caso en mi distribución, pero en general eso tiene sentido - chiliNUT


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

  1. Mecanografía history -d <line_number> borra una línea especificada del historial en la memoria.
  2. Mecanografía history -w escribe el historial en memoria actual al ~/.bash_history archivo.

Los dos pasos juntos eliminan la línea permanentemente de la memoria historia y de la .bash_history archivo también.


140



cómo eliminar el último history -w de la historia? - KrIsHnA
@KrIsHnA edit ~ / .bash_history manualmente - Alexander Myshov
O agregue un espacio antes para evitar que se agregue, como en la respuesta de @tao - Mark
Encontrar <line_number> sólo history | grep [unwanted_content] para obtener una lista con todas las líneas que contienen [unwanted_content] (como contraseñas). - AvL
¿Cómo se eliminan varias líneas (específicas) (por id)? - Pathros


A evitar En primer lugar, se debe agregar un comando al historial, asegúrese de que la variable de entorno HISTCONTROL contiene entre sus valores separados por el colon el valor ignorespace, por ejemplo (agregar, por ejemplo, .bashrc)

$ export HISTCONTROL=ignorespace

Esto evitará que cualquier comando con un espacio inicial se agregue al historial. A continuación, puede borrar el historial completamente ejecutando

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

37





En primer lugar, si el comando que está a punto de emitir es confidencial, inseguro, o simplemente no lo necesita agotando su historial, es mejor / más rápido evitar que ingrese el historial en primer lugar. Asegúrate de eso $HISTCONTROL contiene ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Luego, proceda con cualquier comando que no desee en su historial:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Si coloca accidentalmente un comando no deseado en el historial, siempre que su sesión bash aún esté abierta, el comando todavía no ha tocado el disco. Para eliminar el comando anterior en el historial, emita:

(bash)$  history -d $((HISTCMD-1))

Tenga en cuenta el espacio principal; este comando requiere ignorespace¡De lo contrario, se borrará solo!

Si desea eliminar los últimos comandos, busque el último y el primer número de historial:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

En este caso 602 y 599. Luego emita:

(bash)$  for i in {602..599}; do history -d $i; done

(Sin ignorespace, sería 603..599.)

Si no quieres alguna historial de su sesión actual para golpear el disco, salga usando:

(bash)$ kill -9 $$

Hasta ahora, el enfoque es no permitir que los elementos de historial confidenciales se escriban en el disco para mayor seguridad, porque en teoría los datos eliminados de los medios no volátiles aún se pueden recuperar.

Sin embargo, si el (los) comando (s) que desea eliminar provienen de una sesión anterior, ya se habrán adjuntado al $HISTFILE a la salida Manipular el historial con los comandos anteriores solo seguirá siendo adjuntar el restante nuevo artículos a la $HISTFILE, a la salida. A exagerar el $HISTFILE con la vista de la sesión actual de todo historia, ahora mismo, problema:

(bash)$  history -w

Por supuesto, para los artículos de historia que ya están en el disco, la alternativa a la edición de la historia con history -d comandos entonces emitiendo history -w, es editar el $HISTFILE con un editor de texto.


30



"Manipular la historia con los comandos anteriores seguirá siendo solo adjuntar el restante nuevo artículos a la $HISTFILE, a la salida. "En realidad, esto no es exactamente cierto. Parece solo anexar los elementos nuevos restantes que sobresalen de la longitud original del historial. P.ej. Si elimino 5 elementos originales y agrego 15 nuevos, solo se anexan los últimos 10 nuevos, mientras que esperaría que se adjuntasen los 15 nuevos. Creo que esto es un error porque no puedo ver cómo esta funcionalidad es siempre deseable. - James Haigh
Supongo que bash toma nota de la longitud original. Al cerrar la sesión, presumiblemente agrega elementos cuyo número es mayor que este valor. Si este valor se redujera cada vez que se elimina un elemento cuyo número es menor o igual que este valor, funcionaría como se esperaba. ;-) - James Haigh


Varias técnicas:

Evite que se almacene información confidencial en el archivo de historial

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

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

     kill -9 $$
    

    Esto eliminará todo el historial actual.

  2. Tipo ↑ (flecha arriba) en la sesión abierta bash hasta que se muestre la información confidencial, luego use las pulsaciones de teclas de edición de línea como Ctrl+W para eliminar la información sensible, y entonces  ↓ (flecha abajo) hasta que se solicite una nueva línea vacía, antes de mecanografía Entrar.

Eliminar información confidencial del archivo de historial

Si se da cuenta de que la información sensible ya está almacenada y desea eliminarla, pero no su historial completo:

Un simple sed comando podría hacer el trabajo:

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

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

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

Esto correrá head -n1 con la entrada de la terminal. Aparecerá que su terminal está colgada (no habrá un aviso); solo escriba la información que desea eliminar del archivo. Este es un truco para permitirte ingresar (parte de) un comando sin realmente escribirlo en la línea de comando, lo que lo hace inelegible para incluirlo en el registro de historial. Entonces sed usará el texto que escribió para buscar .bash_history y borra todas las líneas que contienen la información confidencial. Nota: si su patrón de información sensible contiene barra (s), debes escapar de ellos con barras diagonales inversas, o bien cambie 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 solo la información confidencial, pero conservar los comandos que contienen la información. Para esto, 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.

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

Finalmente, para estar seguro de que esto no permanecerá 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 confidencial en todos los archivos en el árbol de directorios enraizado en .. Nota: aunque este comando usa xargs -0, no manejará archivos con nuevas líneas en sus nombres.


14





Ubique la línea que desea eliminar presionando ↑ (flecha arriba) hasta que aparezca, luego presione Ctrl+U. Eso debería eliminar la línea.

Si usas el history comando, puede ver que la línea ha sido sustituida con un asterisco.


10



En realidad, creo que debes mover el cursor hasta la línea, presionar Ctrl + U, y luego cursor hacia arriba o hacia abajo a otra línea (posiblemente el en blanco al final de la lista). Además, estrictamente hablando, la línea no ha sido sustituida con un asterisco. Por el contrario, el comando ha sido borrado, y el número de historia ha sido agregado con un *. - G-Man
Esto se vuelve mucho más poderoso con Ctrl + R (búsqueda de historial incremental inversa), luego p. [Fin], Ctrl + U - sehe


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

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

Si necesita eliminar el último comando, puede usar:

history -d $((HISTCMD-2))

4



Esto parecía que funcionó pero history | grep <string> todavía muestra todas las líneas que afirmó eliminar ... - Brock Hensley
Esto eliminará las líneas de historial incorrectas después de eliminar el fisrt !! - mivk
Pero, afortunadamente, solo imprime los comandos de eliminación incorrectos. Lo siguiente imprimiría los comandos de eliminación correctos: history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}' - mivk


Si necesita eliminar un rango de líneas del historial, la siguiente función 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 ser típicamente agregada a $HOME/.bashrc. Para utilizar la función de inmediato, necesitará que el archivo vuelva a leer el shell en ejecución (. $HOME/.bashrc) Luego, para eliminar, p. comandos 200-210 de la historia:

$ histdel 200 210

(Nota: esta pregunta se encuentra entre los principales resultados de búsqueda si se busca eliminar un rango de comandos del historial de bash. Por lo tanto, si bien lo anterior es más de lo que pregunta la pregunta, podría ser útil para algunos lectores).


3



Formas alternativas para el for declaración: for n in $(seq "$2" "$1") es estilísticamente preferido por algunos, y, si seq no funciona, prueba for ((n="$2"; n>="$1"; n--)). - Scott