Respuestas:
Debe cerrar sesión y volver a iniciarla o ejecutarla history -a
para que el historial actual se confirme en el disco.
Luego solo edite el archivo ~/.bash_history
.
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 .
history -w
del historial?
<line_number>
solo history | 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 valor ignorespace
, por ejemplo (agregue, por ejemplo, a .bashrc
):
$ export HISTCONTROL=ignorespace
Esto evitará que cualquier comando con un espacio inicial se agregue al historial. Luego 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 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
contiene ignorespace
:
(bash)$ echo $HISTCONTROL
ignoredups:ignorespace
Luego proceda cualquier comando que no desee 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 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:
(bash)$ history -d $((HISTCMD-1))
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:
(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 desea que ningún historial de su sesión actual llegue al disco, salga usando:
(bash)$ kill -9 $$
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:
(bash)$ history -w
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 emitirlos history -w
es editarlo $HISTFILE
con un editor de texto.
$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:
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:
kill -9 $$
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.
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:
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á intentando eliminar. Entonces podrías:
sed -e "/$(head -n1)/d" -i .bash_history
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. Luego sed
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 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 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:
sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.
Finalmente, para asegurarse de que esto no se quede en otro archivo olvidado:
SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"
enumerará todos los archivos en cuestión.
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 arraigado en .
. Nota: aunque este comando use xargs -0
, no manejará archivos con nuevas líneas en sus nombres.
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.
*
.
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))
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:
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 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:
$ histdel 200 210
(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).
for
declaración: for n in $(seq "$2" "$1")
algunos prefieren estilísticamente y, si seq
no funciona, intente for ((n="$2"; n>="$1"; n--))
.
Solo prueba estos,
$ history
esto mostrará la identificación del historial y el comando, por ej.
.
.
211 ls
212 javac Welcome.java
213 java welcome
.
.
utilizar,
$ history -d 211
Aquí 211 es el id de la historia. Ahora verifique esto usando
$ history
.
.
211 javac Welcome.java
212 java welcome
.
.
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.