J'ai un script bash comme le suivant:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Je veux que lorsque l'utilisateur tape le mot de passe sur le terminal, il ne doit pas être affiché (ou quelque chose comme *******) doit être affiché). Comment y parvenir?
*
pendant qu'ils saisissent le mot de passeread
? et d'autres.Réponses:
Fournissez simplement -s à votre appel de lecture comme ceci:
la source
-s
n'affiche rien pendant la saisie de l'entrée. (-s
est une extension non POSIX, donc tous les shells ne la prennent pas en charge, comme leash
shell fourni avec BusyBox; utilisez l'ssty -echo
approche dans de tels shells)man
page ne suggère en fait que-s
la couleur du texte soit la même que la couleur d'arrière-plan. Il "résonne en silence". ss64.com/bash/read.htmlSilent mode. If input is coming from a terminal, characters are not echoed.
Mettre à jour
Au cas où vous voudriez avoir de la fantaisie en produisant un
*
pour chaque caractère qu'ils tapent, vous pouvez faire quelque chose comme ceci (en utilisant laread -s
solution d' andreas ):Sans être fantaisiste
la source
IFS=$'\n'
pour que vous puissiez finir de taper le mot de passe. Sinon sympa; très intelligent.IFS=$'\n'
car le délimiteur par défaut de read est-d $'\n'
. L'instruction if à casser sur une chaîne nulle, qui se produit sur une nouvelle ligne, est ce qui leur permet de terminer le mot de passe.read
un fichier-d ''
. Quand je l'ai réessayé plus tard sous Linux, j'ai utilisé la version republiée. Si j'essaie d'omettre,-d ''
bien sûr, cela fonctionne de manière identique sur FreeBSD! Je suis en fait assez soulagé qu'il n'y ait pas de mystérieuse magie de plate-forme à l'œuvre ici.pour une solution qui fonctionne sans bash ou certaines fonctionnalités que
read
vous pouvez utiliserstty
pour désactiver l'échola source
Voici une variante de l'excellente
*
solution d' impression de @ SiegeXbash
avec prise en charge de l'espace arrière ajouté; cela permet à l'utilisateur de corriger son entrée avec labackspace
clé (delete
clé sur un Mac) , comme cela est généralement pris en charge par les invites de mot de passe:Remarque:
0x7f
: "Dans les systèmes modernes, la touche de retour arrière est souvent mappée au caractère de suppression (0x7f en ASCII ou Unicode)" https://en.wikipedia.org/wiki/Backspace\b \b
est nécessaire pour donner l'apparence de la suppression du caractère à gauche; juste utiliser\b
déplace le curseur vers la gauche, mais laisse le caractère intact ( retour arrière non destructif ). En imprimant un espace et en reculant à nouveau, le caractère semble avoir été effacé (merci, Le caractère d'échappement "retour arrière" '\ b' en C, comportement inattendu? ).Dans un shell POSIX uniquement (par exemple,
sh
sur Debian et Ubuntu, oùsh
estdash
), utilisez l'stty -echo
approche (qui est sous-optimale, car elle n'imprime rien ), car la fonctionread
intégrée ne supportera pas les options-s
et-n
.la source
Un peu différent de (mais surtout comme) la réponse de @ lesmana
simplement: cacher l'écho faites vos trucs montrer l'écho
la source
stty
appel, et une variable de moins sur la pile - ne supprimant que l'écho et ne restaurant que l'écho. Y a-t-il un moyen possible que cela puisse perturber d'autresstty
paramètres? Lesmana's préserve tous les paramètres.Voici une variante de la réponse de @ SiegeX qui fonctionne avec le shell Bourne traditionnel (qui ne prend pas en charge les
+=
affectations).la source
[[ ... ]]
, et sonread
intégré n'aurait pas non plus les options-s
et-n
. Votre code ne fonctionnera donc pas dansdash
, par exemple. (Il fonctionnera sur les plates-formes oùsh
est en faitbash
, comme sur OSX, oùbash
lorsqu'il est invoqué commesh
modifie simplement quelques options par défaut tout en prenant en charge la plupart des bashismes.)[
je suis passé au single, mais je ne peux évidemment pas faire grand chose si vousread
ne disposez pas de ces options.J'aime toujours utiliser les caractères d'échappement Ansi:
8m
rend le texte invisible et0m
réinitialise le texte à «normal». Le -e permet à Ansi de s'échapper.La seule mise en garde est que vous pouvez toujours copier et coller le texte qui s'y trouve, vous ne devriez donc probablement pas l'utiliser si vous voulez vraiment la sécurité.
Il permet simplement aux gens de ne pas consulter vos mots de passe lorsque vous les saisissez. Ne laissez pas votre ordinateur allumé par la suite. :)
REMARQUE:
Ce qui précède est indépendant de la plate-forme tant qu'il prend en charge les séquences d'échappement Ansi.
Cependant, pour une autre solution Unix, vous pourriez simplement dire
read
de ne pas faire écho aux caractères ...la source
la source