J'ai accidentellement tapé le mot de passe en ligne de commande bash

189

J'ai accidentellement tapé mon mot de passe dans la ligne de commande bash, en prenant la Last login: ...ligne pour Wrong password(j'étais pressé). Que dois-je faire pour recouvrir ma trace?

Ce que j’ai fait, c’est l’édition .bash_historyet la suppression de la ligne incriminée (je dois me reconnecter une fois pour que le mot de passe apparaisse dans le fichier afin que je puisse le supprimer, puis de nouveau pour le voir disparaître de l’historique disponible sous la touche UPARROW).

Y a-t-il un autre endroit où l'historique des commandes pourrait être sauvegardé? Le système est CentOS 6.5.

MaDa
la source
59
Il suffit de changer le mot de passe :)
gronostaj
96
Changer le mot de passe n’est pas si simple… Il faudrait que je demande à l’administrateur de réinstaller ma nouvelle clé publique sur 15 serveurs différents - et le type est comme /dev/null.
MaDa
71
Si vous ne pouvez pas changer votre mot de passe facilement à tout moment, vous risquez d'avoir une grave faille dans la sécurité. Que ferez-vous quand quelqu'un aura votre mot de passe? Avez-vous un moyen de révoquer immédiatement l'accès au système?
gronostaj
42
Vous pouvez modifier le mot de passe d'une clé ssh sans changer la clé: ssh-keygen -f id_rsa -p.
Jwg
6
J'arrive juste pour mentionner que, du moins sous les connexions Windows en réseau, vous êtes fatigué. La valeur par défaut de l’administrateur (dans certaines hautes tours de serveur) consiste à enregistrer toutes les tentatives de connexion. Bien entendu, les noms d’utilisateur sont en clair. Tout ce qu’une personne entreprenante doit faire est de rechercher des chaînes non identifiantes et de les corréler avec le prochain identifiant valide (ou la prochaine tentative de connexion sur le même ordinateur). Et il n'y a pas de moyen simple de supprimer ce fichier journal d'administrateur. Alors tu dois vraiment changer ton mot de passe.
Carl Witthoft

Réponses:

184

Vous pouvez supprimer uniquement la ligne incriminée de bashl'historique de, au lieu d'effacer tout l'historique. Supprimez simplement la ligne avec le -ddrapeau, puis sauvegardez (écrivez) le nouvel historique avec le -wdrapeau:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
la source
1
Sachez que cela ne fonctionne pas si vous avez défini "PROMPT_COMMAND = history -a". Avec ceci en place, la commande avec votre mot de passe est immédiatement écrite dans votre .bash_history lorsque l’invite est affichée après la fin de la commande. Vous devrez éditer votre .bash_history pour le supprimer.
benrifkah
1
Notez également que si la ligne a été écrite dans le fichier d’hébergement et que plusieurs coques (fenêtres de terminal) ont été ouvertes, TOUS ces coques l’auront dans l’histoire! Vous devrez soit le retirer de toutes ces coquilles, soit au moins de la dernière coquille que vous fermez! Mieux vaut l’obtenir avant que le shell qui l’utilise n’existe. L’histoire s’agissant de plusieurs coquillages peut devenir un cauchemar.
anthony
121

Il y a deux parties à ceci:

  • bashstocke l'historique dans un fichier ~/.bash_historyqui est, par défaut, écrit à la fin de la session
  • le historyqui est gardé en mémoire

Pour être en sécurité, vous devez l'effacer de la session:

history -c

et tronquer le fichier d'historique selon les besoins:

> ~/.bash_history

Si votre session dans laquelle vous avez saisi le mot de passe est toujours ouverte, une autre façon de couvrir votre trace consiste à définir la HISTFILEvariable sur le périphérique null afin que l'historique ne soit pas écrit à la ~/.bash_historyfermeture de la session:

export HISTFILE=/dev/null
devnull
la source
205
Hé, c'est l'administrateur!
Raystafarian le
5
Pun non prévu, désolé :) Je ne regardais pas votre pseudo lorsque j'écrivais mon commentaire.
MaDa
7
Pour être paranoïaque (et pourtant, pour une raison quelconque, ne changez pas votre mot de passe), ne devez shred- vous pas remplacer le fichier ou le remplacer de nombreuses fois?
kojiro
1
@MaDa Pas de problème. J'ai même ajouté un autre moyen dans la réponse pour apporter mon pseudo à l'image.
devnull
5
Le réglage HISTFILE=est suffisant. De bash(1): Si non défini, l'historique des commandes n'est pas enregistré lorsqu'un shell se ferme.
Lekensteyn
23

Puisque bash (du moins toutes les versions historiques et actuelles dont je suis au courant) n'enregistre pas automatiquement l'historique tant que vous n'avez pas quitté, une stratégie généralement applicable lorsque vous avez saisi une commande que vous souhaitez vous assurer de ne jamais enregistrer est de taper immédiatement:

kill -9 $$

Cela tue le shell avec SIGKILL, ce qui ne peut pas être attrapé, donc le shell n'a aucun moyen de sauvegarder quoi que ce soit à la sortie.

La plupart des autres approches impliquent un nettoyage après coup (c'est-à-dire après que les données ont déjà été gravées sur le disque), ce qui a beaucoup plus de chances d'erreur (copie manquante), en particulier si le système utilise peut-être btrfs ou similaire.

R ..
la source
2
+1, pas seulement plus de risques d'erreur, il peut même être récupéré si / combien de commandes ont été exécutées par la suite
Cruncher
Manquer le mot "automatiquement"? Parce que dotancohen a montré un moyen de sauvegarder l'historique sans quitter le shell.
Ben Voigt le
3
Le shell peut être configuré pour sauvegarder l'historique après chaque commande exécutée, et non à la sortie.
Nick Matteo
1
+1 C'est exactement ce que je voulais recommander! En plus rm ~/.bash_history~de supprimer le fichier de sauvegarde dans le cas de l'OP quand il a déjà été sauvegardé
Tomas
Sachez que cela ne fonctionne pas si vous avez défini "PROMPT_COMMAND = history -a". Avec ceci en place, la commande avec votre mot de passe est immédiatement écrite dans votre .bash_history lorsque l’invite est affichée après la fin de la commande. Vous devrez éditer votre .bash_history pour le supprimer.
benrifkah
11

Après avoir accidentellement saisi quelque chose que vous ne vouliez pas stocker dans l'historique, vous pouvez taper: unset HISTFILE

Bash ne saura pas où stocker l'historique lorsque vous vous déconnectez. Par conséquent, cela désactivera la journalisation de l'historique pour toute la session.

mtak
la source
Sachez que cela ne fonctionne pas si vous avez défini "PROMPT_COMMAND = history -a". Avec ceci en place, la commande avec votre mot de passe est immédiatement écrite dans votre .bash_history lorsque l’invite est affichée après la fin de la commande. Vous devrez éditer votre .bash_history pour le supprimer.
benrifkah
11

Mon astuce préférée pour cela est de frapper la flèche vers le haut, de revenir en arrière sur la commande, de taper quelque chose (ce n’est peut-être pas nécessaire), de frapper la flèche vers le bas, de taper "ls", et d’appuyer sur Entrée. Se sent vraiment hokey, mais cela fonctionne réellement. J'ai découvert cela quand je me suis énervé après avoir édité la mauvaise commande de mon historique, puis en la ruinant en ne tapant pas sur ctrl-c pour abandonner l'édition. J'imagine que bash soutient l'histoire révisionniste. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Ressemble à:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 
Mark Jerde
la source
C'est bizarre . Un inconvénient est qu'il semble savoir que vous avez modifié l'historique. Il pourrait donc être possible de restaurer l'ancienne version.
MadTux
@MadTux - Totalement, mais le .bash_history est juste un fichier texte brut. Ainsi, vous pouvez faire l’exemple ci-dessus, quitter et vous reconnecter. Lorsque vous affichez l'intégralité du contenu du fichier .bash_history, il n'y a rien qui le différencie de si vous veniez d'exécuter "cd", la trace est donc propre.
Mark Jerde
Sachez que cela ne fonctionne pas si vous avez défini "PROMPT_COMMAND = history -a". Avec ceci en place, la commande avec votre mot de passe est immédiatement écrite dans votre .bash_history lorsque l’invite est affichée après la fin de la commande. Vous devrez éditer votre .bash_history pour le supprimer.
benrifkah
10

En plus des autres réponses, il peut être pertinent que le mot de passe se trouve également dans la mémoire tampon de défilement du terminal - l’historique du texte affiché - maintenant, et, ce qui est un problème, éventuellement sur le disque dur, si l’émulateur de terminal a sauvegardé le fichier. l'histoire sur le disque. Cela se produit dans KDE si la taille de l'historique est définie sur "scrollback illimité", afin de ne jamais ignorer aucune sortie.

Volker Siegel
la source
6

Avec $<space> command, une commande n'est pas ajoutée à l'historique, parfois utile

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
la source
2
Bien qu'intéressant, son utilité dans le scénario décrit n'est pas claire. Suggérez-vous que chaque mot de passe devrait commencer par un espace?
Ben Voigt le
1
Non, ce qu’il suggère, c’est qu’une fois en place, chaque ligne que vous tapez que vous ne voulez pas conserver dans l’historique doit être dactylographiée avec un espace de début. Par exemple: "ls" devient "ls" et cette ligne n'apparaît jamais dans l'historique ou dans la liste des flèches vers le haut de vos sessions.
Bryan C.
4
Notez que cette astuce d'espace-espace ne fonctionne que si $ HISTCONTROL contient un espace ignores.
Bernd Jendrissek
2
@ jris198944 La fourniture d'un mot de passe via un argument de ligne de commande peut potentiellement l'exposer à quiconque s'exécute sur le système ps.
jamesdlin
2
Quoi qu'il en soit, bien que cette astuce soit utile si vous planifiez à l'avance, cela n'aide pas le scénario d'origine dans lequel une personne a accidentellement saisi un mot de passe sur une ligne de commande.
jamesdlin
4

Une autre alternative pour éviter de sauvegarder dans le fichier d’historique (avant de vous déconnecter) est tout simplement de:

chmod 400 ~/.bash_history 

et puis déconnectez-vous. Arrêtez l’écriture de l’historique dans le fichier (car le fichier est en lecture seule) afin que toute la session bash soit ignorée et l’ancien historique conservé.

Connectez-vous à nouveau et réinitialisez les autorisations sur 600(ou non, selon votre paranoïa!).

Adam
la source
1

Je vois à plusieurs reprises mentionné

Sachez que cela ne fonctionne pas si vous avez défini "PROMPT_COMMAND = history -a" [..] Vous devrez éditer votre .bash_history pour le supprimer.

La première partie est certainement vraie, mais vous ne devez pas recourir à l'édition manuelle de .bash_history pour résoudre ce problème. Si vous combinez les deux commandes sur une ligne, cela fonctionne parfaitement:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Floris Kruisselbrink
la source
Pourriez-vous expliquer ce qui fait fonctionner cette méthode?
Kamil Maciorowski
PROMPT_COMMAND est uniquement exécuté avant l'affichage de la prochaine invite de commande. Le problème avec la saisie des commandes -d et -w sur des lignes distinctes est que PROMPT_COMMAND exécutera la commande history -a entre les deux. Si vous exécutez à la fois les commandes -d et -w sur une ligne de commande, celle-ci ne sera
exécutée
0

Beaucoup de réponses ici tentent de supprimer la commande en question de l'historique de la session curr not bas avant de l'écrire $HISTFILE(~ / .bash_history par défaut). Cependant, si vous avez défini PROMPT_COMMAND=history -a la commande avec votre mot de passe, celle-ci est immédiatement écrite $HISTFILElorsque l'invite s'affiche une fois la commande terminée. Vous devrez éditer votre $HISTFILEpour le supprimer.

Ce paramètre est couramment utilisé pour entrelacer les commandes de plusieurs sessions bash ouvertes .

benrifkah
la source
-3

Vous voudrez également vérifier les journaux de Syslog. Les connexions non valides seront généralement connectées à syslog.

/ var / log / messages ou l’équivalent pour votre système d’exploitation.

bcarroll
la source
1
Le problème n’est pas qu’il ait entré un mauvais mot de passe, il était déjà connecté, a entré son mot de passe dans l’invite et a appuyé sur Entrée. Cela n'apparaîtra pas dans le fichier de messages.
MaQleod