Richiedere una password nella shell conforme a POSIX?


17

Quando voglio chiedere una password in uno bashscript, lo faccio:

read -s

... ma quando corro bashin modalità POSIX, con sh, l' -sopzione è respinta:

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

Come posso richiedere in modo sicuro un input con un comando conforme a POSIX?


1
Uno dei modi possibili è descritta in questa risposta su SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Risposte:


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

Si noti che per quelle shell (mksh) in cui printfnon è incorporato, la password apparirà in chiaro psnell'output (per alcuni microsecondi) o potrebbe apparire in alcuni registri di controllo se tutte le invocazioni di comandi con i loro parametri sono controllate.


2
cat+ Heredoc potrebbe essere un'alternativa più sicura a printf?
John Kugelman sostiene Monica il

1
@JohnKugelman qui i documenti sono scritti come file temporanei nella maggior parte delle shell mentre printf è integrato nella maggior parte delle shell. Non sono sicuro di quale sia il migliore.
Stéphane Chazelas,


Grazie per aver mostrato come salvare e ripristinare le vecchie sttyimpostazioni.
Barmar,

20

read -snon è in POSIX. Se si desidera essere conformi a POSIX, utilizzare il stty -echo. sttye i suoi echoparametri sono definiti in POSIX.

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

Questo funzionerà su tutte le shell conformi a POSIX.

fonte


7
per evidenziare un punto della risposta nel commento di @ arkadiusz-drabczyk, sarebbe una buona idea intrappolare tutti i segnali che puoi per riattivare stty echo- nel caso in cui l'utente venga confuso e colpisca control-C durante la read PASSWORDsezione .
Jeff Schaller

leggi la risposta collegata o vedi la risposta di Stephane in questa discussione
Jeff Schaller

Non attivare l'eco incondizionatamente, è necessario salvare e ripristinare la vecchia impostazione. Molte persone lavorano nei buffer della shell di Emacs e questo ha normalmente l'eco disabilitato perché Emacs sta facendo l'eco stesso. L'altra risposta mostra come farlo.
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.