Bashスクリプトに2つの標準入力(対話型入力とリダイレクトを利用できる入力)を持つ方法を探しています。
ユーザー名とパスワードタイプの資格情報を要求するプログラムを呼び出す必要があり、その資格情報を対話的に提供し、リダイレクトを介してwhileループを提供したいとします。それは次のとおりです。
$> ./myscript.sh < input.lst
または
$> cat input.lst | ./myscript.sh
私のスクリプトには次のようなものがあります(とても簡単です)。
#!/bin/bash
./authentication_application
while read i
do
echo $i
done
ここで、認証_applicationは私が所有していないバイナリであり(ソースコードにアクセスできず、直接コンパイルされていない)、代替認証方法に変更または置き換えることはできません。
電話すると、次のような結果になります。
Username: some_user
Password: password
... contents of input.lst ...
some_user
リダイレクトを通じて取得した対話型入力とpassword
コンテンツinput.lst
read -u <fd>
stdinを新しいfdにリダイレクトし、次のようにスクリプト内でfdを "7"として使用する例を試しました。
#!/bin/bash
exec <fd><&0
exec 0<&-
...しかし、stdinをインタラクティブなstdinとして再び開く(またはリセットする)方法がわかりません。
どんなアイデアがありますか?あなたはこれが可能だと思いますか?
ところで、私は以下を探していません:
- プレーンテキストで
input.lst
ユーザー名とパスワードを追加します(どの種類のパスワードハッカーも該当しません)。 - スクリプトに2つのファイルを含める(最初のファイルはユーザー名とパスワードをプレーンテキストで保存します)
get_credentials.sh
解決策ユーザーにメッセージを表示せずに、パラメータを使用してユーザー名とパスワードを渡す必要があります。- input.lstファイルをスクリプトに引数として渡し、位置引数を使用してwhileループからファイルにアクセスします(これは入力をリダイレクトし、スクリプトのパイプ属性を利用するという目的を失います。)
$> cat input.lst | ./filter_1.sh | ./filter_2.sh |... | ./filter_n.sh
。
答え1
たぶん、次のようなものがあります。
#! /bin/bash
echo -n "Password: "
read pwd < /dev/tty
echo
while read x ;do
echo $x
done
echo "Password was: " $pwd
./foo.sh < infile
;として呼び出すと、プロンプトを印刷して端末からパスワードを読み込みますが、ファイルにリダイレクトされたstdinのループを処理します。
いくつかの問題があると確信していますが、ほとんどの状況では十分です。
答え2
NickDの答えは私にこの問題を解決するための洞察を与えました。
正確な仕様の作業コードは次のとおりです。
#!/bin/bash
./authentication_application < /dev/tty
while read i
do
echo $i
done
誰かが役に立つと思います。