0

opensslサーバーに送信された次のコマンドで実行して開始したい:

t authenticate <dynamically generated base64 string from calling script>
t select Inbox

そこから から入力を取得しますstdin。私はシェルスクリプトとopensslツールキットに非常に無知であり、おそらくそれ自体stdinから同時に描画しているファイルを設定しようとしない限り、パイプ/リダイレクトでこれを行う方法が確かにわかりません。stdin

openssl がその入力を読み取るために使用するテクノロジーが正確にはわかりません。たとえば、次のようになります。

$ echo "t login testacct@yahoo.com password" | openssl s_client -connect imap.mail.yahoo.com:993

と同じことをしない

openssl s_client -connect imap.mail.yahoo.com:993
# openssl dialogue opens...
C: t login testacct@yahoo.com password
S: t NO [AUTHENTICATIONFAILED] Incorrect username or password. (#YSH002)

新しいシェルセッションを開いていると思います(ここでの理解が弱いです) 。作成した内部シェルにopenssl引数を渡しません。stdin

4

5 に答える 5

2

問題を 2 つのスクリプトに分割することをお勧めします。

まず、送信したい初期コマンドをエコーし​​、標準入力から読み取り、標準出力に書き込む 1 つのスクリプトがあります。このように (たとえば、script1.sh と呼びます):

#!/bin/bash
echo "first command"
echo "second command"
while read x
do
  echo "$x"
done

2 番目のスクリプトは、引数を openssl にバンドルするだけなので、引数を入力し続ける必要はありません (たとえば、この script2.sh を呼び出します。上記の script1.sh と同様に、 #!/bin/bash をOS に bash スクリプトであることを伝えるための最初の行。

次に、次のように入力できます。

script1.sh | script2.sh

そして、最初の 2 行が openssl に渡され、その後、入力したすべての行が渡されます。いくつかのコマンドで常に終了させたい場合は、script1.sh の while ループの後にそれらを追加できます。

Ctrl-D で全体を終了します

openssl が入力をエコーする場合、入力した行が 2 回表示されます (これは少しイライラします)。その場合、「read」への「-s」引数は最初の行を抑制します(たとえば、パスワードを入力するのに役立ちます)

このソリューションは、一時ファイルと末尾の -f を使用して以前に提案されたソリューションに似ていますが、一時ファイルの必要性を回避し、すべてが 1 行で行われることに注意してください。

質問に示されている解決策の問題は、「echo "t login ..."」コマンドが終了すると、openssl コマンドへの stdin が閉じられ、これにより通常、プログラムが終了することです。ここで与えられた解決策では、パイプは最初のスクリプトの stdout を 2 番目のスクリプトの stdin に接続し、read に入力されたものはすべて openssl に渡されます。

于 2012-12-09T17:07:20.397 に答える
1

コマンドをファイルに書き込むようにスクリプトを変更してから、 を使用してその同じファイルtee -aにリダイレクトすることができます。stdin例を示しましょう。

jweyrich@pharao:~$ echo "command1" > cmds
jweyrich@pharao:~$ tee -a cmds > /dev/null
command2
command3
^C

その間、tail -f cmds別の tty で実行していました。

jweyrich@pharao:~$ tail -f cmds 
command1
command2
command3

これにより、そのファイルが、読み取って処理する必要がある単一のソースになります。

于 2012-12-07T19:21:21.863 に答える
1

SSL 対応 IMAP サーバーへの基本的な SSL/TLS 接続は、次の方法で確立できますs_client

openssl s_client -connect imapserver.example.com:143 -starttls imap

末尾に注意してください-starttls imap

この後、openssl の作業は完了し、認証を含め、サーバーに対して適切な IMAP を話す必要があります。

于 2012-12-04T17:16:47.090 に答える
0

Nick のソリューションを 1 行のスクリプトとして使用できることを付け加えておきます。

$ sh -c 'echo "first command"; echo "second command"; while read x; do  echo "$x"; done' | whatever
于 2013-11-07T14:53:51.620 に答える