Ejecutar comando sin mantenerlo en el historial [cerrado]

203

Quiero ejecutar algunos comandos pero no quiero almacenarlos en el historial de comandos. Para que nadie pueda buscarlo en el .bash_historyarchivo.

¿Hay alguna forma de ejecutar comandos bash de esta manera?

Jan Vorcak
fuente
13
Esta pregunta probablemente debería trasladarse a ServerFault, ya que no se trata de "programación" tanto como de "administrador de servidor", pero gracias por la pregunta / respuesta, ¡exactamente lo que necesitaba!
Andrew Theken

Respuestas:

294

Comience su comando con un espacio y no se incluirá en el historial.

Tenga en cuenta que esto requiere $HISTCONTROLque se establezca la variable de entorno .

  • Verifique que el siguiente comando regrese ignorespaceo ignoreboth

    #> echo $HISTCONTROL
  • Para agregar la variable de entorno si falta, se puede agregar la siguiente línea al perfil bash. P.ej%HOME/.bashrc

    export HISTCONTROL=ignorespace

Después de obtener el perfil nuevamente, no se escribirán en los comandos prefijos de espacio $HISTFILE

u-punkt
fuente
20
Esto no funciona a menos que se incluya ignorespace en $ HISTCONTROL, aunque este es probablemente el valor predeterminado en la mayoría de los sistemas.
pgl
2
Correcto. Para más detalles, el OP debe echar un vistazo a HISTCONTROL e HISTIGNORE en la página de manual de bash.
u-punkt
2
thegeekstuff.com/2008/08/… - más consejos sobre el historial de bash están disponibles aquí, incluido este método de ocultar comandos del historial
user379997 12/12/11
52

En cualquier sesión de Bash, configure el archivo de historial en / dev / null escribiendo:

export HISTFILE=/dev/null

Tenga en cuenta que, como se señaló en los comentarios, ¡esto no escribirá ningún comando en esa sesión en el historial!

Simplemente no te metas con el arduo trabajo del administrador de tu sistema, por favor;)

La solución de Doodad es más elegante. Simplemente desarme la variable: unset HISTFILE(¡gracias!)

Miquel
fuente
55
Esto evitará que todos los comandos se registren. No es lo que quiere el interrogador.
Noufal Ibrahim
12
Esto me causó problemas relacionados con los /dev/nullpermisos establecidos en 0600 al cerrar sesión. En cambio yo solía unset HISTFILE.
Doodad
36
echo "discreet";history -d $(history 1)
John Doe
fuente
44
Ooh, control por comando? Agradable.
Kyle Strand
21

Una extensión de la respuesta de @John Doe y @ user3270492. Pero, esto parece funcionar para mí.

<your_secret_command>; history -d $((HISTCMD-1))

No debería ver la entrada del comando en su historial.

Aquí está la explicación ...

El 'historial -d' elimina la entrada mencionada del historial.

El HISTCMD almacena el número de comando del que se ejecutará a continuación. Entonces, (HISTCMD-1) se refiere al último comando ejecutado.

Eliminar una determinada línea del archivo de historial de Bash

Rangaraj KS
fuente
Lamentablemente esto no funcionó para mí.
Magick
10

Puede considerar usar un shell sin historial, como quizás

/bin/sh << END
   your commands without history
END

(tal vez /bin/dasho /bin/sashpodría ser más apropiado que /bin/sh)

o incluso mejor usar la utilidad por lotes , por ejemplo

batch << EOB
   your commands
EOB

La historia contendría sho batchno es muy significativa

Basile Starynkevitch
fuente
8

Puedes comenzar tu sesión con

export HISTFILE=/dev/null ;history -d $(history 1)

luego proceda con sus acciones furtivas. La configuración del archivo histórico /dev/nullse registrará en el archivo de historial, sin embargo, esta entrada se eliminará fácilmente y no se mostrarán rastros (al menos en el archivo de historial).

Además, esto no es permanente.

cristiano
fuente
Esto ya fue contestado muchas veces. ¿Qué diría que su respuesta agrega a este hilo (a excepción del ruido inútil)?
gniourf_gniourf
No se compiló en una sola respuesta , para que el comando en sí no aparezca en el historial y no se muestre nada que se ingrese después.
Christian el
1
¡Pero ahora este hilo es un verdadero desastre! en este caso, especialmente para una pregunta tan antigua, creo que es mejor que edite buenas respuestas ya existentes y / o deje un comentario ...
gniourf_gniourf
5

Como lo menciona Doodad en los comentarios , lo unset HISTFILEhace muy bien, pero en caso de que también desee eliminar algo de historial, haga echo $HISTFILEpara obtener la ubicación del archivo de historial (generalmente ~/.bash_history) unset HISTFILEy edite ~/.bash_history(o lo que sea que sea HISTFILE, por supuesto, ahora es unsetasí para que pueda ' No lo leas).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

¡Entonces has editado tu historial y el hecho de haberlo editado!

drkvogel
fuente
Intenté esto en: GNU bash, versión 3.2.57 (1) -release (x86_64-apple-darwin15) y no funciona. Los comandos que utilicé después de HISTORY sin configurar se almacenaron en ~ / .bash_history
Krystian
@Krystian Mi error: había escrito "HISTORIAL sin configurar" cuando debería ser "HISTFILE sin configurar" - corregido. ¿Funciona ahora? Funciona en GNU bash, versión 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel
bueno no estoy seguro. Prueba simple: unset HISTFILE; echo TEST; historyle dará el comando echo TESTcomo el anterior al último. Aunque después de finalizar la sesión y volver a conectarse, el historial no tiene esta entrada. Entonces diría que funciona :)
Krystian
unset HISTFILEno parece detener los comandos que se graban en el historial en la memoria, pero sí impide que se graben en el archivo $ HISTFILE. Así que supongo que todavía tiene su historial local en la memoria, pero ya no se está grabando en un archivo, ¡que es lo que puede desear! ;)
drkvogel
4

También puede usar el siguiente comando:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Creo que es un comando muy portátil.

Cédric ROYER
fuente
He creado un alias a partir de esto: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"y ahora puede hacerlo de la siguiente manera:mysql -uroot -pSecretPassword ; forget
sobi3ch
1
Lo sentimos, pero me doy cuenta de que debe crear una función en lugar de un alias debido a que las comillas cambian el significado de $sy otras cosas en sed. function forget() { // put code here // }
sobi3ch
3

Si está utilizando zsh puede ejecutar:

setopt histignorespace

Después de configurar esto, cada comando que comience con un espacio se excluirá del historial.

Puede utilizar los alias de .zshrcconvertir este encendido / apagado :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'
Rotareti
fuente
Bien, pero esta pregunta está etiquetada específicamente como bash
tripleee
2

Hay varias formas de lograr esto. Esto establece el tamaño del archivo de historial en 0:

export HISTFILESIZE=0

Esto establece el archivo de historial en /dev/null, deshabilitándolo efectivamente:

export HISTFILE=/dev/null

Para comandos individuales, puede anteponer el comando con un espacio y no se guardará en el archivo de historial. Tenga en cuenta que esto requiere que tenga el ignorespacevalor incluido en la $HISTCONTROLvariable de entorno (man bash y busque ignorespacemás detalles).

pgl
fuente
2
Esto evitará que todos los comandos se registren. No es lo que quiere el interrogador.
Noufal Ibrahim
Bueno, supuse que el interlocutor restablecería los valores después de hacer lo que quisiera que no debería registrarse.
pgl
1

¡Esto es útil si desea borrar todo el historial, incluido el hecho de que borró todo el historial!

rm .bash_history;export HISTFILE=/dev/null;exit
cnd
fuente
0

Solo necesitas ejecutar:
$ set +o history

Para ver más, ejecuta:
$ man set

Igor Santos
fuente
2
Esto deshabilita el historial para todos los comandos futuros, no para un comando individual. La mayoría de las personas que vienen aquí deberían mirar la respuesta aceptada.
tripleee
Esto es válido o está bien pero está incompleto. Siempre que agreguemos el comando de reversa set -x historydespués, funciona.
Abdillah
0

Este comando puede ser útil. Esto no registrará el comando que se ejecuta

history -d $((HISTCMD-1)) && <Your Command Here>
RAVI THEJA
fuente