パスワードで保護されたシステムにアクセスする必要があるプロセスを自動化するスクリプトがあります。システムには、ユーザーパスワードを引数として受け付けるコマンドラインプログラムを介してアクセスします。
自分のパスワードを入力し、それをShell変数に割り当ててから、その変数を使用してアクセスプログラムのコマンドラインを作成するようにユーザーに促します(もちろん、処理するストリーム出力が生成されます)。
私はBourne/Bashの中ではかなり有能なShellプログラマーですが、端末にエコーさせずに(または '*'文字を使ってエコーさせずに)ユーザー入力を受け入れる方法がわかりません。
誰もがこれを手伝ってくれる?
これを行う別の方法は次のとおりです。
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
read -s
はエコーをオフにします。最後の行のecho
を実行したいコマンドに置き換えるだけです。
POSIX準拠の答えです。 /bin/sh
の代わりに/bin/bash
を使用していることに注目してください。 (bashでは動作しますが、requirebashは動作しません。)
#!/bin/sh
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
ワンライナー:
read -s -p "Password: " password
Linux(およびcygwin)では、この形式はbashとshで機能します。ただし、標準のUNIX shではないかもしれません。
より多くの情報とオプションについては、bashで "help read"とタイプしてください。
$ help read
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p Prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
...
-p Prompt output the string Prompt without a trailing newline before
attempting to read
...
-s do not echo input coming from a terminal
read
の-s
オプションはPOSIX規格では定義されていません。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html を参照してください。私はどんなPOSIXシェルでも動くものが欲しいので、エコーを無効にするためにstty
を使う小さな関数を書きました。
#!/bin/sh
# Read secret string
read_secret()
{
# Disable echo.
stty -echo
# Set up trap to ensure echo is enabled before exiting if the script
# is terminated while echo is disabled.
trap 'stty echo' EXIT
# Read secret.
read "$@"
# Enable echo.
stty echo
trap - EXIT
# Print a newline because the newline entered by the user after
# entering the passcode is not echoed. This ensures that the
# next line of output begins at a new line.
echo
}
この関数はread
コマンドと非常によく似た動作をします。これはread
の簡単な使い方とそれに続くread_secret
の使い方です。 read_secret
への入力は、端末にエコーされていないため、空に見えます。
[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
これは-r
オプションを使って入力中のバックスラッシュを保存する別のものです。上で定義されたread_secret
関数が受け取るすべての引数をread
コマンドに渡すので、これはうまくいきます。
[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
最後に、これはread_secret
関数を使用してPOSIX準拠の方法でパスワードを読み取る方法を示す例です。
printf "Password: "
read_secret password
# Do something with $password here ...
私は便利なaskpass
コマンドであることがわかりました
password=$(/lib/cryptsetup/askpass "Give a password")
すべての入力文字は*に置き換えられます。参照項目:パスワードの入力****
echo
を使用してstty
をオフにしてから、もう一度オンにします。
次のようにして、現在のシェルで変数を設定せずにパスワードの入力を求めることもできます。
$(read -s;echo $REPLY)
例えば:
my-command --set password=$(read -sp "Password: ";echo $REPLY)
これを行うには、これらのプロンプト値のいくつかを改行で追加できます。
my-command --set user=$(read -sp "`echo $'\n '`User: ";echo $REPLY) --set password=$(read -sp "`echo $'\n '`Password: ";echo $REPLY)
このリンクは、*端末にエコーバックせずに使用からパスワードを読み取る方法*各文字を*文字で置き換える方法を定義するのに役立ちます。
https://www.tutorialkart.com/bash-Shell-scripting/bash-read-username-and-password/