Pedir una contraseña en shell POSIX?

17

Cuando quiero pedir una contraseña en un bashscript, hago eso:

read -s

... pero cuando corro bashen modo POSIX, con sh, la -sopción es rechazada:

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

¿Cómo me pregunto segura para una entrada con un comando POSIX?

Oye
fuente
1
Una de las formas posibles se describe en esta respuesta en SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Respuestas:

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"
  )"
}

Tenga en cuenta que para esas conchas (mksh), donde printfno se BuiltIn, la contraseña aparecerá en claro en la pssalida (por unos pocos microsegundos) o puede aparecer en algunos registros de auditoría si se auditan todas las invocaciones de comando con sus parámetros.

Stéphane Chazelas
fuente
2
Podría cat+ heredoc ser una alternativa más segura a la printf?
John Kugelman apoya a Monica el
1
Aquí @JohnKugelman documentos están escritos como archivos temporales en la mayoría de los depósitos, mientras que printf se construye en la mayoría de las cáscaras. No estoy seguro de cuál es el mejor.
Stéphane Chazelas
Gracias por mostrar cómo guardar y restaurar los antiguos sttyajustes.
Barmar
20

read -sno está en POSIX. Si desea ser compatible con POSIX, use stty -echo. sttyy su echoparámetro se definen en POSIX.

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

Esto funcionará en todos los shells que se ajusten a POSIX.

Fuente

serenesat
fuente
77
Para resaltar un punto de la respuesta en el comentario de @ arkadiusz-drabczyk, sería una buena idea atrapar todas las señales que pueda para volver a encenderlas stty echo, en caso de que el usuario se confunda y presione Control-C durante la read PASSWORDsección .
Jeff Schaller
leer la respuesta vinculado o ver la respuesta de Stéphane en este hilo
Jeff Schaller
Usted no debe active el eco sin condiciones, debe guardar y restaurar la configuración anterior. Mucha gente trabaja en los buffers de shell de Emacs, y esto normalmente tiene el eco deshabilitado porque Emacs está haciendo el eco por sí mismo. La otra muestra de respuestas cómo hacer esto.
Barmar