J'ai un script qui automatise un processus nécessitant l'accès à un système protégé par mot de passe. Le système est accessible via un programme de ligne de commande qui accepte le mot de passe de l'utilisateur en tant qu'argument.
Je voudrais inviter l'utilisateur à taper son mot de passe, l'assigner à une variable Shell, puis utiliser cette variable pour construire la ligne de commande du programme accédant (qui produira bien sûr une sortie de flux que je traiterai).
Je suis un programmeur Shell assez compétent dans Bourne/Bash, mais je ne sais pas comment accepter la saisie de l'utilisateur sans que l'écho soit renvoyé au terminal (ou peut-être par le biais de caractères '*').
Quelqu'un peut-il aider avec cela?
Voici une autre façon de le faire:
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
Le read -s
désactive l'écho pour vous. Il suffit de remplacer la echo
sur la dernière ligne par la commande à exécuter.
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
Bon mot:
read -s -p "Password: " password
Sous Linux (et cygwin), cette forme fonctionne sous bash et sh. Ce n'est peut-être pas un sh standard Unix, cependant.
Pour plus d'informations et d'options, tapez "aide read" dans bash.
$ help read
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p Prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
...
-p Prompt output the string Prompt without a trailing newline before
attempting to read
...
-s do not echo input coming from a terminal
L'option -s
de read
n'est pas définie dans la norme POSIX. Voir http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Je voulais quelque chose qui fonctionnerait pour n'importe quel shell POSIX, alors j'ai écrit une petite fonction qui utilise stty
pour désactiver echo.
#!/bin/sh
# Read secret string
read_secret()
{
# Disable echo.
stty -echo
# Set up trap to ensure echo is enabled before exiting if the script
# is terminated while echo is disabled.
trap 'stty echo' EXIT
# Read secret.
read "$@"
# Enable echo.
stty echo
trap - EXIT
# Print a newline because the newline entered by the user after
# entering the passcode is not echoed. This ensures that the
# next line of output begins at a new line.
echo
}
Cette fonction se comporte de manière assez similaire à la commande read
. Voici une utilisation simple de read
suivie d'une utilisation similaire de read_secret
. L'entrée dans read_secret
apparaît vide car elle n'a pas été renvoyée au terminal.
[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
Voici un autre qui utilise l'option -r
pour conserver les barres obliques inverses dans l'entrée. Cela fonctionne car la fonction read_secret
définie ci-dessus transmet tous les arguments qu'elle reçoit à la commande read
.
[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
Pour finir, voici un exemple qui montre comment utiliser la fonction read_secret
pour lire un mot de passe de manière compatible avec POSIX.
printf "Password: "
read_secret password
# Do something with $password here ...
J'ai trouvé la commande askpass
utile
password=$(/lib/cryptsetup/askpass "Give a password")
Chaque caractère saisi est remplacé par *. Voir: Donnez un mot de passe ****
Désactivez echo
en utilisant stty
, puis rallumez-le après.
Vous pouvez également demander un mot de passe sans définir de variable dans le shell actuel en procédant comme suit:
$(read -s;echo $REPLY)
Par exemple:
my-command --set password=$(read -sp "Password: ";echo $REPLY)
Vous pouvez ajouter plusieurs de ces valeurs invitées avec un saut de ligne, en procédant comme suit:
my-command --set user=$(read -sp "`echo $'\n '`User: ";echo $REPLY) --set password=$(read -sp "`echo $'\n '`Password: ";echo $REPLY)
Ce lien est une aide pour la définition, * Comment lire le mot de passe d’une utilisation sans le renvoyer au terminal * Comment remplacer chaque caractère par un caractère *.
https://www.tutorialkart.com/bash-Shell-scripting/bash-read-username-and-password/