Запросить пароль в POSIX-совместимой оболочке?

17

Когда я хочу попросить пароль в bashскрипте, я делаю это:

read -s

... но когда я работаю bashв режиме POSIX sh, -sопция отклоняется:

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

Как безопасно запросить ввод с помощью POSIX-совместимой команды?

Привет
источник
1
Один из возможных способов описан в этом ответе на SO: stackoverflow.com/a/28393320/3691891
Аркадиуш Драбчик,

Ответы:

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

Обратите внимание, что для тех оболочек (mksh), которые printfне являются встроенными, пароль будет отображаться в psвыходных данных в открытом виде (в течение нескольких микросекунд) или может отображаться в некоторых журналах аудита, если проверяются все вызовы команд с их параметрами.

Стефан Шазелас
источник
2
Может ли cat+ heredoc быть более безопасной альтернативой printf?
Джон Кугельман поддерживает Монику
1
@JohnKugelman здесь документы пишутся как временные файлы в большинстве оболочек, в то время как printf встроен в большинство оболочек. Я не уверен, что лучше.
Стефан Шазелас
Спасибо за показ, как сохранить и восстановить старые sttyнастройки.
Бармар
20

read -sне в POSIX. Если вы хотите быть POSIX-совместимым, используйте stty -echo. sttyи его echoпараметр определены в POSIX.

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

Это будет работать на всех оболочках, которые соответствуют POSIX.

Источник

serenesat
источник
7
чтобы выделить точку из ответа в комментарии @ arkadiusz-drabczyk, было бы неплохо перехватить все сигналы, которые вы можете включить, чтобы включить stty echoего - на случай, если пользователь запутается и нажмет control-C во время read PASSWORDраздела ,
Джефф Шаллер
прочитайте связанный ответ или посмотрите ответ Стефана в этой теме
Джефф Шаллер
Вы не должны включать эхо безоговорочно, вы должны сохранить и восстановить старые настройки. Многие люди работают в буферах оболочки Emacs, и это обычно отключает эхо, потому что Emacs делает эхо самостоятельно. Другой ответ показывает, как это сделать.
Бармар