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

printf組み込みではないシェル(mksh)の場合、パスワードがps出力にクリアに表示される(数マイクロ秒)か、パラメーターを使用したすべてのコマンド呼び出しが監査されると、一部の監査ログに表示される場合があります。


2
かもしれないcat+ヒアドキュメントは、より安全な代替ことprintf
ジョンクーゲルマンはモニカをサポートします

1
ここの@JohnKugelmanのドキュメントは、ほとんどのシェルで一時ファイルとして記述されていますが、printfはほとんどのシェルで構築されています。どちらが最適かわかりません。
ステファンシャゼル


古いstty設定を保存および復元する方法を示してくれてありがとう。
バーマー

20

read -sPOSIXにはありません。POSIX準拠にしたい場合は、を使用してくださいstty -echosttyおよびそのechoパラメーターはPOSIXで定義されています。

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

これは、POSIXに準拠するすべてのシェルで機能します。

ソース


7
@ arkadiusz-drabczykのコメントの回答からポイントを強調するstty echoには、read PASSWORDセクション中にユーザーが混乱してcontrol-Cを押した場合に有効にするために、できる限りすべてのシグナルをトラップすることをお勧めします。
ジェフシャラー

リンクの答えを読んだり、このスレッドでステファンの答えを参照してください
ジェフ・シャラー

エコーを無条件でオンにするのではなく、古い設定を保存して復元する必要があります。多くの人々はEmacsシェルバッファーで作業しますが、Emacsがエコー自体を行っているため、通常、エコーは無効になっています。もう1つの答えは、これを行う方法を示しています。
バーマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.