2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152

Supprimer une certaine ligne du fichier d'historique Bash

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

Réponses (12)

152
152
152
2012-01-31 16:09:25 +0000

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

  1. En tapant history -d <line_number>, vous supprimez une ligne spécifiée de l'historique en mémoire.
  2. Taper history -w écrit l'historique actuel en mémoire dans le fichier ~/.bash_history.

Les deux étapes combinées suppriment définitivement la ligne de l'historique en mémoire et du fichier .bash_history également.

118
118
118
2012-01-31 16:01:05 +0000

Vous devez vous déconnecter et vous reconnecter ou exécuter history -a pour que l'historique actuel soit enregistré sur le disque.

Ensuite, il suffit d'éditer le fichier ~/.bash_history.

41
41
41
2012-02-01 22:19:06 +0000

Pour empêcher qu'une commande soit ajoutée à l'historique en premier lieu, assurez-vous que la variable d'environnement HISTCONTROL contient parmi ses valeurs séparées par deux points la valeur ignorespace, par exemple (ajoutez par exemple à .bashrc) :

$ export HISTCONTROL=ignorespace

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

$ history -c -w
  ^-- additional space character
33
33
33
2013-06-18 16:33:19 +0000

Tout d'abord, si la commande que vous allez émettre est sensible, dangereuse ou si vous n'avez tout simplement pas besoin qu'elle encombre votre historique, il est préférable/rapide de l'empêcher d'entrer dans l'historique en premier lieu. Assurez-vous que $HISTCONTROL contient ignorespace :

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

Ensuite, effectuez toute commande que vous ne voulez pas voir apparaître dans votre historique avec un espace :

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

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

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

_Note l'espace en tête ; cette commande nécessite ignorespace, sinon elle s'effacera toute seule !

Si vous voulez supprimer les dernières commandes, trouvez le dernier et le premier numéro de l'historique :

(bash)$ history 5
  598 ok
  599 sensitive
  600 unsafe
  601 doesn 

Dans ce cas, 602 et 599. Puis émettez : 

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

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

Si vous ne voulez pas que _l'historique de votre session actuelle atteigne le disque, quittez en utilisant :

(bash)$ kill -9 $$

L'approche adoptée jusqu'à présent consiste à ne même pas laisser les éléments sensibles de l'historique être écrits sur le disque pour plus de sécurité, car en théorie, les données supprimées d'un support non volatil peuvent toujours être récupérées.

Si, toutefois, la ou les commandes que vous souhaitez supprimer proviennent d'une session précédente, elles auront déjà été ajoutées à la $HISTFILE à la sortie. La manipulation de l'historique avec les commandes ci-dessus ne fera qu'ajouter les nouveaux éléments restants au $HISTFILE, à la sortie. Pour écraser le $HISTFILE avec la vue de la session en cours de l'historique entière, dès maintenant, il faut émettre :

(bash)$ history -w

Bien sûr, pour les éléments de l'historique déjà sur le disque, l'alternative à l'édition de l'historique avec les commandes history -d puis l'émission de history -w, est d'éditer le $HISTFILE avec un éditeur de texte.t-work 602 otherwise-unwanted ”`

Dans ce cas, 602 et 599. Puis émettez :

0x1&

(Sans 0x6&, ce serait 603..599.)

Si vous ne voulez pas que _l'historique de votre session actuelle atteigne le disque, quittez en utilisant :

0x1&

L'approche adoptée jusqu'à présent consiste à ne même pas laisser les éléments sensibles de l'historique être écrits sur le disque pour plus de sécurité, car en théorie, les données supprimées d'un support non volatil peuvent toujours être récupérées.

Si, toutefois, la ou les commandes que vous souhaitez supprimer proviennent d'une session précédente, elles auront déjà été ajoutées à la 0x6& à la sortie. La manipulation de l'historique avec les commandes ci-dessus ne fera qu'ajouter les nouveaux éléments restants au 0x6&, à la sortie. Pour écraser le 0x6& avec la vue de la session en cours de l'historique entière, dès maintenant, il faut émettre :

0x1&

Bien sûr, pour les éléments de l'historique déjà sur le disque, l'alternative à l'édition de l'historique avec les commandes 0x6& puis l'émission de 0x6&, est d'éditer le 0x6& avec un éditeur de texte.

17
17
17
2013-07-19 12:50:40 +0000

Plusieurs techniques :

Empêcher que des informations sensibles ne soient stockées dans le fichier d'historique

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

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

  2. Tapez ↑ (flèche vers le haut) dans la session de bash 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 alors ↓ (flèche vers le bas) jusqu'à ce qu'une nouvelle ligne vide soit demandée, avant de taper Entrée.

Supprimer les informations sensibles du fichier d'historique

Si vous vous rendez compte que des informations sensibles sont déjà stockées, et que vous souhaitez les supprimer, mais pas tout votre historique :

Une simple commande sed pourrait faire l'affaire :

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

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

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

Cela donnera head -n1 avec une entrée du terminal. Il semblera que votre terminal soit suspendu (il n'y aura pas d'invite) ; tapez simplement l'information que vous voulez supprimer du fichier. Il s'agit d'une astuce pour vous permettre d'entrer (une partie de) une commande sans la taper réellement dans la ligne de commande, ce qui la rend inéligible pour l'inclusion dans l'historique. Ensuite, sed utilisera le texte que vous avez tapé pour rechercher .bash_historyet supprimer toutes les lignes contenant les informations sensibles. Remarque : si votre modèle d'informations sensibles contient des barres obliques, vous devez les échapper avec des antislashes, ou bien modifier la commande sed pour utiliser cette syntaxe afin de spécifier un délimiteur qui n'apparaît pas dans le modèle :

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 qui contiennent les informations. Pour cela, vous pourriez simplement remplacer les informations sensibles par un texte de substitution de votre choix :

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

Supprimer les informations sensibles de tout fichier d'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"

énumérera 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 de l'arborescence de répertoires ayant pour racine .. Note : même si cette commande utilise xargs -0, elle ne traitera pas les fichiers dont le nom comporte des lignes de rappel.

12
12
12
2015-04-01 16:00:26 +0000

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

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

5
5
5
2013-01-07 05:53:04 +0000

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

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

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

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

Si vous avez besoin de supprimer une série de lignes de l'historique, la fonction de 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 devrait généralement être ajoutée à $HOME/.bashrc. Pour utiliser la fonction immédiatement, vous devrez faire relire le fichier par votre shell en cours d'exécution (. $HOME/.bashrc). Ensuite, pour supprimer par exemple les commandes 200-210 de l'historique :

$ histdel 200 210

(Note : Cette question est parmi les meilleurs résultats de recherche si vous cherchez à supprimer une série de commandes de l'historique des bashs. Donc, bien que ce qui précède soit plus que ce que demande la question, il pourrait être utile pour certains lecteurs).

3
3
3
2014-03-04 11:16:04 +0000

Essayez juste ceci,

$ history

cela affichera l'identifiant de l'historique et de la commande, par exemple

. . 211 ls 212 javac Welcome.java 213 java welcome . .

use,

$ history -d 211

Ici 211 est l'identifiant de l'historique. Maintenant, vérifiez ceci en utilisant

$ history

. . 211 javac Welcome.java 212 java welcome . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59 est le numéro de ligne. Il ne peut y avoir rien de plus doux que cela :)

2
2
2
2015-09-30 04:57:29 +0000

Je sais que cela fait longtemps que cette question n'a pas été posée et répondue, mais je vais vous montrer ma méthode pour nettoyer mon fichier historique et me déconnecter en même temps.

Je lance :history -w && nano "${HISTFILE}" && history -c && exit

Ce qu'il fait est simple :

  1. history -w : écrit l'historique en cache à l'intérieur de "${HISTFILE}"
  2. nano "${HISTFILE}" : me permet de modifier "${HISTFILE}" Vous pouvez utiliser un script sed ou autre pour nettoyer votre "${HISTFILE}"
  3. history -c : efface l'historique en cache pour que cette dernière commande ne soit pas ajoutée.
  4. exit : déconnectez-moi en ajoutant l'historique du cache… mais il est vide ;)

: après cette commande, vous serez déconnecté avec un fichier d'historique propre. Connectez-vous pour vérifier votre historique ;)

J'espère que cela aidera quelqu'un.

1
1
1
2017-03-27 14:10:10 +0000

Vous pouvez également éditer directement le fichier d'historique, par exemple nano .bash_history si vous êtes dans le shell bash ?