Попросити пароль в оболонці, сумісній з 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
Аркадіуш Drabczyk

Відповіді:


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
Might 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.

Джерело


7
щоб виділити крапку з відповіді у коментарі @ arkadiusz-drabczyk, було б непогано зачепити усі сигнали, які ви можете, щоб увімкнути її stty echoназад - у випадку, якщо користувач заплутається і потрапить на контроль-C під час read PASSWORDрозділу .
Джефф Шаллер

прочитайте пов’язану відповідь або подивіться відповідь Стефана в цій темі
Джефф Шаллер

Ви не повинні вмикати відлуння беззастережно, ви повинні зберегти та відновити старі налаштування. Багато людей працюють у буферах оболонок Emacs, і це, як правило, ехо відключено, оскільки Emacs виконує ехо. Інша відповідь показує, як це зробити.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.