web-dev-qa-db-ja.com

cronとターミナルでのopenssls_client呼び出しの違い

MicrosoftExchangeのバナーを監視したいのですが。

コンソールで次のコマンドを実行します。

timeout 1 openssl s_client -connect 192.168.0.5:995 > /tmp/1.txt 

出力:

tail -n 4 /tmp/1.txt: 
    Timeout   : 300 (sec) 
    Verify return code: 0 (ok) 
--- 
+OK The Microsoft Exchange POP3 service is ready.

このコマンドをcronに追加すると、この出力が得られます

tail -n 4 /tmp/1.txt 
        Start Time: 1488382801 
        Timeout   : 300 (sec) 
        Verify return code: 0 (ok) 
---

Cronとコンソールの違いは何ですか?ありがとうございました。

1

ほとんどの場合、cronで実行している場合、リモートサーバーがバナーを発行する前に接続が閉じられました。これは、openssl s_clientがstdioとリモートサーバーへのソケット間の双方向接続を操作するためです。

  • Stdinをソケットにコピーします
  • ソケットで受信したデータをstdoutにコピーします

Stdinが/dev/nullに接続されているため、cronで実行すると、最初のコピーはすぐに終了します。これにより、opensslはすぐに終了しました。

これを軽減するには、opensslの入力を、永久にブロックするもの、さらにはsleep 1のようなものにリダイレクトします。これにより、timeoutが不要になります。

それでも、1秒間待つことは、接続してバナーを待つための特に脆弱な方法です。タイムアウトが非常に短いだけでなく、バ​​ナーを受信したときにタイムアウトの期限が切れる前にコマンドが終了することもありません。このようなものについては、expectを探しています。


ところで:

他の人はおそらく同意しないでしょうが、この質問での「コンソール」という用語の使用法は不正確だと思います。実際には、anyターミナルセッションで最初に説明した動作が得られます。これは、とりわけ、次のようになります。

  • sshターミナルセッション、
  • gUIのターミナルエミュレーター(xtermまたは最新の代替品など)
  • screenウィンドウ、
  • シリアルモデム接続、
  • または実際のシステムコンソール。

「コンソール」という用語は、最後のものだけを指す必要があると思いますが、これらはすべてターミナルセッションです。

1
Celada