Edited at

シェルスクリプトでパスワード入力プロンプト

More than 1 year has passed since last update.

ユーザーにパスワードを入力してもらうシェルスクリプトを作成していたら

bash の read コマンドに便利なオプションがあったのでメモ。

入力プロンプトに "Password:" と表示するには -p が使えます。

入力元が端末のときのみプロンプトを表示するという賢いオプションです。


         -p prompt

Display prompt on standard error, without a trailing new-
line, before attempting to read any input. The prompt is
displayed only if input is coming from a terminal.

入力した文字を画面に表示しないようにするには -s が使えます。


         -s     Silent mode.  If input is coming from a terminal, charac-

ters are not echoed.

以上を踏まえてスクリプトを書いてみました。


readpw1.sh

#!/bin/bash

read -sp "Password: " pass
echo "<<$pass>>"

実行してみましょう。端末と echo から "hogehoge" を入力してみます。

$ ./readpw1.sh

Password: <<hogehoge>>
$ echo hogehoge | ./readpw.sh
<<hogehoge>>

キーボードから入力した Enter は read が奪ってしまい表示が改行されません。

では read のあとに echo してみましょう。


readpw2.sh

#!/bin/bash

read -sp "Password: " pass
echo
echo "<<$pass>>"

実行してみます。

$ ./readpw2.sh 

Password:
<<hogehoge>>
$ echo hogehoge | ./readpw.sh

<<hogehoge>>

今度は echo で入力したときに無駄な空行が出力されてしまいました。

入力元が端末かどうか調べるには tty を使います。


readpw3.sh

#!/bin/bash

read -sp "Password: " pass
tty -s && echo
echo "<<$pass>>"

実行してみましょう。

$ ./readpw3.sh 

Password:
<<hogehoge>>
$ echo hogehoge | ./readpw.sh
<<hogehoge>>

いい感じです。