1

私は、パスワードの入力を求めるプロンプトが表示され、後で復号化プログラムにstdinを渡す必要がある鍵が派生しています。私はいつでもファイルにキーを格納したくないので、代わりに変数に渡すことを考えています。代替ファイル記述子からシェル変数への読み込み

パスワードプログラムはパスワードプロンプトを表示する必要があるため、プロンプトを失うことなくstdoutから変数に読み込むことができません。私はthisから、代替の記述子からの出力をキャプチャでき、thisから非常に精巧なリダイレクトとパイピングが可能であることを知っていますが、私はそれをすべてまとめないといけません。

パスワードプログラムは私のものなので、自分の選択した代替ディスクリプタ、たとえば3に書き込むことができます。以下は、私がしたいことを示していますが、間違っていることが分かります。これをどうすれば解決できますか?

read key < <&3 $(password_program) 
# other operations ... 
echo $key | decryption_program - 
+0

'-uが3' –

+0

ように動作するはず読むべき'読んキー<&3' –

+0

@william:これはシェルのfdから読み込む 'read'を得る方法です3.しかし、' password_program'の出力をシェルのfd 3に表示させる方法はありますか? 'password_program'がそれ自身のfd 3に書き込む方法は明らかですが、それはあまり役に立ちません。 – rici

答えて

2

パスワードプログラムを記述する場合、最も簡単な(通常の)解決策は、無料stdoutを残し、stderrにプロンプ​​トを書くことです。パスワードをstdoutにエコーして変数に取り込むことができます。

また、プロンプトを書き込んで、/dev/ttyからパスワードを読み取ることもできます。最も簡単な解決のために

、あなたbashを使用していて、すべてのパスワードのリーダーがない場合は、プロンプトプリントされ、それをエコーせずにパスワードを読んで、あなただけの、これはであなたのトリックを行う必要があり、私が思うIFS= read -srp "prompt: " passwd

+0

ありがとうございます。 stderrにプロンプ​​トを書いてstdoutの鍵を書いているあなたの提案は、このような状況ではうまくいくので、私はupvoteしますが、もっと一般的な解決策のために代替ファイル記述子でこの作業を行う方法を教えてくれることを願っています。 'IFS = read -srp 'プロンプト:私のパスワードプログラムがキーを引き出すために追加の処理を行わなければならないので、" passwd "アプローチは私のためには機能しません。 –

0

を使用することができますbashの:次のようにそれが動作する

exec 4>&1 
key=$(password_program 3>&1 >&4-) 
exec 4>&- 

$()構文で、password_programはそのstdout変数keyに入りますサブシェルで実行されているため、その後の記述子4と最初のEXEC重複ファイルディスクリプタ1(stdout) 。しかし実際に実行する前に、サブシェルにマングリングをさせてください。password_program:ディスクリプタ3がディスクリプタ1のコピーとして開かれ、password_programがその結果をディスクリプタ3に書き込むことができます。ディスクリプタ4(オリジナルのstdout )はディスクリプタ1に移動されます。その結果、password_programは、stdoutと同じファイル(またはttyなど)で実行され、シェルは起動されました。最後のコマンドは、メインシェルのディスクリプタ4をもう一度取り除きます。

あなたpassword_programへの入力としてstderrをstdoutではなくクローンを作成することが許容されている場合は、行うことができます:

key=$(password_program 3>&1 >&2) 
関連する問題