stdinを複数の入力ソースに分割する方法はありますか?

stdinを複数の入力ソースに分割する方法はありますか?

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のループを処理します。

いくつかの問題があると確信していますが、ほとんどの状況では十分です。

おすすめ記事