Solicitar uma senha no shell compatível com POSIX?

17

Quando quero solicitar uma senha em um bashscript, faço o seguinte:

read -s

... mas quando executo bashno modo POSIX, com sh, a -sopção é rejeitada:

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

Como solicito com segurança uma entrada com um comando compatível com POSIX?

Elzo
fonte
1
Uma das formas possíveis é descrita nesta resposta em SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Respostas:

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

Observe que, para os shells (mksh) onde printfnão está embutido, a senha aparecerá clara na pssaída (por alguns microssegundos) ou poderá aparecer em alguns logs de auditoria se todas as chamadas de comando com seus parâmetros forem auditadas.

Stéphane Chazelas
fonte
2
O catheredoc pode ser uma alternativa mais segura ao printf?
John Kugelman apoia Monica
1
@JohnKugelman aqui os documentos são escritos como arquivos temporários na maioria dos shells, enquanto printf é construído na maioria dos shells. Não sei ao certo qual é o melhor.
Stéphane Chazelas
Obrigado por mostrar como salvar e restaurar as sttyconfigurações antigas .
Barmar
20

read -snão está no POSIX. Se você deseja ser compatível com POSIX, use o stty -echo. sttye seu echoparâmetro são definidos no POSIX.

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

Isso funcionará em todos os shells que estejam em conformidade com o POSIX.

Fonte

serenesat
fonte
7
para destacar um ponto da resposta no comentário de @ arkadiusz-drabczyk, seria uma boa ideia capturar todos os sinais possíveis para ligar stty echonovamente - caso o usuário fique confuso e pressione Control-C durante a read PASSWORDseção .
Jeff Schaller
leia a resposta vinculada ou veja a resposta de Stephane neste tópico
Jeff Schaller
Você não deve ativar o eco incondicionalmente, salve e restaure a configuração antiga. Muitas pessoas trabalham nos buffers de shell do Emacs, e isso normalmente tem eco desativado porque o Emacs está fazendo o eco em si. A outra resposta mostra como fazer isso.
Barmar