[英]Python Shell Scripting. Chain Unix OpenSSL Commands
我正在尝试编写一个简单的 Python shell 脚本,该脚本将接受用户输入的服务器名称和端口号,并将其路由到显示 SSL 证书到期信息的 OpenSSL 命令中。
我正在使用 subprocess 模块,但是我不清楚将命令与用户输入的信息链接的正确方法。
完整的命令是:
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)
任何帮助表示赞赏!
与 shell 不同,标准输入、标准输出和标准错误都由Popen
的stdin
、 stdout
和stderr
参数处理。 因此,您可以丢弃前两个命令元素 ( echo |
)。 然后,您需要使用管道中的最后一个命令运行一个单独的进程,将第一个命令的输出放入其stdin
。 通常,在以另一种语言运行时,您不使用 shell 管道,而是使用该语言自己的管道(或流)机制。
@Han 我意识到我参加聚会可能有点晚了,无法为您提供帮助,很抱歉,但这是为其他寻求此解决方案的人准备的。 我必须将 Popen() 和 check_output() 函数串在一起,如下所示:
#!/usr/bin/python3
from subprocess import Popen, PIPE, check_output
from os import open, O_WRONLY
servers = [
"server1.domain.com",
"server2.domain.com",
"server3.domain.com"
]
for s in servers:
print("querying {}".format(s))
dn = open("/dev/null", O_WRONLY)
q = Popen(["/usr/bin/openssl", "s_client", "-servername", s, "-connect","{}:443".format(s)], stdout=PIPE, stdin=PIPE, stderr=dn, shell=False)
y = check_output(["/usr/bin/openssl", "x509", "-noout", "-dates"], stdin=q.stdout)
print(y.decode("utf-8"))
这让我可以对我添加到列表中的所有服务器进行快速而肮脏的审计。 我的下一次迭代是向输出添加监控/警报,并且再也不会对过期的证书感到惊讶。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.