web-dev-qa-db-fra.com

Suspendre temporairement bash_history sur un shell donné?

Existe-t-il un moyen de suspendre temporairement le suivi de l'historique en bash, afin d'entrer dans une sorte de mode "incognito"? J'entre dans mon terminal des informations que je ne veux pas enregistrer d'informations financières sensibles.

128
Naftuli Kay

Cela devrait être ce que vous recherchez:

unset HISTFILE

De man bash

Si HISTFILE n'est pas défini ou si le fichier d'historique n'est pas accessible en écriture, l'historique n'est pas enregistré.

Alternativement, si vous souhaitez le désactiver puis le réactiver, il peut être plus facile à utiliser set :

Éteindre

set +o history

Allumer

set -o history
173
SiegeX

En utilisant bash, définissez HISTCONTROL="ignorespace" et précédez d'un espace toute commande que vous ne souhaitez pas enregistrer dans l'historique. Si vous avez oublié de prendre des mesures, il existe également history -d <number> pour supprimer une entrée spécifique ou history -c pour effacer tout l'historique des commandes.

33
forcefsck

Assurez-vous que HISTCONTROL contient ignorespace. Vous voudrez probablement ajouter HISTCONTROL=ignorespace (ou HISTCONTROL=ignoredups:ignorespace ou quelque chose) à votre ~/.bashrc. Ensuite, toute ligne de commande commençant par un espace est omise de l'historique.

Une autre possibilité est de démarrer une nouvelle session bash qui ne sauvegarde pas son historique.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent Shell

Si vous devez éviter de stocker plusieurs commandes et que vous souhaitez toujours utiliser la flèche vers le haut pour accéder aux commandes précédentes, utilisez:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

Il existe quatre façons (niveaux) de contrôler la façon dont les commandes sont stockées.

  1. La première et la plus simple consiste à utiliser ignorespace (ou ignorer les deux):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"
    

    Cela permettra d'utiliser un espace avant les commandes que vous souhaitez éviter d'être enregistré dans la liste mémoire de history. Et, en conséquence, comme aucune commande enregistrée en mémoire ne peut être envoyée au fichier, elle évitera également one la commande à envoyer au fichier répertorié dans $HISFILE.

  2. Évitez d'enregistrer des commandes dans le fichier dans $HISTFILE:

    $ unset HISTFILE
    

    S'il n'est pas défini, l'historique des commandes n'est pas enregistré à la fermeture d'un shell.

    Nul HISTFILE='' et/ou réglé sur HISTFILE=/dev/null fonctionne dans le même sens. Comprenez que les commandes sont toujours enregistrées dans la liste de mémoire, essayez la commande history ou la flèche vers le haut.

    Avertissement: si HISTFILE est réinitialisé avant que le Shell n'existe, tout ce qui a été enregistré en mémoire peut quand même être écrit dans le fichier.

  3. Évitez d'enregistrer les commandes new dans la liste d'historique en mémoire. Et, comme n'étant pas en mémoire, ne peut pas être enregistré dans un fichier.

    $ shopt -ou history              # or set +o history
    

    Réactivez avec shopt -os history (ou set -o history)

  4. Supprimez toutes les commandes de la liste d'historique en mémoire:

    $ HISTSIZE=0
    

    Toutes les commandes sont effacées (de la mémoire) et, par conséquent, rien ne peut être stocké dans un fichier, bien sûr, jusqu'à ce que la variable soit à nouveau définie sur une valeur numérique valide.

6
Isaac

Il existe un moyen simple de désactiver l'historique, de sorte que les commandes ne seront pas stockées dans le .bash_history fichier.

Vous devez placer l'espace blanc ou l'espace de tabulation devant toute commande, afin que cette commande ne soit pas stockée dans l'historique. Par exemple:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

La commande pwd ne sera pas enregistrée dans l'historique, car elle contient des espaces à l'avant.

3
Kalanidhi M.
export HISTFILE=/dev/null 

C'est ma façon d'aller. Juste au cas où le HISTORY/HISTFILE/HISTCONTROL non défini, etc. ne fonctionne pas, l'exporter vers/dev/null a toujours fonctionné pour moi.

2
Ambrose

Pour aller un peu plus loin dans la réponse de SiegeX et en faire vraiment un mode incognito ...

Avertissement: le titre sera probablement en cours de travail sur gnome-terminal. il n'a été testé que dans Linux Mint 19.3/Gnome Terminal 3.28.1 parce que je suis paresseux.

Ajoutez ce qui suit à votre ~/.bash_functions (Cela suppose que vous l'importez via votre .bashrc/.profile Etc.):

function setGnomeTerminalTitle() {
    local NEW_TITLE="$1";
    PS1="\[\e]0;${NEW_TITLE}\a\]\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\]";
}

Ajoutez ensuite ce qui suit à votre ~/.bash_aliases (Encore une fois, cela suppose que vous l'importez via votre .bashrc/.profile Etc.):

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle \"$USER@$HOSTNAME:\${PWD//\${HOME//\\//\\\\\\/}/\\~}\" && set -o history"

EDIT: pour expliquer le contenu du titre histon - normalement le titre de la fenêtre dans gnome-terminal est "$ USER @ $ HOSTNAME: $ {PWD}" sauf que si vous êtes dans votre dossier personnel,/home/foo, il s'affiche comme ~; au moins, c'est sur mon ordinateur. cette commande utilise des substitutions de chaînes bash pour échapper aux barres obliques dans $HOME, nous obtenons donc \/home\/foo, puis en utilisant cela comme expression régulière pour remplacer ce modèle dans $PWD par un littéral ~ ... puis un tas d'échappements sont ajoutés en haut pour le faire fonctionner comme un alias dans une chaîne entre guillemets.

Maintenant, lorsque vous tapez histoff, vous obtenez un changement de titre pour le mode navigation privée et votre historique est arrêté pour cette session dans cette fenêtre (le mot histoff est toujours enregistré mais rien après). Si vous tapez ensuite histon, le titre est rétabli et toutes les lignes après histoff jusqu'à et y compris la ligne avec histon ne sont pas enregistrées mais tout après histon est enregistré.

Exemple:

## this is still logged
histoff  

## this is NOT logged
echo "my password is: password";
fake_ua='If firefox and curl had a child, would it be named furl?';
curl -A "$fake_ua" https://www.itsnotap0rnsiteipromise.com/curvy-girlz/;

vi ~/Documents/maths/super-secret-squirrel/gift-ideas.txt

## this is still NOT logged
histon

## this is logged again
Sudo apt install -y kmag;

0
zpangwin