重複の可能性:
Linuxシェルで入力されたコマンドを非表示にする方法?
Bashスクリプトで画面に表示せずにパスワードを読み取る
パスワードを入力として受け取りたいのですが、他のユーティリティが処理するのと同じように、ユーザーがパスワードを入力できるようにしたいのです。つまり、画面に文字が表示されません。これについて検索してみましたが、正確な答えは見つかりませんでした。
変数を取り込む必要があるので、入力を、スクリプトの最初にある構成ファイルの1つから取得した、事前定義されたスタンドアロンパスワードのハードコードされた変数と照合します。
$./startScript
username: mtk
password: ********
*
はプレースホルダーとして表示されます。この部分が見えないようにする必要があります。現在、パスワードはユーザーが入力したとおりに表示されます。
これを行う方法?
sh
(またはbash
)を使用する場合は、read
をオプション-s
(セキュア)とともに使用します。
read -s pass
パスワードをユーザーから読み取り、出力に表示せずに変数pass
に保存します。
UNIXには、プロンプトを表示してエコーを無効にしてパスワードを読み取る「getpass」C関数があります。
関数はプロンプト文字列を取得し、パスワードを含むNULLで終了する文字列へのポインタを返します。パスワードの最大長を忘れないでください(PASS_MAXかどうかについては、システムのlimits.hを参照してください)。
また、 'getpass'はパスワードを内部の静的バッファーに入れ、呼び出すたびに消去されることにも注意してください。したがって、適切なプロセスは、できるだけ早くバッファをゼロにする必要があります。
これは動作を示す小さなプログラムです:
#include <stdio.h>
#include <unistd.h>
int
main( int argc, char** argv ) {
char* password = getpass( "Password: " );
printf( "Your password is: '%s'\n", password );
return 0;
}
私はこのコードがあなたが望むことをするべきだと思います:
#!/bin/bash
unset username
unset password
echo -n "username:"
read username
Prompt="password:"
while IFS= read -p "$Prompt" -r -s -n 1 char
do
if [[ $char == $'\0' ]]
then
break
fi
Prompt='*'
password+="$char"
done