Bashターミナルでのユーザー入力の非表示
1. 概要
Bashでは、ターミナルに入力したものがすべて表示されます。 ただし、この動作を望まない場合もあります。 1つのケースは、ターミナルまたはBashスクリプトのいずれかでユーザーにパスワードを要求することです。
このチュートリアルでは、ターミナルまたはBashスクリプトでユーザー入力を非表示にするためのいくつかの方法について説明します。
- readコマンド
- sttyコマンド
- Pythonプログラミング言語
2. readコマンドの使用
その名前が示すように、 read コマンドは端末から行を読み取り、それをフィールドに分割します。
$ read first_variable second_variable
aaa bbb
$ echo $first_variable
aaa
$ echo $second_variable
bbb
read コマンドは、デフォルトで、区切り文字として空白文字を使用します。 したがって、シェル変数first_variableは値aaaを取得し、シェル変数second_variableは値bbbを取得しました。
read コマンドの出力に見られるように、入力した入力である aaabbbが端末にエコーされました。 入力した内容を端末にエコーさせたくない場合はどうなりますか? たとえば、パスワードを要求したい場合があります。 読み取りコマンドの-sオプションを使用できます。
$ read -s -p "Please enter your password: " passwd
Please enter your password:
ここでは、パスワードとして入力した内容が端末に出力されていません。 これは、-sオプションが原因です。
$ echo $passwd
secret_password
3. sttyコマンドの使用
stty コマンドは、端末の設定を表示または変更し、ユーザー入力を非表示にする場合にも役立ちます。
sttyコマンドのecho設定を使用して、入力文字のエコーを有効または無効にすることができます。
stty -echo はエコーを無効にします–入力文字は表示されません。 一方、 stty echo はエコーを有効にします。つまり、入力文字は通常どおり端末に表示されます。 この設定を使用して、Bashスクリプトget_password.shでパスワードを取得しましょう。
#!/bin/bash
echo "Please enter your password: "
stty -echo
read passwd
stty echo
echo "The password is: $passwd"
このスクリプトを実行してみましょう:
$ get_password.sh
Please enter your password:
The password is: secret_password
呼び出し側端末にpasswdという名前の既存のシェル変数がある場合、Bashスクリプトでそのシェル変数の値を変更しても、呼び出し側端末での値には影響しません。
$ passwd="my_password"
$ get_password.sh
Please enter your password:
The password is: secret_password
$ echo $passwd
my_password
呼び出し元の端末でシェル変数の値を変更する場合は、ソースでスクリプトを実行する必要があります。
$ passwd="my_password"
$ . get_password.sh
Please enter your password:
The password is: secret_password
$ echo $passwd
secret_password
stty コマンドをBashスクリプトで使用することをお勧めします。これは、ターミナルで直接使用した場合、コマンド stty-echoの後に入力したコマンドが表示されなかったためです。また。 コマンドは、コマンド sttyechoを入力した後にのみ表示されます。
4. Pythonプログラミング言語の使用
Python プログラミング言語は通常、Linuxディストリビューションにインストールされています。 Pythonスクリプトを記述せずに、ターミナルからPythonステートメントを実行できます。
$ user_password=$(python -c "import getpass; passwd=getpass.getpass(); print(passwd)")
Password:
$ echo $user_password
secret_password
pythonコマンドに渡された–c オプションを使用すると、ターミナルからPythonステートメントを実行できます。
二重引用符で囲まれた最初のステートメントimportgetpass は、getpassモジュールをインポートします。 このモジュールは、Python標準ライブラリの一部です。 PythonモジュールをCプログラミング言語のヘッダーファイルに例えることができます。 モジュールは、Pythonの定義とステートメントを含む単なるファイルです。
getpassモジュールのgetpass()メソッドを、二重引用符で囲まれた2番目のステートメント passwd = getpass.getpass()として使用します。 getpass()メソッドは、入力されたinput をエコーせずに、ユーザーのパスワードを要求します。これはまさに私たちが望んでいることです。 次に、ユーザーが入力したパスワードをPython変数passwdに割り当てます。
デフォルトでは、プロンプト文字列は“ Password:“ ですが、次のように変更できます。
$ user_password=$(python -c "import getpass; passwd=getpass.getpass('Please enter your password: '); print(passwd)")
Please enter your password:
$ echo $user_password
secret_password
ご覧のとおり、プロンプトが表示された文字列を getpass()メソッドのパラメーターとして指定できます。
最後に、ステートメント print(passwd)を使用して、Python変数passwdを出力します。 コマンド置換により、printステートメントの出力がシェル変数user_passwordに割り当てられます。
5. 結論
このチュートリアルでは、Bashでユーザー入力を非表示にするいくつかの方法について説明しました。
readコマンドを-sオプションとともに使用して、ユーザー入力を非表示にできることを確認しました。 stty コマンドを使用して、ユーザー入力のエコーを無効または有効にすることもできます。 Pythonプログラミング言語のgetpassモジュールのgetpass()メソッドも別の方法です。