Réponses:
Vous devez vous déconnecter et vous reconnecter ou exécuter history -a
pour que l'historique actuel soit enregistré sur le disque.
Ensuite, éditez simplement le fichier ~/.bash_history
.
vim ~/.bash_history
) avec un espace; les commandes commençant par un espace ne sont généralement pas enregistrées (voir $HISTCONTROL
).
Vous pouvez supprimer le fichier d'historique à l'aide de la ligne de commande en deux étapes:
history -d <line_number>
supprime une ligne spécifiée de l'historique en mémoire.history -w
écrit l'historique actuel en mémoire dans le ~/.bash_history
fichier.Les deux étapes combinées suppriment la ligne de façon permanente de l' historique en mémoire et du fichier .bash_history .
history -w
de l'historique?
<line_number>
juste history | grep [unwanted_content]
pour obtenir une liste avec toutes les lignes contenant [unwanted_content]
(comme les mots de passe).
Pour éviter qu'une commande ne soit 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 (add eg to .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
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 dans votre historique, il est préférable de l'empêcher d'entrer dans l'historique en premier lieu. Assurez-vous que cela $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 souhaitez pas que l' historique de votre session actuelle accède au 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 proviennent d'une session précédente, elles auront déjà été ajoutées à la $HISTFILE
sortie. L'histoire avec la manipulation des commandes ci - dessus encore que append les autres nouveaux éléments à la $HISTFILE
, à la sortie . Pour écraser la vue $HISTFILE
avec la vue de la session en cours de tout l' historique, tapez maintenant :
(bash)$ history -w
Bien sûr, pour les éléments d’historique déjà présents sur le disque, l’alternative à l’édition de l’historique avec les history -d
commandes history -w
, est l’édition $HISTFILE
avec un éditeur de texte.
$HISTFILE
, à la sortie . » En fait, ce n'est pas tout à fait vrai. Il semble ajouter uniquement les nouveaux éléments restants qui "ressortent" de la longueur de l'historique d'origine. Par exemple, si je supprime 5 éléments originaux et en ajoute 15 nouveaux, seules les 10 dernières nouvelles sont ajoutées, alors que je m'attendrais à ce que les 15 nouveaux soient ajoutés. Je pense que c'est un bug parce que je ne vois pas en quoi cette fonctionnalité est toujours souhaitable.
Plusieurs techniques:
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:
Forcer la sortie de la session en cours sans sauvegarder l'historique:
kill -9 $$
Cela supprimera toute l'histoire actuelle.
Tapez ↑ (up arrow)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+ Wpour supprimer les informations sensibles, puis ↓ (down arrow) jusqu'à ce qu'une nouvelle ligne vide soit affichée avant de taper Enter.
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 sed
commande 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
Cela 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'historique. Ensuite sed
, vous utiliserez 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 une ou plusieurs barres obliques, vous devez les échapper avec des barres obliques inverses ou modifiez la sed
commande 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.
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 root .
. Remarque: même si cette commande utilise xargs -0
, elle ne gérera pas les fichiers contenant des nouvelles lignes dans leurs noms.
Recherchez la ligne que vous souhaitez supprimer en appuyant ↑ (up arrow)jusqu'à ce qu'elle apparaisse, puis appuyez sur Ctrl+ U. Cela devrait supprimer la ligne.
Si vous utilisez la history
commande, vous pouvez voir que la ligne a été remplacée par un astérisque.
*
.
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))
history | grep <string>
montre toujours toutes les lignes qu'il prétendait supprimer ...
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
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 les 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 série de commandes de l'historique bash. Ainsi, bien que ce qui précède dépasse le contenu de la question, il pourrait être utile à certains lecteurs.)
for
déclaration: for n in $(seq "$2" "$1")
est stylistiquement préféré par certains, et, si seq
cela ne fonctionne pas, essayez for ((n="$2"; n>="$1"; n--))
.
Essayez juste ceux-ci,
$ history
ceci affichera l'identifiant 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 java bienvenue
.
.
Je sais que cela fait longtemps que cette question n’a pas été posée et qu’il n’ya pas eu de réponse, mais je vais vous montrer ma méthode pour nettoyer mon historique et me déconnecter en même temps.
Je cours :
history -w && nano "${HISTFILE}" && history -c && exit
Ce qu'il fait est simple:
history -w
: écrit l'historique en cache à l'intérieur "${HISTFILE}"
nano "${HISTFILE}"
: permettez-moi d’éditer "${HISTFILE}"
Vous pouvez utiliser un script sed ou ce que vous voulez pour nettoyer votre"${HISTFILE}"
history -c
: efface l'historique en cache pour que cette dernière commande ne soit pas ajoutée.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.