Exécuter une commande sans la conserver dans l'historique [fermé]


203

Je veux exécuter certaines commandes mais je ne veux pas les stocker dans l'historique des commandes. Pour que personne ne puisse le rechercher dans le .bash_historyfichier.

Existe-t-il un moyen d'exécuter les commandes bash de cette façon?


13
Cette question devrait probablement être déplacée vers ServerFault car ce n'est pas autant de la "programmation" que de "l'administrateur du serveur" - mais merci pour la question / réponse, exactement ce dont j'avais besoin!
Andrew Theken

Réponses:


295

Commencez votre commande avec un espace et il ne sera pas inclus dans l'historique.

N'oubliez pas que cela nécessite la $HISTCONTROLdéfinition de la variable d'environnement .

  • Vérifiez que la commande suivante renvoie ignorespaceou ignoreboth

    #> echo $HISTCONTROL
  • Pour ajouter la variable d'environnement si elle est manquante, la ligne suivante peut être ajoutée au profil bash. Par exemple%HOME/.bashrc

    export HISTCONTROL=ignorespace

Une fois que le profil a été récupéré, les commandes préfixées par l'espace ne seront pas écrites dans $HISTFILE


20
Cela ne fonctionne que si ignorespace est inclus dans $ HISTCONTROL - bien que ce soit probablement la valeur par défaut sur la plupart des systèmes.
pgl

2
Correct. Pour plus de détails, l'OP devrait consulter HISTCONTROL et HISTIGNORE dans la page de manuel bash.
u-punkt

2
thegeekstuff.com/2008/08/… - d'autres conseils d'historique bash sont disponibles ici, y compris cette méthode pour masquer les commandes de l'historique
user379997

52

Dans une session Bash donnée, définissez le fichier d'historique sur / dev / null en tapant:

export HISTFILE=/dev/null

Notez que, comme indiqué dans les commentaires, cela n'écrira aucune commande de cette session dans l'historique!

Ne jouez pas avec le travail acharné de votre administrateur système, s'il vous plaît;)

La solution de Doodad est plus élégante. Désactivez simplement la variable: unset HISTFILE(merci!)


5
Cela empêchera toutes les commandes d'être enregistrées. Ce n'est pas ce que le questionneur veut.
Noufal Ibrahim

12
Cela m'a causé des problèmes liés aux /dev/nullautorisations définies sur 0600 à la déconnexion. Au lieu de cela, j'ai utilisé unset HISTFILE.
Doodad


21

Une extension de la réponse de @John Doe & @ user3270492. Mais cela semble fonctionner pour moi.

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

Vous ne devriez pas voir l'entrée de la commande dans votre historique.

Voici l'explication ..

'History -d' supprime l'entrée mentionnée de l'historique.

Le HISTCMD stocke le numéro de commande de celui à exécuter ensuite. Ainsi, (HISTCMD-1) fait référence à la dernière commande exécutée.

Supprimer une certaine ligne du fichier d'historique Bash


Malheureusement, cela n'a pas fonctionné pour moi.
Magick du

10

Vous pourriez envisager d'utiliser un shell sans historique, comme peut-être

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

(peut /bin/dash- être ou /bin/sashpourrait être plus approprié que /bin/sh)

ou encore mieux utiliser l' utilitaire batch par exemple

batch << EOB
   your commands
EOB

L'histoire contiendrait alors shou batchqui n'a pas beaucoup de sens


8

Vous pouvez commencer votre session avec

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

puis procédez à vos actions sournoises. La définition du fichier historique sur /dev/nullsera enregistrée dans le fichier historique, mais cette entrée sera facilement supprimée et aucune trace (au moins dans le fichier historique) ne sera affichée.

De plus, ce n'est pas permanent.


Cela a déjà été répondu à plusieurs reprises. Que diriez-vous que votre réponse ajoute à ce fil (sauf pour le bruit inutile)?
gniourf_gniourf

Il n'a pas été mis en place dans une seule réponse , afin de ne pas voir la commande elle-même apparaître dans l'historique et de ne rien voir apparaître par la suite.
Christian

1
Mais maintenant, ce fil est un vrai gâchis! dans ce cas, surtout pour une question aussi ancienne, je pense qu'il vaut mieux que vous modifiez les bonnes réponses déjà existantes, et / ou laissez un commentaire…
gniourf_gniourf

5

Comme mentionné par Doodad dans les commentaires , le unset HISTFILEfait bien, mais si vous souhaitez également supprimer un historique, faites echo $HISTFILEpour obtenir l'emplacement du fichier d'historique (généralement ~/.bash_history) unset HISTFILEet éditez ~/.bash_history(ou ce qui HISTFILEétait - bien sûr, c'est maintenant unsetpour que vous puissiez '' t le lire).

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

Ensuite, vous avez modifié votre historique et le fait que vous l'ayez modifié!


J'ai essayé ceci sur: GNU bash, version 3.2.57 (1) -release (x86_64-apple-darwin15) et cela ne fonctionne pas. Les commandes que j'ai utilisées après avoir désactivé HISTORY ont été stockées dans ~ / .bash_history
Krystian

@Krystian Mon erreur - j'avais écrit "unset HISTORY" alors qu'elle devrait être "unset HISTFILE" - corrigée. Ça marche maintenant? Il fonctionne sur GNU bash, version 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel

eh bien je ne suis pas sûr. Test simple: unset HISTFILE; echo TEST; historyvous donnera la commande echo TESTcomme la précédente au dernier. Bien qu'après avoir mis fin à la session et se reconnecter, l'historique n'a pas cette entrée en effet. Je dirais donc que cela fonctionne :)
Krystian

unset HISTFILEne semble pas arrêter l'enregistrement des commandes dans l'historique en mémoire, mais il les empêche d'être enregistrées dans le fichier $ HISTFILE. Donc je suppose que vous avez toujours votre historique local en mémoire, mais il n'est plus enregistré dans un fichier, ce que vous pourriez souhaiter! ;)
drkvogel

4

Vous pouvez également utiliser la commande suivante:

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

Je pense que c'est une commande très portable.


J'ai créé un alias à partir de ceci: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"et maintenant vous pouvez le faire quelque chose comme ceci:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
Désolé, mais je me rends compte que vous devez créer une fonction au lieu d'un alias car les guillemets changent la signification de $set d'autres choses dans sed. function forget() { // put code here // }
sobi3ch

3

Si vous utilisez zsh, vous pouvez exécuter:

setopt histignorespace

Une fois ce paramètre défini, chaque commande commençant par un espace sera exclue de l'historique.

Vous pouvez utiliser des alias dans .zshrcpour activer cette marche / arrêt :

# 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."'

Bien

2

Il existe plusieurs façons d'y parvenir. Cela définit la taille du fichier d'historique à 0:

export HISTFILESIZE=0

Cela définit le fichier d'historique /dev/nullet le désactive efficacement:

export HISTFILE=/dev/null

Pour les commandes individuelles, vous pouvez préfixer la commande avec un espace et elle ne sera pas enregistrée dans le fichier historique. Notez que cela nécessite que vous ayez la ignorespacevaleur incluse dans la $HISTCONTROLvariable d'environnement (man bash et recherchez ignorespaceplus de détails).


2
Cela empêchera toutes les commandes d'être enregistrées. Ce n'est pas ce que le questionneur veut.
Noufal Ibrahim

Eh bien, j'ai en quelque sorte supposé que le questionneur réinitialiserait les valeurs après avoir fait tout ce qu'il voulait qui ne devrait pas être enregistré.
pgl

1

C'est pratique si vous voulez effacer toute l'histoire, y compris le fait que vous avez effacé toute l'histoire!

rm .bash_history;export HISTFILE=/dev/null;exit

0

Vous avez juste besoin de lancer:
$ set +o history

Pour en savoir plus, exécutez:
$ man set


2
Cela désactive l'historique pour toutes les commandes futures, pas pour une commande individuelle. La plupart des gens qui viennent ici devraient plutôt regarder la réponse acceptée.
tripleee

Ceci est valide ou correct mais incomplet. Tant que nous ajoutons la commande inverse set -x historypar la suite, cela fonctionne.
Abdillah

0

Cette commande pourrait être utile. Cela n'enregistrera pas la commande qui est exécutée

history -d $((HISTCMD-1)) && <Your Command Here>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.