Demander un mot de passe dans un shell compatible POSIX?


17

Quand je veux demander un mot de passe dans un bashscript, je fais ça:

read -s

... mais quand je cours bashen mode POSIX, avec sh, l' -soption est rejetée:

$ read -s
sh: 1: read: Illegal option -s

Comment demander en toute sécurité une entrée avec une commande compatible POSIX?


1
L'une des manières possibles est décrite dans cette réponse sur SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Réponses:


24
read_password() {
  REPLY="$(
    # always read from the tty even when redirected:
    exec < /dev/tty || exit # || exit only needed for bash

    # save current tty settings:
    tty_settings=$(stty -g) || exit

    # schedule restore of the settings on exit of that subshell
    # or on receiving SIGINT or SIGTERM:
    trap 'stty "$tty_settings"' EXIT INT TERM

    # disable terminal local echo
    stty -echo || exit

    # prompt on tty
    printf "Password: " > /dev/tty

    # read password as one line, record exit status
    IFS= read -r password; ret=$?

    # display a newline to visually acknowledge the entered password
    echo > /dev/tty

    # return the password for $REPLY
    printf '%s\n' "$password"
    exit "$ret"
  )"
}

Notez que pour les shells (mksh) qui printfne sont pas intégrés, le mot de passe apparaîtra en clair dans la pssortie (pendant quelques microsecondes) ou peut apparaître dans certains journaux d'audit si toutes les invocations de commandes avec leurs paramètres sont auditées.


2
Pourrait cat+ heredoc être une alternative plus sûre à la printf?
John Kugelman soutient Monica

1
@JohnKugelman ici, les documents sont écrits sous forme de fichiers temporaires dans la plupart des shells alors que printf est intégré dans la plupart des shells. Je ne sais pas lequel est le meilleur.
Stéphane Chazelas


Merci d'avoir montré comment enregistrer et restaurer les anciens sttyparamètres.
Barmar

20

read -sn'est pas dans POSIX. Si vous voulez être conforme à POSIX, utilisez le stty -echo. sttyet ses echoparamètres sont définis dans POSIX.

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

Cela fonctionnera sur tous les shells conformes à POSIX.

La source


7
pour mettre en évidence un point de la réponse dans le commentaire de @ arkadiusz-drabczyk, ce serait une bonne idée de piéger tous les signaux que vous pouvez afin de les réactiver stty echo- au cas où l'utilisateur serait confus et frapperait control-C pendant la read PASSWORDsection .
Jeff Schaller

lire la réponse liée ou voir la réponse de Stéphane dans ce fil
Jeff Schaller

Vous ne devez pas activer l'écho sans condition, vous devez enregistrer et restaurer l'ancien paramètre. Beaucoup de gens travaillent dans les buffers shell d'Emacs, et cela a normalement désactivé l'écho car Emacs fait l'écho lui-même. L'autre réponse montre comment procéder.
Barmar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.