Terminal 'modo incógnito'?

230

Uso mucho la Terminal y, a veces, ejecuto comandos, que no son cosas que no quiero que otros vean, pero hay más comandos que si accidentalmente avancé y ejecuté accidentalmente causarían muchos problemas.

Entonces, me pregunto si hay, o puedo hacer, algún tipo de 'modo incógnito' de Terminal que me permita, tras la ejecución de un cierto comando, detener la grabación de mi historial y luego solo comenzar a grabar después de ejecutar iniciar el historial de grabación nuevamente comando y salir del 'modo incógnito', o simplemente reinicio la Terminal

Porque me encuentro más tarde yendo y quitando cosas de mi .bash_history, cuando sería mucho más fácil si hubiera podido dejar de grabar allí en primer lugar, o al menos haberlo intentado grabar en algún lugar donde simplemente no sería permitido, y terminaría sin grabarlo.


fuente
66
Bueno, presumiblemente eres paranoico de que tu historia sea leída por otros.
Gavilán
66
@Sparhawk: Bueno, es en parte eso, ¡y fiesta que no quiero ejecutar accidentalmente un comando de mantenimiento posiblemente mortal cuando solo estoy apuntando hacia arriba en el futuro! : D
19
Solo para agregar, no tienes que justificarte: "que no son cosas que no quiero que otros vean" . Esa sería una razón perfectamente válida para mí también. (Especialmente en esta época donde todos tratan de hacerte parecer culpable por tener "cosas que esconder")
antes
2
Si abre dos pestañas, haga cosas en la primera, haga cosas en la segunda, luego cierre la segunda ANTES de la primera, solo parece estar escrita la historia de la primera .bash_history. (Ubuntu 15.04 arruinó la Terminal, por suerte, este es un USB en vivo.)
Hitechcomputergeek
1
Ver esta pregunta en serverfault
Luc M

Respuestas:

265

Ejecute un comando sin ponerlo en el historial:

Simplemente ponga un espacio antes del comando. Bash ignorará los comandos con un espacio antepuesto:

Ejemplo: Spaceecho "Some secret text"

Nota: Esto solo funciona si la HISTCONTROLvariable se establece en ignorespaceo ignoreboth.


Deshabilitar el historial temporalmente:

  • Ejecutar Spaceset +o historyo Spaceshopt -uo historypara deshabilitar el historial.
  • Ejecutar set -o historyo shopt -so historypara habilitarlo nuevamente.

Deshabilite el historial de la sesión actual (no recordará ningún comando de la sesión):

unset HISTFILE

Nota: Podrá ver los comandos presionando Uphasta que cierre el terminal.


Eliminar un comando del historial:

correr Spacehistory | grep "part of your secret command"

Mostrará una lista de comandos ejecutados previamente, en este formato:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

Seleccione el número de entrada a la izquierda del comando. Puedes copiarlo con Ctrl+ Shift+C

Ejecute Spacehistory -d <number>donde <number>está el número de entrada para eliminar la entrada.
Puedes pegar ese número con Ctrl+ Shift+V


Otras respuestas interesantes:

Helio
fuente
77
Si usa history -dpara eliminar una línea, esto eliminará el contenido de la línea, pero nunca podrá eliminar el hecho de que ejecutó history -d(a menos que lo use por primera vez set +o historyantes de ejecutar history -d)
AJFaraday
1
Simplemente me recordó la lógica de la súper orden judicial, eso es todo;)
AJFaraday
44
(OT) Las órdenes judiciales son un documento legal que impide que las personas publiquen algo. Una súper orden judicial también les impide publicar el hecho de que se les negó la posibilidad de publicar. Algunos argumentos lógicos preguntan si pueden publicar que se les negó la posibilidad de publicar cierta información. Entonces se convierte en un argumento cíclico.
AJFaraday
1
@Helio Creo que es mejor que los usuarios conozcan la forma "correcta" de copiar, especialmente si accidentalmente van y seleccionan texto. No estoy seguro de cómo hacer el espacio, ¿tal vez aclarar más que el espacio está allí? El [espacio] me parece un poco torpe ...
Tim
2
El unset HISTFILEenfoque también funciona retroactivamente para todos los comandos en los que aún no se ha escrito .bash_history.
Kasperd
40

Simplemente puede eliminar el historial de una sesión de terminal en particular agregando un comando history -cwdespués de trabajar.

No cierre la terminal antes de dar este comando.

Moithil Biswas
fuente
¿Esto no eliminará todo el historial?
Helio
66
Esto solo eliminará el historial de esa sesión de terminal en particular.
Moithil Biswas
28

shopt -uo history debería hacerlo mejor.

Nuking las HISTFILEvariables (et al) no detendrá el Upregistro de su historial, simplemente no lo empujará al disco. Esto puede o no ser algo positivo para usted, pero dado que lo menciona, creo que quiere algo mejor. Cambiar la shoptconfiguración del historial evita que se active todo el mecanismo del historial.

Puede volver a activar el inicio de sesión con shopt -so history( -sy -use configuran y desactivan respectivamente).

Tenga en cuenta que el comando en sí probablemente se registrará, así que agréguele un espacio para evitar que se agregue al historial antes de borrar la variable.

Oli
fuente
17

Otra forma de matar el shell actual sin iniciar sesión en el archivo de historial es hacer:

kill -9 $$

Esto hace que bash (y probablemente otros shells también) envíen la señal SIGKILL a sí mismo, matándolo en el acto y evitando que escriba algo en el disco.

imbécil
fuente
77
alias 'Disparate en la cabeza' :). Esto tiene la ventaja de que no necesita recordar hacer nada antes de escribir los comandos.
Guido
3
Uso zsh con escritura de historial incremental, así que dudo que esto funcione en mi caso
Wayne Werner
13

Para deshabilitar temporalmente el historial de comandos para la sesión actual, puede deshabilitar temporalmente la variable de entorno HISTFILE.

unset HISTFILE

Mientras la sesión está activa, puede acceder al historial como de costumbre, pero no se guardará en el disco.

Para revertir en la misma sesión (se registrarán todos los cambios)

HISTFILE=$HOME/.bash_history
Bruni
fuente
1
¿Y hay una manera fácil en la sesión actual para revertir esto y hacer que continúe?
@ParanoidPanda Agregué un comando para revertir en la sesión actual.
Bruni
1
@ParanoidPanda: ¿Por qué necesita un comando para configurar HISTFILEnuevamente en la sesión actual? Si deshace el cambio (incluso después de ejecutar los comandos secretos), se guardarán en el historial cuando salga.
Helio
@Helio: Oh, no, quise decir un comando que luego comenzaría a grabar nuevamente, pero no guardaría los comandos que no quería que guardara.
1
@ParanoidPanda, Helio parece tener razón en este caso ya que el historial se guarda al salir. No lo había considerado.
Bruni
10

Puede modificar las líneas del historial en la sesión de shell actual. Si recorre el historial (por ejemplo, con Upo Ctrl+ P) y cambia una línea sin ejecutarla , solo se guardará la versión modificada de la línea. Puede modificarlo de la forma que desee; buenas opciones incluirían usar Ctrl+ Upara dejar en blanco la línea o usar Esc#para poner un #carácter de comentario al principio.

Para dejar una línea sin ejecutarla, recuerde no presionar Return( Enter). Lo que hago es volver a la línea más nueva de la historia a través de Esc>.

(En lugar de Escseguir >, en la mayoría de los terminales puede mantener Altpresionada >; lo mismo ocurre con la Esc#sugerencia anterior).

Nota: No puede modificar permanentemente las entradas de sesiones anteriores de esta manera. Esos cambios no se aplicarán al HISTFILEfinal de la sesión.

Echristopherson
fuente
6

También puede hacer que .bash_history sea de solo lectura. Primero vaciaría el archivo y luego haría:

 chattr +i .bash_history
Webtm
fuente
5

Puede ejecutar los comandos confidenciales en una sesión de pantalla y luego destruir la sesión cuando haya terminado.

Alternativamente, puede mantener esa sesión de pantalla viva pero separada, y solo acceder a ella cuando realmente desee poder subir la flecha a los comandos que de otro modo serían peligrosos.

Keag
fuente
1

Personalmente lo uso mksh, y este shell por defecto no tiene archivo de historial. Eso significa que puede iniciar un shell alternativo como mksho dash(que viene por defecto) para ejecutar el comando que no desea que vean los usuarios y salir una vez hecho. bashla historia solo registrará que lanzó un shell alternativo y eso es todo.

Sergiy Kolodyazhnyy
fuente
1

También puede utilizar multiplexor terminal, como tmux, screen. Entonces debajo tmuxo la screenhistoria no se guardaría.

vusan
fuente