¿Hay alguna forma de evitar que se agregue un comando a su historial?

65

¿Hay alguna forma de evitar que se agregue un comando a su historial? Tengo un comando que quiero mantener fuera de mi archivo de historial, y realmente no me importa tenerlo allí cuando busco el historial almacenado en la memoria, aunque eso es menos preocupante. ¿Hay alguna manera de evitar esto, o solo tengo que volver y editar mi archivo de historial?

Actualización: no me di cuenta de que esto podría ser específico del shell. Mi caparazón es zsh. Le invitamos a responder por otros proyectiles para que la gente sepa cómo hacerlo en su caparazón.

xenoterracida
fuente
entrecruzamiento de respuesta zsh: superuser.com/questions/352788/...
Michael Shigorin

Respuestas:

52

En ZSH :

Primero inserte setopt HIST_IGNORE_SPACEen su ~/.zshrc. Ahora, después de iniciar sesión de nuevo, puede anteponer cualquier comando que no desee almacenar en el historial con un space.

Desde el manual del usuario , las siguientes 3 opciones se pueden usar para decir que ciertas líneas no deberían entrar en el historial:

  • HIST_IGNORE_SPACE no almacena comandos con el prefijo de un espacio
  • HIST_NO_STORE comando no almacenar historial ( fc -l )
  • HIST_NO_FUNCTIONS no almacena definiciones de funciones
dogbane
fuente
¿Alguna posibilidad de respuesta @mmckinst funciona en zsh? o algo asi? o tal vez cualquier comando que incluya el comando| somecommand
xenoterracide
AFAIK no hay equivalente de HISTIGNORE de bash en zsh.
dogbane
@xeno zsh proporciona una función de enlace preexecque se puede usar para eso. Si devuelve un valor distinto de cero, el comando no se guarda en el historial.
Keith el
1
para que zsh ignore un montón de comandos comunes básicos, los alias a todos para tener un espacio al frente ... para c (ls fg bg jobs sale clear reset); do alias $ c = "$ c"; hecho
Will Norris el
44
Para futuros lectores perezosos como yo que todavía no saben cómo hacerlo: setopt HIST_IGNORE_SPACEen~/.zshrc
Al.G.
25

Si está ejecutando el comando una y otra vez, es posible que desee utilizar la función de ignorar el historial de su shell. Digamos que tiene secret.server.com al que desea enviar ssh, archivos FTP, etc., que no desea que se guarde ninguna línea que mencione secret.server.com:

En bashti pondrías

HISTIGNORE="*secret.server.com*"

mientras que en zshel parámetro se llama

HISTORY_IGNORE="*secret.server.com*"

Puede enumerar múltiples patrones con dos puntos separándolos. Tenga en cuenta que cada patrón coincide con la línea de entrada completa , por lo que es posible que deba incluir un *. Por ejemplo, lo siguiente excluirá fortunedel historial, pero almacenará fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Con HISTIGNORE configurado, nada que coincida con los patrones que enumere se guardará en .bash_history/ .zsh_historye incluso la tecla de flecha hacia arriba, que normalmente recuerda su comando anterior, no funcionará si coincide con su patrón.

Mark McKinstry
fuente
3
alguna posibilidad de que esto funcione en zsh?
xenoterracide
¿Existe una opción para ignorar solo las líneas que comienzan con fortuna? Algo como HISTIGNORE="^fortune*"ignorar fortune -lpero mantener myfortune?
Bernhard
@xenoterracide Sí, pero el parámetro tiene un nombre diferente. Acabo de editarlo en la respuesta.
n
23

En bash, usa la HISTCONTROLvariable.

Ajústelo a HISTCONTROL=ignorespace(o HISTCONTROL=ignoreboth). A partir de ahora, cuando comience una línea con un espacio , no se guardará en el historial. Esto evita incluir el comando no-a-ser-revelado en algún archivo de configuración.

Incluso así, se olvida de agregar el espacio y luego quiere volver. Para eliminar una entrada en el historial, use history -d <index>, con indexel número encontrado con el historycomando (primera columna).

concha
fuente
1
¿Funciona esto zsh?
Gert
11

La forma más fácil para una única vez es

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

donde $representa el aviso del shell inicial y $$representa el aviso del subshell. Esto funciona en bash y zsh; en ksh necesitas en su HISTFILE=/notwritablelugar. Tenga en cuenta que lo que importa es el valor de HISTFILEcuándo se escribe el archivo de historial, no cuando se ejecuta el comando. Bash, ksh y zsh escriben en el archivo de historial cuando salen (zsh puede hacerlo más a menudo dependiendo de la configuración).

Alternativamente, puede hacer que bash o zsh ignoren las líneas que coinciden con ciertos patrones (esto ya está cubierto por otras respuestas).

Otra posibilidad en zsh es

% fc -p
% secret-command
% fc -P

fc -pempuja la lista del historial actual a una pila e inicia una nueva que no está asociada con un archivo guardado. fc -Psaca esa lista de historial sin guardar de la pila y se olvida por completo.

Mientras se ejecuta un proceso, el comando y sus argumentos (y en algunos sistemas también su entorno) se mostrarán en la tabla de procesos ( pssalida). Root puede ver comandos pasados ​​en la base de datos de contabilidad del sistema y puede realizar más registros sin su control. Y probablemente habrá todo tipo de evidencia forense que puede mostrar aproximadamente qué comando ejecutó (como los tiempos de modificación de archivos). Por lo tanto, no obtienes privacidad contra espías determinados.

Gilles 'SO- deja de ser malvado'
fuente