Mode «incognito» du terminal?

230

J'utilise beaucoup Terminal et, parfois, j'exécute des commandes. Ce ne sont pas des choses que je ne veux pas que les autres voient, mais d'autres commandes qui causeraient beaucoup de problèmes si je faisais une flèche accidentellement vers le haut et que je les exécutais accidentellement.

Je me demande donc s’il existe ou si je peux créer une sorte de «mode incognito» de Terminal qui me permettrait, lors de l’exécution d’une commande donnée, d’arrêter d’enregistrer mon historique, puis de commencer à enregistrer uniquement après avoir exécuté une commande. recommencer l'enregistrement de la commande et quitter le 'mode incognito' ou redémarrer simplement le terminal?

Parce que je me retrouve plus tard à retirer des éléments de mon ordinateur .bash_history, alors que ce serait beaucoup plus facile si j'avais pu arrêter l'enregistrement, ou du moins le faire essayer d'essayer de l'enregistrer quelque part où ce ne serait tout simplement pas possible autorisé à, et finirait juste par ne pas l'enregistrer.


la source
6
Eh bien, vraisemblablement vous êtes paranoïaques que votre histoire sera lue par d'autres?
Sparhawk
6
@Sparhawk: Eh bien, c'est en partie cela, et la partie je ne veux pas exécuter accidentellement une commande de maintenance potentiellement mortelle quand je m'arrête juste dans le futur! : D
19
Juste pour ajouter, vous n'avez pas à vous justifier: "ce ne sont pas des choses que je ne veux pas que les autres voient" . Ce serait une raison parfaitement valable pour moi aussi. (Surtout à cette époque où tout le monde essaie de vous faire
croire
2
Si vous ouvrez deux onglets, faites des choses dans le premier, faites dans le deuxième, puis fermez le deuxième AVANT le premier, seul l’historique du premier semble être écrit .bash_history. (Ubuntu 15.04 ruiné Terminal, chanceux c'est une clé USB live.)
Hitechcomputergeek
1
Voir cette question sur serverfault
Luc M

Réponses:

265

Exécutez une commande sans la mettre dans l'historique:

Il suffit de mettre un espace avant la commande. Bash ignorera les commandes avec un espace ajouté:

Exemple: Spaceecho "Some secret text"

Remarque: cela ne fonctionne que si la HISTCONTROLvariable est définie sur ignorespaceou ignoreboth.


Désactiver temporairement l'historique:

  • Exécuter Spaceset +o historyou Spaceshopt -uo historydésactiver l'historique.
  • Exécutez set -o historyou shopt -so historyréactivez-le.

Désactiver l'historique pour la session en cours (ne retiendra aucune commande de la session):

unset HISTFILE

Remarque: vous pourrez voir les commandes enfoncées Upjusqu'à la fermeture du terminal.


Supprimer une commande de l'historique:

Courir Spacehistory | grep "part of your secret command"

Il affichera une liste des commandes précédemment exécutées, dans ce format:

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

Sélectionnez le numéro d'entrée à gauche de la commande. Vous pouvez le copier avec Ctrl+ Shift+C

Run Spacehistory -d <number><number>est le numéro d'entrée pour supprimer l'entrée.
Vous pouvez coller ce nombre avec Ctrl+ Shift+V


Autres réponses intéressantes:

Helio
la source
7
Si vous utilisez history -dpour supprimer une ligne, cela supprimera le contenu de la ligne, mais vous ne pourrez jamais supprimer le fait que vous avez exécuté history -d(à moins que vous ne l' set +o historyhistory -d
utilisiez
1
Cela m'a rappelé la logique de la super-injonction, c'est tout;)
AJFaraday
4
(OT) Les injonctions sont un document juridique qui empêche les gens de publier quelque chose. Une super injonction les empêche également de publier le fait que la possibilité de publication leur a été refusée. Certains arguments logiques leur demandent s’ils peuvent publier qu’on leur a refusé la possibilité de publier certaines informations. Cela devient alors un argument cyclique.
AJFaraday
1
@ Helio, je pense qu'il est préférable que les utilisateurs sachent la "bonne" façon de copier, en particulier s'ils choisissent accidentellement du texte. Je ne suis pas sûr de savoir comment faire l'espace, peut-être clarifier plus que l'espace est là? [L'espace] me semble un peu maladroit ...
Tim
2
L' unset HISTFILEapproche fonctionne également de manière rétroactive pour toutes les commandes qui n'ont pas encore été écrites .bash_history.
Kasperd
40

Vous pouvez simplement supprimer l'historique d'une session de terminal particulière en ajoutant une commande history -cwaprès avoir travaillé.

Ne fermez pas le terminal avant de donner cette commande.

Moithil Biswas
la source
Cela ne va pas enlever toute l'histoire?
Helio
6
Cela ne fera que supprimer l'historique de cette session de terminal particulière.
Moithil Biswas
28

shopt -uo history devrait le faire mieux.

Identifier les variables HISTFILE(et autres) n’empêchera pas l’ Upenregistrement de votre historique, il ne le poussera tout simplement pas. Cela peut ou peut ne pas être une chose positive pour vous, mais étant donné que vous en parlez, je suppose que vous voulez quelque chose de mieux. Changer le shoptparamètre d'historique empêche le déclenchement de tout le mécanisme de l'historique.

Vous pouvez réactiver la connexion avec shopt -so history(le -set -usont respectivement définis et non définis).

Notez que la commande elle-même sera probablement consignée, donc ajoutez-y un espace pour l'empêcher d'être ajoutée à l'historique avant d'effacer la variable.

Oli
la source
17

Une autre façon de tuer le shell actuel sans vous connecter au fichier d’historique est de faire:

kill -9 $$

Ceci a pour effet que bash (et probablement d’autres coquilles aussi) envoie le signal SIGKILL à lui-même, le tue immédiatement et l’empêche de rien écrire sur le disque.

balourd
la source
7
aka 'tirez-vous dans la tête' :). Cela présente l'avantage que vous n'avez pas besoin de vous rappeler de faire quoi que ce soit avant d'écrire les commandes.
Guido
3
J'utilise zsh avec une écriture incrémentielle, donc je doute que cela fonctionne dans mon cas.
Wayne Werner
13

Pour désactiver temporairement l'historique des commandes de la session en cours, vous pouvez désactiver temporairement la variable d'environnement HISTFILE.

unset HISTFILE

tant que la session est active, vous pouvez accéder à l'historique comme d'habitude, mais celui-ci ne sera pas enregistré sur le disque.

Pour inverser la même session (toutes les modifications seront enregistrées)

HISTFILE=$HOME/.bash_history
Bruni
la source
1
Et y at-il un moyen simple dans la session en cours d’inverser la situation et de la poursuivre?
@ParanoidPanda J'ai ajouté une commande pour revenir en arrière dans la session en cours.
Bruni
1
@ParanoidPanda: Pourquoi avez-vous besoin d'une commande pour définir à HISTFILEnouveau la session en cours? Si vous annulez la modification (même après avoir exécuté les commandes secrètes), elles seront stockées dans l'historique lorsque vous quitterez.
Helio
@ Helio: Oh non, je parlais d'une commande qui recommencerait à enregistrer, mais ne sauvegarderait pas les commandes que je ne voulais pas sauvegarder.
1
@ParanoidPanda, Helio semble avoir raison sur celui-ci puisque l'historique est sauvegardé à la sortie. Je n'avais pas envisagé celui-là.
Bruni
10

Vous pouvez modifier les lignes d’historique dans la session actuelle du shell. Si vous vous promenez à travers l' histoire (par exemple , avec Upou Ctrl+ P) et de modifier une ligne sans l' exécuter , seule la version modifiée de la ligne sera enregistrée. Vous pouvez le modifier à votre guise. les bons choix incluent utiliser Ctrl+ Upour effacer totalement la ligne ou utiliser Esc#pour mettre un #caractère de commentaire au début.

Pour laisser une ligne sans l'exécuter, rappelez-vous de ne pas toucher Return( Enter). Ce que je fais est de revenir à la dernière ligne de l’histoire via Esc>.

(Au lieu de Escsuivi de >, dans la plupart des terminaux, vous pouvez maintenir Altet appuyer >; la même chose vaut pour la Esc#suggestion ci-dessus.)

Remarque: vous ne pouvez pas modifier de manière permanente les entrées de sessions précédentes de cette manière. Ces modifications ne seront pas appliquées HISTFILEà la fin de la session.

echristopherson
la source
6

Vous pouvez aussi faire en sorte que .bash_history soit en lecture seule. Je voudrais d'abord vider le fichier puis faire:

 chattr +i .bash_history
Webtm
la source
5

Vous pouvez exécuter les commandes sensibles dans une session d'écran, puis détruire la session lorsque vous avez terminé.

Alternativement, vous pouvez garder cette session d'écran vivante mais séparée, et y accéder uniquement lorsque vous voulez réellement pouvoir utiliser la flèche vers le haut pour les commandes autrement dangereuses.

keag
la source
1

Personnellement j'utilise mksh, et ce shell n'a par défaut aucun fichier d'historique. Cela signifie que vous pouvez lancer un autre shell tel que mkshou dash(qui vient par défaut) pour exécuter la commande que les utilisateurs ne souhaitent pas voir, et quitter une fois terminé. bashL'histoire enregistrera seulement que vous avez lancé un shell alternatif et c'est tout.

Sergiy Kolodyazhnyy
la source
1

Vous pouvez également utiliser multiplexeur de terminal tel que tmux, screen. Donc, l' histoire tmuxou l' screenhistoire ne serait pas sauvegardée.

Vusan
la source