web-dev-qa-db-ja.com

シェルスクリプトの入力のように「パスワード」を取得する方法

重複の可能性:
Linuxシェルで入力されたコマンドを非表示にする方法?
Bashスクリプトで画面に表示せずにパスワードを読み取る

パスワードを入力として受け取りたいのですが、他のユーティリティが処理するのと同じように、ユーザーがパスワードを入力できるようにしたいのです。つまり、画面に文字が表示されません。これについて検索してみましたが、正確な答えは見つかりませんでした。

変数を取り込む必要があるので、入力を、スクリプトの最初にある構成ファイルの1つから取得した、事前定義されたスタンドアロンパスワードのハードコードされた変数と照合します。

予想される動作

$./startScript
username: mtk
password: ********

*はプレースホルダーとして表示されます。この部分が見えないようにする必要があります。現在、パスワードはユーザーが入力したとおりに表示されます。

これを行う方法?

15
mtk

sh(またはbash)を使用する場合は、readをオプション-s(セキュア)とともに使用します。

read -s pass

パスワードをユーザーから読み取り、出力に表示せずに変数passに保存します。

24
v154c1

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;
}
4
Ivanhoe

私はこのコードがあなたが望むことをするべきだと思います:

#!/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
2
pradeepchhetri