2017-06-08 13 views
1

私は、サーバー名とポート番号のユーザー入力を受け取り、SSL証明書有効期限情報を示すOpenSSLコマンドにルーティングする単純なPythonシェルスクリプトを作成しようとしています。Pythonシェルスクリプト。 Chain Unix OpenSSLコマンド

私はサブプロセスモジュールを使用していますが、ユーザーが入力した情報でコマンドを連鎖させる適切な方法が不明です。

完全なコマンドは次のとおりです。(私は出力にスクリプトを望むものである)コマンドの

echo | openssl s_client -servername www.google.com -connect www.google.com:443 2>/dev/null | openssl x509 -noout -dates 

は出力:

notBefore=May 31 16:57:23 2017 GMT 
notAfter=Aug 23 16:32:00 2017 GMT 

マイコード:

#!/usr/bin/env python 
import subprocess 

server_name = raw_input("Enter server name: ") 
port_number = raw_input("Enter port number: ") 

def display_cert_info(servername, portnum): 
    pn = str(server_name + ":" + port_number) 
    cmd = ["echo", "|", "openssl", "s_client", "-servername", str(servername), "-connect", pn, "2>/dev/null", "|", "openssl", "x509", "-noout", "-dates"] 

    info = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    output = info.communicate()[0] 
    print(output) 

display_cert_info(server_name, port_number) 

すべてのヘルプ感謝しています!

答えて

0

シェルとは異なり、内標準、標準出力、および標準エラーはすべてPopenstdinstdoutstderr引数で処理されます。したがって、最初の2つのコマンド要素(echo |)を破棄することができます。次に、の別のプロセスをパイプラインの最後のコマンドで実行して、最初のコマンドの出力をstdinにします。一般的には、別の言語で実行しているときはシェルパイプを使用せず、代わりに言語独自のパイプ(またはストリーミング)メカニズムを使用します。