web-dev-qa-db-fra.com

Comment obtenir un mot de passe d'un script shell sans écho

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?

328
BD at Rivenhill

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.

494
wsware
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
162
thecloud

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
70
smendola

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 ...
44
Susam Pal

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 ****

9
Manuel

Désactivez echo en utilisant stty , puis rallumez-le après.

3

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)
0
Pascal Chardon

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/

0
Hassan Farid