2010-10-20 24 views
243

J'ai un script qui automatise un processus nécessitant un 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 demander à l'utilisateur de taper son mot de passe, l'assigner à une variable shell, puis utiliser cette variable pour construire la ligne de commande du programme d'accès (qui produira bien sûr la sortie du flux que je vais traiter)). Je suis un programmeur shell raisonnablement compétent dans Bourne/Bash, mais je ne sais pas comment accepter l'entrée de l'utilisateur sans l'avoir renvoyé au terminal (ou peut-être l'avoir en écho en utilisant les caractères '*').Comment obtenir un mot de passe à partir d'un script shell sans écho

Quelqu'un peut-il vous aider?

+1

duplication possible de [Comment faire bash script demander un mot de passe?] (Http://stackoverflow.com/questions/2654009/how-to-make-bash-script -ask-for-a-password) –

Répondre

373

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 s'éteindra d'écho pour vous. Il suffit de remplacer le echo sur la dernière ligne avec la commande que vous souhaitez exécuter.

+56

Certains shells vous permettent de spécifier l'invite pour le ' read' commande: 'read -s -p" Mot de passe: "password' –

+5

Je préfère nettement 'read -s -p', merci beaucoup pour la simplification de mes scripts. –

+25

Veuillez noter que 'read -s' n'est pas dans POSIX, votre script dépend de bash si vous l'utilisez. Si vous voulez être compatible avec POSIX, vous devriez plutôt utiliser la solution 'stty -echo' proposée ci-dessous, car' stty' et son paramètre 'echo' sont définis dans POSIX. – scy

3

Désactivez echo en utilisant stty, puis de nouveau après.

124
#!/bin/bash 
stty -echo 
printf "Password: " 
read PASSWORD 
stty echo 
printf "\n" 
+0

@RichardRiley - en supposant que vous voulez dire "lire -s MOT DE PASSE" ici, est-ce correct? –

+0

A l'origine accepté comme la meilleure solution, et utilisé dans le script que j'écrivais, mais "read -s -p" mot de passe: "PASSWORD" semble beaucoup plus simple. –

+38

Non, vraiment, _do_ utilise 'stty' si vous voulez être compatible POSIX. Le code de cette réponse s'exécute parfaitement même pas sur bash, mais en fait sur tous les shells conformes à POSIX. – scy

57

Une doublure:

read -s -p "Password: " password 

Sous Linux (et Cygwin) cette forme fonctionne en bash et sh. Ce n'est peut-être pas un sh Unix standard.

Pour plus d'informations et d'options, dans bash, tapez "help read".

$ 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 
+1

Si la commande génère "read: Option illégale -s" cela signifie que le script doit être exécuté directement (./script vs sh ./script) ... voir http://stackoverflow.com/questions/30554353/linux- illegal-option-read-a –

-4
echo yourpassword | passwd --stdin youruser 
33

L'option -s de read n'est pas défini 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, j'ai donc écrit une petite fonction qui utilise stty pour désactiver l'écho.

#!/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 "[email protected]" 

    # 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 assez similaire à la commande read. Voici une utilisation simple de read suivie d'une utilisation similaire de read_secret. L'entrée à read_secret apparaît vide car elle n'a pas été répercutée sur le terminal.

[[email protected] ~]$ read a b c 
foo \bar baz \qux 
[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=bar c=baz qux 
[[email protected] ~]$ unset a b c 
[[email protected] ~]$ read_secret a b c 

[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=bar c=baz qux 
[[email protected] ~]$ unset a b c 

Voici une autre qui utilise l'option -r pour préserver les antislashs dans l'entrée. Cela fonctionne car la fonction read_secret définie ci-dessus transmet tous les arguments qu'il reçoit à la commande read.

[[email protected] ~]$ read -r a b c 
foo \bar baz \qux 
[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=\bar c=baz \qux 
[[email protected] ~]$ unset a b c 
[[email protected] ~]$ read_secret -r a b c 

[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=\bar c=baz \qux 
[[email protected] ~]$ unset a b c 

Enfin, voici un exemple qui montre comment utiliser la fonction read_secret pour lire un mot de passe d'une manière conforme aux spécifications POSIX.

printf "Password: " 
read_secret password 
# Do something with $password here ... 
+3

Devrait probablement s'assurer que echo n'est pas déjà désactivé dans le shell et ne pas l'activer si ce n'était pas avant ... Peut-être utiliser 'oldtty = stty -g' et ensuite à la fin' stty $ oldtty' pour restaurer les paramètres précédents. Sinon, c'est génial. – Perkins

-3

Tout d'abord, si quelqu'un va stocker un mot de passe dans un fichier. Je m'assurerais que c'est haché. Ce n'est pas la meilleure sécurité mais au moins ce ne sera pas en clair.

  1. d'abord créer le mot de passe et de hachage il:

    echo "password123" | md5sum | couper -d '-' -f 1>/tmp/secret

  2. Maintenant, créez votre programme pour utiliser le hachage, dans ce cas, ce petit programme reçoit l'entrée de l'utilisateur pour un mot de passe sans écho, puis le convertit en hachage à être comparé avec le hachage stocké. Si elle correspond alors hachage stockée l'accès est accordé:

    #/bin/bash

    PASSWORD_FILE="/tmp/secret" 
    MD5_HASH=$(cat /tmp/secret) 
    PASSWORD_WRONG=1 
    
    
    while [ $PASSWORD_WRONG -eq 1 ] 
    do 
        echo "Enter your password:" 
        read -s ENTERED_PASSWORD 
        if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then 
         echo "Access Deniend: Incorrenct password!. Try again" 
        else 
         echo "Access Granted" 
         PASSWORD_WRONG=0 
        fi 
    done 
    
+1

Je suggère de garder le caractère de nouvelle ligne '\ n' résultant de la commande' echo' loin du hachage en utilisant 'echo -n' à la place, puisque' \ n' ne fait pas vraiment partie du mot de passe fourni - bien sûr pour la création de '/ tmp/secret' et la comparaison qui suit dans votre exemple. –

2

je trouve être le commandement askpass utile

password=$(/lib/cryptsetup/askpass "Give a password") 

Chaque caractère d'entrée est remplacé par *. Voir: Donnez un mot de passe ****

+0

D'où vient ce '/ lib/cryptsetup/askpass'? Ce n'est certainement pas un outil standard * nix (ou GNU/Linux). –

+0

C'est la meilleure solution que j'ai vu jusqu'ici.C'est à partir de cryptsetup qui est la norme pour le cryptage des disques durs, si couramment utilisé. 'sudo apt-get install cryptsetup'. –

+0

J'ai essayé d'utiliser ceci et les étoiles ne sont pas apparues, en plus cela a gâché mon terminal jusqu'à ce que je le ferme. Toute autre entrée de shell est cachée! – Jeff