web-dev-qa-db-fra.com

Supprimer une certaine ligne du fichier historique Bash

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

138
w0rldart

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

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

104
cYrus

Vous pouvez supprimer le fichier d’historique à l’aide de la ligne de commande en deux étapes:

  1. Taper history -d <line_number> supprime 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 ensemble suppriment également la ligne des fichiers history et .bash_history en mémoire.

144
Paperlantern

Pour empêcher une commande d'être ajoutée à l'historique 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 (ajoutez par exemple à .bashrc):

$ export HISTCONTROL=ignorespace

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

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

Tout d'abord, si la commande que vous êtes sur le point d'émettre est sensible, dangereuse ou si vous n'avez pas besoin de l'encombrer votre historique, il est préférable 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 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 ajouté une commande indésirable à 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 de l'historique, tapez:

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

Notez l'espace de premier plan; Cette commande nécessite ignorespace, sinon elle va juste 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. Ensuite, publiez:

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

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

Si vous ne voulez pas que any history de votre session actuelle soit enregistré sur le disque, quittez en utilisant:

(bash)$ kill -9 $$

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

Si, toutefois, les commandes que vous souhaitez supprimer appartiennent à une session précédente, elles auront déjà été ajoutées au $HISTFILE à la sortie. Manipuler l’historique avec les commandes ci-dessus ne fera toujours que ajouter le reste nouveau éléments au $HISTFILE, à la sortie . Pour écraser le $HISTFILE avec la vue de la session en cours du entier historique, pour le moment , issue:

(bash)$  history -w

Bien sûr, pour les éléments d’historique déjà présents sur le disque, l’alternative à la modification de l’historique à l’aide des commandes history -d qui émettent ensuite le history -w consiste à modifier le $HISTFILE à l’aide d’un éditeur de texte.

31
James Haigh

Plusieurs techniques:

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

Si vous avez entré un mot de passe sur une ligne de commande, assurez-vous que toutes les commandes sont consignées, vous pouvez soit:

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

     kill -9 $$
    

    Cela abandonnera toute l'histoire actuelle.

  2. Type ↑ (up arrow) dans la session bash ouverte jusqu’à ce que les informations sensibles soient affichées, puis utilisez les combinaisons de touches de modification de ligne telles que Ctrl+W supprimer les informations sensibles, et alors ↓ (down arrow) jusqu'à ce qu'une nouvelle ligne vide soit affichée, avant en tapant Enter.

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 tout votre historique:

Une simple commande sed pourrait faire le travail:

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

mais, en tapant ceci, vous créez une autre ligne d'historique contenant le motif de recherche (informations sensibles) que vous essayez de supprimer. Pour que vous puissiez:

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

Ceci fonctionnera head -n1 avec l'entrée du terminal. Il semblera que votre terminal est bloqué (il n'y aura pas d'invite); Il suffit de taper les informations que vous souhaitez supprimer du fichier. C'est une astuce pour vous permettre d'entrer (une partie de) une commande sans la taper réellement dans la ligne de commande, la rendant ainsi inéligible pour l'inclusion dans l'enregistrement d'historique. Ensuite, sed utilisera le texte que vous avez saisi 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 les échapper avec des barres obliques inverses, ou bien modifiez la commande sed pour utiliser cette syntaxe afin de spécifier un délimiteur ne figurant pas dans le modèle:

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

Une autre solution pourrait consister à supprimer uniquement les informations sensibles, tout en conservant les commandes contenant les informations. Pour cela, vous pouvez 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 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 de l’arborescence de répertoires dont le nom est .. Remarque: même si cette commande utilise xargs -0, elle ne gérera pas les fichiers contenant des nouvelles lignes dans leurs noms.

14
F. Hauri

Localisez la ligne que vous souhaitez supprimer en appuyant sur ↑ (up arrow) jusqu'à ce qu'il 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.

11
vicentecarro

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
Bond
history | sed -i 59d

59 est le numéro de ligne. Ne peut pas être plus doux que ça :)

3
KroKite

Essayez juste ceux-ci,

$ history

ceci affichera l'id de l'historique et de la commande, par exemple.

.
.
211 ls
212 javac Bienvenue.Java
213 Java bienvenue
.
.

utilisation,

$ history -d 211

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

$ history

.
.
211 javac Bienvenue.Java
212 Bienvenue en Java
.
.

3
user3378188

Si vous devez supprimer une plage de lignes de l'historique, la fonction bash suivante peut 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 être typiquement ajoutée à $HOME/.bashrc. Pour utiliser la fonction immédiatement, vous devez faire relire le fichier par votre shell en cours d'exécution (. $HOME/.bashrc). Ensuite, pour supprimer par exemple commandes 200-210 de l'historique:

$ histdel 200 210

(Remarque: cette question figure parmi les premiers résultats de la recherche si vous recherchez la suppression d'une plage de commandes de l'historique bash. Ainsi, bien que ce qui précède soit plus que ce que la question demande, il pourrait être utile à certains lecteurs.)

3
m000

Je sais que cela fait longtemps que cette question n’a pas été posée et qu’il n’a pas été répondu, mais je vais vous montrer ma méthode pour nettoyer mon 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 mis en cache à l'intérieur de "${HISTFILE}"
  2. nano "${HISTFILE}": permettez-moi d’éditer "${HISTFILE}" Vous pouvez utiliser un script sed ou quel que soit votre désir de nettoyer votre "${HISTFILE}"
  3. history -c: efface l'historique mis en cache pour que cette dernière commande ne soit pas ajoutée.
  4. exit: me déconnecter en ajoutant l'historique mis en cache ... mais il est vide;)

Après cette commande, vous serez déconnecté avec un fichier d’historique vierge. Connectez-vous pour vérifier votre historique;)

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

2
ncenerar