Pedir uma senha no shell compatível com POSIX?

17

Quando quero pedir uma senha em um script bash , faço isso:

read -s

... mas quando eu executo bash no modo POSIX, com sh , a opção não existe:

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

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

    
por Arno 13.08.2015 / 12:55

2 respostas

20

read -s não está no POSIX. Se você quiser ser compatível com POSIX, use o stty -echo . stty e seu parâmetro echo estão definidos em POSIX.

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

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

Fonte

    
por 13.08.2015 / 13:15
23
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 esses shells (mksh), em que printf não está integrado, a senha aparecerá em ps output (por alguns microssegundos) ou poderá aparecer em alguns logs de auditoria se todas as chamadas de comando com seus parâmetros são auditados.

    
por 13.08.2015 / 15:04