Ocultar "history -d" en bash history

14

Si accidentalmente escribo mi contraseña o cualquier otra cosa sensible en bash, puedo eliminar fácilmente esa línea history -d ROW#, pero siempre me queda el history -d ROW#comando en el historial que muestra a todos que alguien corrigió un error.

¿Puedo agregar algo a un comando para evitar que aparezca en el historial de bash?

Kalle Ling
fuente

Respuestas:

27

Para no guardar un solo comando en su historial, simplemente preceda con un espacio (marcado aquí):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

Este comportamiento se establece en su ~/.bashrcarchivo, es decir, en esta línea:

HISTCONTROL=ignoreboth

man bash dice:

HISTCONTROL
Una lista de valores separados por dos puntos que controlan cómo se guardan los comandos en la lista del historial. Si la lista de valores incluye ignorespace , las líneas que comienzan con un carácter de espacio no se guardan en la lista del historial . Un valor de ignoredups hace que las líneas que coinciden con la entrada del historial anterior no se guarden. Un valor de ignoreboth es la abreviatura de ignorespace e ignoredups .

ignoredupsPor cierto, es la razón por la que history | tail -n2aparece solo una vez en la historia en la prueba anterior.


El historial de un terminal se guarda en la RAM y se vacía en el momento ~/.bash_historyen que cierra el terminal. Si desea eliminar una entrada específica de su ~/.bash_history, puede hacerlo con sed:

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

En el último cambié el delimitador predeterminado /a _como se usa dentro del término de búsqueda, de hecho, esto es igual a sed -i '/\/path\//d' .bash_history. Si las salidas de comando sólo las líneas que desea eliminar añadir la -iopción y el cambio !da drealizar la eliminación:

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
postre
fuente
12

Una forma sería establecer la HISTIGNOREvariable de entorno. Desdeman bash

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW, es el valor predeterminado HISTCONTROLque proporciona la solución alternativa de escribir un espacio al frente].

Así por ejemplo

HISTIGNORE='history -d*'

Si quieres que sea persistente, expórtalo desde tu ~/.bashrc

export HISTIGNORE='history -d*'
conductor de acero
fuente
6

Usted puede

  • Cierre la (s) ventana (s) de terminal . Esto vaciará el historial más reciente en la ventana de terminal que cierre más tarde (después de que se cierren las otras ventanas) en el archivo/home/$USER/.bash_history

  • Edite el archivo/home/$USER/.bash_history sin involucrar bash, por ejemplo, iniciando su editor favorito a través de Alt+F2

    De esta manera, puede inspeccionar todo el historial y eliminar cualquier comando que ya no desee estar allí.

    ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

sudodus
fuente
1

Usualmente uso:

history -w; history -c; $EDITOR $HISTFILE; history -r

El archivo de historial se escribe en el disco, se borra en la memoria, lo edita para hacer lo que desea y luego se vuelve a leer el archivo de historial que editó.

Tenga en cuenta que si su editor guarda archivos de copia de seguridad, la palabra traviesa aún podría aparecer en el disco.

Otra opción -des usar números de historial predictivo:

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

En este ejemplo, elimino lo malo, elimino el comando para obtener el número del historial y luego elimino el comando que usé para eliminar el historial. Todo se desinfecta entonces.

Seth Robertson
fuente
0

Si desea ejecutar un comando sin guardarlo en el historial, agréguelo con un espacio adicional

prompt$ echo saved
prompt$  echo not saved \
> #     ^ extra space

Para que esto funcione, necesita ignorespace o ignore tanto en HISTCONTROL. Por ejemplo, ejecutar

HISTCONTROL = ignorespace Para que esta configuración sea persistente, colóquela en su .bashrc.

bkdroid13
fuente