Y a-t-il un moyen d'empêcher qu'une commande soit ajoutée à votre historique?

65

Y a-t-il un moyen d'empêcher qu'une commande soit ajoutée à votre historique? J'ai une commande que je veux garder en dehors de mon historique, et je m'en fiche de l'avoir là lorsque je cherche l'historique mémorisé, bien que ce soit moins inquiétant. Est-il possible d'empêcher cela, ou dois-je simplement revenir en arrière et éditer mon fichier d'historique.

mise à jour: je n'avais pas réalisé que cela pouvait être spécifique à un shell. Ma coquille est zsh. Nous vous invitons à répondre pour d'autres obus afin que les gens sachent comment faire cela dans leur coque.

xénoterracide
la source
réticulation dans zsh answer: superuser.com/questions/352788/…
Michael Shigorin

Réponses:

52

En ZSH :

D'abord insérer setopt HIST_IGNORE_SPACEà votre ~/.zshrc. Maintenant, après vous être reconnecté, vous pouvez préfixer les commandes que vous ne souhaitez pas stocker dans l'historique space.

Dans le manuel d'utilisation , les 3 options suivantes peuvent être utilisées pour indiquer que certaines lignes ne doivent absolument pas entrer dans l'historique:

  • HIST_IGNORE_SPACE ne stocke pas les commandes préfixées par un espace
  • HIST_NO_STORE ne stocke pas la commande history ( fc -l )
  • HIST_NO_FUNCTIONS ne stocke pas les définitions de fonctions
dogbane
la source
aucune chance @mmckinst réponse fonctionne dans zsh? ou quelque chose comme ça? ou peut-être toute commande qui inclut la commande| somecommand
xenoterracide
Autant que je sache, il n’ya pas d’équivalent de HISTIGNORE en zsh de bash.
Dogbane
@xeno zsh fournit une fonction de raccordement preexecqui peut être utilisée pour cela. S'il renvoie non nul, la commande n'est pas enregistrée dans l'historique.
Keith
1
pour que zsh ignore un ensemble de commandes communes de base, je les ai toutes associées pour avoir un espace devant ... pour c (ls fg bg jobs exit clear reset); alias $ c = "$ c"; Fait
Will Norris
4
Pour les futurs lecteurs paresseux comme moi qui ne savent pas encore le faire: setopt HIST_IGNORE_SPACEin~/.zshrc
Al.G.
25

Si vous exécutez la commande encore et encore, vous voudrez peut-être utiliser la fonctionnalité Ignorer l'historique de votre shell. Disons que vous avez secret.server.com que vous voulez ssh to, les fichiers FTP, etc. que vous ne voulez aucune ligne mentionnant secret.server.com sauvegardée:

En bashvous mettriez

HISTIGNORE="*secret.server.com*"

alors que dans zshle paramètre est appelé

HISTORY_IGNORE="*secret.server.com*"

Vous pouvez répertorier plusieurs modèles en les séparant par deux points. Notez que chaque motif est comparé à la ligne d’entrée complète . Vous devrez donc peut-être inclure un *. Par exemple, ce qui suit va exclure fortunede l’historique, mais va stocker fortune -l:

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

Avec HISTIGNORE, rien ne correspondant aux modèles que vous avez énumérés ne sera enregistré dans .bash_history/ .zsh_historyet même la touche de la flèche vers le haut, qui rappelle normalement votre commande précédente, ne fonctionnera pas si elle correspond à votre modèle.

Mark McKinstry
la source
3
aucune chance cela fonctionne dans zsh?
Xenoterracide
Existe-t-il une option permettant d’ignorer uniquement les lignes commençant par fortune? Quelque chose comme HISTIGNORE="^fortune*"ignorer fortune -lmais garder myfortune?
Bernhard
@xenoterracide C'est le cas, mais le paramètre est nommé différemment. Je viens de l'éditer dans la réponse.
n.
23

En bash, utilisez la HISTCONTROLvariable.

Réglez-le sur HISTCONTROL=ignorespace(ou HISTCONTROL=ignoreboth). A partir de maintenant, lorsque vous commencez une ligne par un espace , elle ne sera pas enregistrée dans l'historique. Cela évite d’inclure la commande à ne pas divulguer dans certains fichiers de configuration.

Même comme cela, il arrive d’oublier d’ajouter de l’espace puis de vouloir revenir en arrière. Pour supprimer une entrée dans l'historique, utilisez history -d <index>avec indexle numéro trouvé avec la historycommande (première colonne).

shellholic
la source
1
Est-ce que ça marche zsh?
Gert
11

Le moyen le plus simple pour une pièce unique est

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

$représente l'invite du shell initial et $$représente l'invite du sous-shell. Cela fonctionne dans bash et zsh; en ksh vous avez besoin à la HISTFILE=/notwritableplace. Notez que ce qui compte est la valeur du HISTFILEmoment où le fichier d'historique est écrit, pas le moment de l'exécution de la commande. Bash, ksh et zsh écrivent dans le fichier d’historique lors de leur sortie (zsh peut le faire plus souvent en fonction de la configuration).

Alternativement, vous pouvez demander à bash ou à zsh d’ignorer les lignes correspondant à certains modèles (cela est déjà couvert par d’autres réponses).

Une autre possibilité dans zsh est

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

fc -pplace la liste d'historique actuelle sur une pile et en démarre une nouvelle qui n'est pas associée à un fichier de sauvegarde. fc -Pl’histoire non sauvegardée liste de la pile et l’oublie complètement.

Lorsqu'un processus est en cours d'exécution, la commande et ses arguments (ainsi que son environnement sur certains systèmes) s'afficheront dans la table des processus ( pssortie). Root peut voir les commandes passées dans la base de données de comptabilité système et peut effectuer davantage de journalisation sans votre contrôle. Et il y aura probablement toutes sortes de preuves médico-légales pouvant montrer à peu près quelle commande vous avez exécutée (telles que les temps de modification de fichier). Donc, vous n'obtenez pas la vie privée contre des oreilles indéterminées.

Gilles, arrête de faire le mal
la source