Supprimer le mot de passe saisi dans l'invite de mot de passe masqué (Linux) avec raccourci

106

Est-il possible de supprimer tous les caractères que j'ai entrés dans une invite de mot de passe masqué sous Linux? Par exemple, lorsque je SSH sur un serveur, il me demande mon mot de passe lorsque les clés saisies ne sont pas affichées:

$ ssh root@somehost
root@somehost's password:

Existe-t-il un moyen de supprimer tout le texte saisi sans avoir à appuyer sur la touche Retour arrière pendant une durée indéterminée? Quand je pense avoir entré quelque chose de mal, je veux recommencer et appuyer sur la touche arrière pendant quelques secondes est agaçant. J'ai essayé Esc, CtrlAespérons de sélectionner tout le texte et Home. CtrlCannule toute la commande et je dois renvoyer la commande pour réessayer. C’est presque la solution la meilleure et la plus rapide, mais elle n’est toujours pas satisfaisante. Insert ne fonctionne pas dans mon shell non plus.

bugybunny
la source
7
En ce qui concerne Ctrl + A, dans le terminal, cela signifie généralement "aller au début de la ligne". L'ensemble des clés utilisées dans le terminal (en particulier bash) est souvent plus proche d'Emacs que de Windows.
Score_Under
18
Le ssh en tant que racine est généralement considéré comme une très très mauvaise pratique.
Sam
Pour supprimer des caractères de l'écran, vous devez utiliser des séquences de contrôle du curseur (si votre terminal les prend en charge). En exécutant à sshpartir d'un script, vous pouvez analyser la chaîne de paramètres avant de l'exécuter.
AFH
4
S'il vous plaît prêter attention à ce que @Sam a dit. Vous devez désactiver les connexions root partout. Connectez-vous en tant qu'utilisateur régulier avec un mot de passe compliqué, puis sudevenez root. L'étape suivante consiste à désactiver les schémas d'authentification basés sur mot de passe dans SSH et à utiliser des clés pour la connexion.
Kostix
@ kostix Je suis presque sûr que la première étape consiste à désactiver les mots de passe. Si vous utilisez des mots de passe, avec su et la racine désactivée, il suffit d'entrer le mot de passe que l'attaquant a déjà deviné une seconde fois après la connexion. Vous ne gagnez donc quelque chose que si le nom d'utilisateur est difficile à deviner (ce qui est souvent le cas). je suppose que je n’ai pas de statistiques). Et sans mot de passe, il ajoute un second secret, le mot de passe, mais sa valeur est inférieure à celle de la clé privée, qui est un secret plus long.
Personne

Réponses:

163

Vous pouvez supprimer le mot de passe entier saisi avec Ctrl+ U.

Ipor Sircer
la source
6
Cela fonctionne également à l’invite habituelle du terminal!
MoonRunestar
35
Pour référence, il s'agit de la liaison de clé par défaut dans le "mode emacs" de readline unix-line-discard, décrite comme "Tue en arrière depuis le curseur jusqu'au début de la ligne en cours". Ref: cnswww.cns.cwru.edu/php/chet/readline/rluserman.html#SEC17 GNU readline est la bibliothèque d’entrée utilisée par la plupart des shells et de nombreux autres programmes interactifs (mais elle n’est pas intégrée au tty, elle ne travailler partout ).
IMSoP
22
@IMSoP Cependant, Ctrl-U est lui-même intégré dans le tty (en tant que caractère par défaut de la stty killfonction), raison pour laquelle il fonctionne avec l'invite de mot de passe ssh.
Random832
5
BTW, Ctrl + K est l’équivalent pour supprimer du curseur jusqu’à la fin de la ligne.
wjandrea
2
@DennisJaheruddin: Ce n'est pas possible, ssh n'utilise pas readline pour l'édition en ligne. Voir ma réponse.
Peter Cordes
14

Contrairement à bash, sshl'invite de mot de passe n'utilise pas de bibliothèque spéciale d'entrée de terminal comme readline. Les fonctions de modification de ligne ne sont que les caractéristiques de base de modification de ligne POSIX TTY.

Vous avez donc un TTY POSIX en mode "cuit" (non brut), aussi appelé mode canonique, et la seule modification de ligne disponible est celle fournie par le noyau. Vous voyez stty(1)et remarquez ça
kill = ^U. C'est également à cet endroit que le caractère de retour arrière est défini ( erase = ^?). Word-erase ( ^W) est pratique lorsque vous ne tapez pas à l'aveugle.

lnext = ^V signifie que vous pouvez taper control-v puis n'importe quoi (y compris control-c) pour obtenir un controlal-c littéral.

Pour déboguer ce que vous essayiez de faire à l'aveuglette, exécutez catou cat > /dev/nulldans votre terminal . Tapez des choses, puis voyez ce qui fonctionne et ce qui ne le modifie pas.


readline(utilisé par bash) lit le caractère brut et effectue la modification de ligne dans l’espace utilisateur. Ses liaisons par défaut sont compatibles avec les caractères de contrôle TTY par défaut pour le sous-ensemble de fonctions d’édition qu’elles fournissent toutes les deux.

readline va bien au-delà de la simple édition de ligne d’un ATS simple. (Par exemple, un téléscripteur ne peut supprimer que des caractères à la fin de la ligne, il n'y a donc pas de flèche ^aet delete/ ou flèche gauche / droite)

Lorsqu'il bashexécute une commande au premier plan, il met d'abord le téléscripteur en mode canonique (car c'est la valeur par défaut). Donc, courir stty -a(sans redirection) verra toujours son propre terminal en mode canonique. Mais si vous redirigez les entrées d'un autre TTY sur lequel il bashtourne, vous pouvez voir quels paramètres du terminal bash + readline ont été appliqués. par exemple stty -a < /dev/pts/12montre -icanonpour le mode brut parce que j'ai un en bashcours d'exécution sur ce terminal. (Je suis passé à un autre onglet et ai couru tty, puis utilisé ce chemin de fichier de périphérique à partir du premier terminal). Si je courais catdans cet autre terminal, je verrais icanonpour le mode canonique.

Connexes: le téléscripteur démystifié

https://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html

https://en.wikipedia.org/wiki/POSIX_terminal_interface

Peter Cordes
la source
En fait, vous pouvez simplement taper 'stty' pour voir tous les paramètres actuels. Utiliser 'stty rows ##' ou 'stty cols ##' vous permettra de changer à la volée le nombre de lignes ou de colonnes disponibles dans la fenêtre du terminal. Ce qui est particulièrement utile lorsque vous travaillez dans une fenêtre dans une fenêtre à travers quelque chose comme VNC, qui ne permet pas nécessairement de déterminer la taille de votre fenêtre extérieure correctement. Vous pouvez définir votre zone active comme étant plus petite que la fenêtre dans laquelle elle se trouve et ainsi ne pas avoir à faire défiler la liste. Permettre à VI et à d'autres choses de continuer à fonctionner correctement. Il peut également remapper les espaces arrière et les supprimer à la volée.
Rowan Hawkins
@RowanHawkins: mon dernier paragraphe a été mal édité. Correction maintenant. J'essayais de faire comprendre qu'en redirigeant depuis un autre terminal, vous pouvez voir les sttyparamètres / ioctl que bash + readline a eux-mêmes appliqués en mode brut. (Et le fait que ce soit en mode brut, où la plupart des caractères spéciaux ne s'appliquent pas)
Peter Cordes