¿Cómo puedo eliminar una determinada línea de history
la base de datos?
linux
bash
history
command-history
w0rldart
fuente
fuente
vim ~/.bash_history
) con un espacio; los comandos que comienzan con un espacio generalmente no se registran (ver$HISTCONTROL
).Puede lograr la eliminación del archivo de historial utilizando la línea de comandos en dos pasos:
history -d <line_number>
elimina una línea específica del historial en la memoria.history -w
escribe el historial actual en memoria en el~/.bash_history
archivo.Los dos pasos juntos eliminan la línea de forma permanente del historial en memoria y también del archivo .bash_history .
fuente
history -w
del historial?<line_number>
solohistory | grep [unwanted_content]
para obtener una lista con todas las líneas que contienen[unwanted_content]
(como contraseñas).Para evitar que se agregue un comando al historial en primer lugar, asegúrese de que la variable de entorno
HISTCONTROL
contenga entre sus valores separados por dos puntos el valorignorespace
, por ejemplo (agregue, por ejemplo, a.bashrc
):Esto evitará que cualquier comando con un espacio inicial se agregue al historial. Luego puede borrar el historial por completo ejecutando
fuente
En primer lugar, si el comando que está a punto de emitir es sensible, inseguro o simplemente no lo necesita abarrotando su historial, lo mejor / más rápido es evitar que ingrese al historial en primer lugar. Asegúrese de que
$HISTCONTROL
contieneignorespace
:Luego proceda cualquier comando que no desee en su historial con un espacio:
Si accidentalmente coloca un comando no deseado en el historial, siempre que su sesión de bash todavía esté abierta, el comando aún no ha tocado el disco. Para eliminar el comando anterior en el historial, emita:
Tenga en cuenta el espacio inicial; este comando requiere
ignorespace
, de lo contrario, se eliminará solo.Si desea eliminar los últimos comandos, busque el último y el primer número del historial:
En este caso 602 y 599. Luego emita:
(Sin
ignorespace
, sería 603..599.)Si no desea que ningún historial de su sesión actual llegue al disco, salga usando:
El enfoque hasta ahora es ni siquiera dejar que se escriban elementos del historial confidenciales en el disco para mayor seguridad, porque en teoría los datos eliminados de medios no volátiles aún se pueden recuperar.
Sin embargo, si los comandos que desea eliminar pertenecen a una sesión anterior, ya se habrán agregado a la
$HISTFILE
salida. La manipulación de la historia con los comandos anteriores será todavía sólo añadir los restantes nuevos artículos a la$HISTFILE
, en la salida . Para sobrescribir el$HISTFILE
con la opinión de la sesión actual de la totalidad de la historia, en este momento , ejecuta:Por supuesto, para los elementos del historial que ya están en el disco, la alternativa a editar el historial con
history -d
comandos y luego emitirloshistory -w
es editarlo$HISTFILE
con un editor de texto.fuente
$HISTFILE
, en la salida .” En realidad, esto no es exactamente cierto. Parece que solo se añaden los elementos nuevos restantes que 'sobresalen' de la longitud del historial original. Por ejemplo, si elimino 5 elementos originales y agrego 15 nuevos, solo se agregarán los últimos 10 nuevos, mientras que esperaría que se agreguen los 15 nuevos. Creo que esto es un error porque no puedo ver cómo esta funcionalidad es deseable.Varias técnicas:
Evitar que la información confidencial se almacene en el archivo de historial
Si ha ingresado alguna contraseña en una línea de comando, entonces tenga en cuenta que todos los comandos están registrados, podría:
Forzar la salida de la sesión actual sin guardar el historial:
Esto eliminará todo el historial actual.
Escriba ↑ (up arrow)la sesión de bash abierta hasta que se muestre la información confidencial, luego use las teclas de edición de línea como Ctrl+ Wpara eliminar la información confidencial, y luego ↓ (down arrow) hasta que aparezca una nueva línea vacía, antes de escribir Enter.
Eliminar información confidencial del archivo de historial
Si se da cuenta de que la información confidencial ya está almacenada y desea eliminarla, pero no todo su historial:
Un
sed
comando simple podría hacer el trabajo: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á intentando eliminar. Entonces podrías:
Esto se ejecutará
head -n1
con la entrada del terminal. Aparecerá que su terminal está colgada (no habrá un aviso); simplemente escriba la información que desea eliminar del archivo. Este es un truco que le permite ingresar (parte de) un comando sin escribirlo realmente en la línea de comando, por lo que no es elegible para su inclusión en el registro del historial. Luegosed
usará el texto que escribió para buscar.bash_history
y eliminar todas las líneas que contienen la información confidencial. Nota: si su patrón de información confidencial contiene barras inclinadas, debe escapar de ellas con barras diagonales invertidas, o bien, cambie elsed
comando para usar esta sintaxis para especificar un delimitador que no aparece en el patrón:Otra forma podría ser eliminar solo la información confidencial, pero mantener los comandos que contienen la información. Para esto, simplemente puede reemplazar la información confidencial con el texto sustituto de su elección:
Eliminar información confidencial de cualquier archivo en un árbol específico
Finalmente, para asegurarse de que esto no se quede en otro archivo olvidado:
enumerará todos los archivos en cuestión.
reemplazará todas las apariciones de información confidencial en todos los archivos en el árbol de directorios arraigado en
.
. Nota: aunque este comando usexargs -0
, no manejará archivos con nuevas líneas en sus nombres.fuente
Busque la línea que desea eliminar presionando ↑ (up arrow)hasta que aparezca, luego presione Ctrl+ U. Eso debería eliminar la línea.
Si usa el
history
comando, puede ver que la línea ha sido sustituida por un asterisco.fuente
*
.Si necesita eliminar varias líneas al mismo tiempo, normalmente uso esto:
Si necesita eliminar el último comando, puede usar:
fuente
history | grep <string>
aún muestra todas las líneas que afirmó eliminar ...history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
Si necesita eliminar un rango de líneas del historial, la siguiente función bash podría ahorrarle algo de tiempo:
La función se debe agregar típicamente a
$HOME/.bashrc
. Para usar la función inmediatamente, necesitará que el shell se vuelva a leer el archivo (. $HOME/.bashrc
). Luego, para eliminar, por ejemplo, los comandos 200-210 del historial:(Nota: esta pregunta se encuentra entre los mejores resultados de búsqueda si busca eliminar un rango de comandos del historial de bash. Por lo tanto, si bien lo anterior es más de lo que la pregunta pregunta, podría ser útil para algunos lectores).
fuente
for
declaración:for n in $(seq "$2" "$1")
algunos prefieren estilísticamente y, siseq
no funciona, intentefor ((n="$2"; n>="$1"; n--))
.59 es el número de línea. No puede ser nada más dulce que esto :)
fuente
Solo prueba estos,
esto mostrará la identificación del historial y el comando, por ej.
utilizar,
Aquí 211 es el id de la historia. Ahora verifique esto usando
fuente
Sé que ha pasado mucho tiempo desde que se hizo y respondió esta pregunta, pero le mostraré mi método para limpiar mi archivo de historial y cerrar sesión al mismo tiempo.
Corro :
history -w && nano "${HISTFILE}" && history -c && exit
Lo que hace es simple:
history -w
: escribe la historia en caché dentro"${HISTFILE}"
nano "${HISTFILE}"
: permítame editar"${HISTFILE}"
Puede usar un script sed o lo que quiera para limpiar su"${HISTFILE}"
history -c
: borra el historial en caché para que este último comando no se agregue.exit
: cerrar sesión agregando historial en caché ... pero está vacío;)Después de ese comando, se cerrará la sesión con un archivo de historial limpio. Inicie sesión para verificar su historial;)
Espero que esto ayude a alguien.
fuente
También puede editar el archivo de historial directamente, por ejemplo,
nano .bash_history
si está en el shell bash?fuente