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オプションが原因です。 -sオプションは、入力された入力を標準出力(この場合は端末)にエコーしません。 -pオプションは、入力を読み取る前に、それに続く文字列を出力します。 この例では、プロンプトを出力しただけです。 “パスワードを入力してください: “ passwd は、入力を格納するシェル変数です。この場合、ユーザーが入力するパスワードです。 入力としてsecret_passwordを入力したとすると、パスワードは次のようになります。

$ 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()メソッドも別の方法です。