Question Supprimer une certaine ligne du fichier historique Bash


Comment puis-je supprimer une certaine ligne de historyla base de données?


128
2018-01-31 15:43


origine




Réponses:


Vous devez vous déconnecter et vous reconnecter ou exécuter history -a L'historique actuel est donc dédié au disque.

Ensuite, éditez simplement le fichier ~/.bash_history.


95
2018-01-31 16:01



Si la variable d'environnement HISTFILE est définie, le fichier d'historique n'est pas ~ / .bash_history mais plutôt $ {HISTFILE}. - Karolos
Les entrées sont écrites dans le fichier historique lorsque vous quittez le shell. Par conséquent, après avoir saisi une commande que vous souhaitez supprimer, vous devez soit vous déconnecter, soit utiliser "history -d xxxx" pour les supprimer de la session shell en cours. - harmic
mais comment supprimer l'enregistrement de l'édition du fichier historique? - chiliNUT
@chiliNUT: commencez simplement votre commande (par ex. vim ~/.bash_history) avec un espace; les commandes commençant par un espace ne sont généralement pas consignées (voir $HISTCONTROL). - cYrus
Je ne pense pas que ce soit le cas dans ma distribution, mais en général cela a du sens - chiliNUT


Vous pouvez réaliser la suppression du fichier historique en utilisant la ligne de commande en deux étapes:

  1. Dactylographie history -d <line_number> supprime une ligne spécifiée de l'historique en mémoire.
  2. Dactylographie history -w écrit l'histoire actuelle de la mémoire dans le ~/.bash_history fichier.

Les deux étapes ensemble enlèvent la ligne de manière permanente de la mémoire histoire et de la .bash_history fichier aussi.


140
2018-01-31 16:09



comment effacer le dernier history -w de l'histoire? - KrIsHnA
@KrIsHnA éditer manuellement ~ / .bash_history - Alexander Myshov
Ou ajoutez un espace avant pour l'empêcher d'être ajouté, comme dans la réponse de @ tao - Mark
Trouver <line_number> juste history | grep [unwanted_content] pour obtenir une liste de toutes les lignes contenant [unwanted_content] (comme les mots de passe). - AvL
Comment supprimez-vous plusieurs lignes (spécifiques) (par identifiant)? - Pathros


À prévenir une commande d'être ajoutée à l'histoire en premier lieu, assurez-vous que la variable d'environnement HISTCONTROL contient parmi ses valeurs séparées par des deux-points la valeur ignorespace, par exemple (ajouter par exemple à .bashrc):

$ export HISTCONTROL=ignorespace

Cela empêchera toute commande avec un espace principal d'être ajoutée à l'historique. Vous pouvez alors effacer complètement l’historique en exécutant

$  history -c -w
  ^-- additional space character

37
2018-02-01 22:19





Tout d'abord, si la commande que vous vous apprêtez à émettre est sensible, dangereuse ou si vous n'en avez pas besoin pour encombrer votre histoire, il est préférable / rapide de l'empêcher d'entrer dans l'histoire. Sois sûr que $HISTCONTROL contient ignorespace:

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Puis continuez toute commande que vous ne voulez pas dans votre histoire avec un espace:

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

Si vous mettez accidentellement une commande indésirable dans l'historique, à condition que votre session bash soit toujours ouverte, la commande n'a pas encore touché le disque. Pour supprimer la commande précédente dans l'historique, lancez:

(bash)$  history -d $((HISTCMD-1))

Notez le premier espace cette commande nécessite ignorespace, sinon il va simplement se supprimer!

Si vous souhaitez supprimer les dernières commandes, recherchez le dernier et le premier numéro d’historique:

(bash)$  history 5
  598  ok
  599  sensitive
  600  unsafe
  601  doesn\'t-work
  602  otherwise-unwanted

Dans ce cas 602 et 599. Puis émettre:

(bash)$  for i in {602..599}; do history -d $i; done

(Sans pour autant ignorespace, ce serait 603..599.)

Si tu ne veux pas tout historique de votre session en cours pour frapper le disque, quitter en utilisant:

(bash)$ kill -9 $$

L'approche actuelle consiste à ne pas laisser les éléments de l'historique sensibles sur le disque pour plus de sécurité, car en théorie, les données supprimées des supports non volatiles peuvent toujours être récupérées.

Si, toutefois, les commandes que vous souhaitez supprimer proviennent d'une session précédente, elles auront déjà été ajoutées à la $HISTFILE à la sortie. Manipuler l’historique avec les commandes ci-dessus ne fera que ajouter le reste Nouveau articles à la $HISTFILE, à la sortie. À écraser la $HISTFILE avec la vue de la session actuelle du tout histoire, maintenant, problème:

(bash)$  history -w

Bien sûr, pour les éléments d’historique déjà sur le disque, l’alternative à la modification de l’historique avec history -d commandes émettant alors history -w, est de modifier le $HISTFILE avec un éditeur de texte.


30
2018-06-18 16:33



"Manipuler l’historique avec les commandes ci-dessus ne fera que ajouter le reste Nouveau articles à la $HISTFILE, à la sortie"En fait, ce n'est pas exactement vrai. Il ne semble ajouter que les nouveaux éléments restants qui dépassent de la longueur de l’historique original. Par exemple. Si je supprime 5 éléments originaux et ajoute 15 nouveaux, seules les 10 dernières nouvelles sont ajoutées, alors que je m'attends à ce que toutes les 15 nouvelles soient ajoutées. Je pense que c'est un bug car je ne vois pas en quoi cette fonctionnalité est souhaitable. - James Haigh
Je suppose que bash prend note de la longueur originale. À la clôture de la session, il ajoute probablement des éléments dont le nombre est supérieur à cette valeur. Si cette valeur était décrémentée chaque fois qu'un élément est supprimé dont le nombre est inférieur ou égal à cette valeur, cela fonctionnerait comme prévu. ;-) - James Haigh


Plusieurs techniques:

Empêcher le stockage d'informations sensibles dans le fichier d'historique

Si vous avez entré un mot de passe sur une ligne de commande, alors réalisez que toutes les commandes sont enregistrées, vous pouvez soit:

  1. Forcer la sortie de la session en cours sans enregistrer l'historique:

     kill -9 $$
    

    Cela va laisser tomber toute l'histoire actuelle.

  2. Type ↑ (flèche haut) dans la session ouverte jusqu'à ce que les informations sensibles soient affichées, puis utilisez les touches d'édition de ligne comme Ctrl+W pour supprimer les informations sensibles, et puis  ↓ (flèche vers le bas) jusqu'à ce qu'une nouvelle ligne vide s'affiche, avant dactylographie Entrer.

Supprimer les informations sensibles du fichier historique

Si vous réalisez que des informations sensibles sont déjà stockées et que vous souhaitez les supprimer, mais pas votre historique complet:

Un simple sed commande pourrait faire le travail:

sed -e '/SeNsItIvE InFo/d' -i .bash_history

mais, lorsque vous tapez ceci, vous créez une autre ligne d'historique contenant le modèle de recherche (informations sensibles) que vous essayez de supprimer. Donc, vous pouvez:

sed -e "/$(head -n1)/d" -i .bash_history

Cela fonctionnera head -n1 avec entrée du terminal. Il apparaîtra que votre terminal est bloqué (il n'y aura pas d'invite); tapez simplement les informations que vous souhaitez supprimer du fichier. Ceci est une astuce pour vous permettre d'entrer (une partie de) une commande sans le taper dans la ligne de commande, ce qui le rend inéligible pour l'inclusion dans l'historique. alors sed utilisera le texte que vous avez tapé pour rechercher .bash_history et supprimer toutes les lignes contenant les informations sensibles. Remarque: si votre modèle d'informations sensibles contient des barres obliques, vous devez leur échapper avec des backslashes, ou bien changer le sed commande pour utiliser cette syntaxe pour spécifier un délimiteur qui n'apparaît pas dans le motif:

sed -e "\|$(head -n1)|d" -i .bash_history

Une autre façon pourrait être de supprimer uniquement les informations sensibles, mais de conserver les commandes contenant les informations. Pour cela, vous pouvez simplement remplacer les informations sensibles par un texte de remplacement de votre choix:

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

Supprimer les informations sensibles de tout fichier dans une arborescence spécifique

Enfin, pour être sûr que cela ne restera pas dans un autre fichier oublié:

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

listera tous les fichiers concernés.

find . -type f -print0 |
    xargs -0 grep -l "$SENSITIVEINFO" |
    tr \\n \\0 |
    xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

remplacera toutes les occurrences d'informations sensibles dans tous les fichiers dans l'arborescence des répertoires .. Remarque: même si cette commande utilise xargs -0, il ne gérera pas les fichiers avec des nouvelles lignes dans leurs noms.


14
2017-07-19 12:50





Localisez la ligne que vous souhaitez supprimer en appuyant sur ↑ (flèche haut) jusqu'à ce qu'il apparaisse, puis appuyez sur Ctrl+U. Cela devrait enlever la ligne.

Si vous utilisez le history commande, vous pouvez voir que la ligne a été remplacée par un astérisque.


10
2018-04-01 16:00



En fait, je pense que vous devez déplacer le curseur vers la ligne, appuyez sur Ctrl + U, et puis le curseur vers le haut ou le bas vers une autre ligne (éventuellement le blanc au bas de la liste). De plus, à proprement parler, la ligne n'a pas été remplacée par un astérisque. Au contraire, la commande a été effacée, et la numéro d'historique a été ajouté avec un *. - G-Man
Cela devient beaucoup plus puissant avec Ctrl + R (recherche d'historique incrémentiel inverse), puis par ex. [Fin], Ctrl + U - sehe


Si vous devez supprimer plusieurs lignes en même temps, j'utilise normalement ceci:

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

Si vous devez supprimer la dernière commande, vous pouvez utiliser:

history -d $((HISTCMD-2))

4
2018-01-07 05:53



Cela semblait bien fonctionner mais history | grep <string> montre toujours toutes les lignes qu'il prétend supprimer ... - Brock Hensley
Cela effacera les mauvaises lignes d'historique après la suppression du premier !! - mivk
Mais heureusement, il imprime uniquement des commandes de suppression erronées. Ce qui suit imprimerait les commandes de suppression correctes: history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}' - mivk


Si vous devez supprimer une série de lignes de l'historique, la fonction bash suivante pourrait vous faire gagner du temps:

function histdel() {
    [ $# -eq 1 ] && history -d "$1" && history -w
    if [ $# -eq 2 -a "$1" -le "$2" ]; then
        for n in `seq "$2" "$1"`; do
            history -d "$n"
        done
        history -w
    fi
}

La fonction doit généralement être ajoutée à $HOME/.bashrc. Pour utiliser la fonction immédiatement, vous devrez relire le fichier par votre shell en cours d'exécution (. $HOME/.bashrc). Ensuite, pour supprimer par exemple commandes 200-210 de l'histoire:

$ histdel 200 210

(Remarque: cette question figure parmi les meilleurs résultats de recherche si vous cherchez à supprimer une série de commandes de l’historique de bash. Alors que ce qui précède est plus que ce que la question demande, cela pourrait être utile pour certains lecteurs.)


3
2017-10-26 14:09



Formes alternatives pour le for déclaration: for n in $(seq "$2" "$1") est stylistiquement préféré par certains, et si seq ne fonctionne pas, essayez for ((n="$2"; n>="$1"; n--)). - Scott