Python将多个变量输出到文本文件
尝试循环浏览服务器列表并使用OpenSSL连接到它们,检索SSL证书,提取服务器名称、证书过期日期,并计算证书过期的天数。代码可以很好地打印到终端会话,但我很难让它以这种格式写入每个服务器的文本文件: 服务器名称:Server01 证书到期日:2020-03-16 23:59:59 过期天数:564 有人能告诉我如何捕获For循环中的每个变量并将其写入文本文件吗?我已经尝试过多次尝试使用f.write的变体,但似乎无法使其发挥作用Python将多个变量输出到文本文件,python,Python,尝试循环浏览服务器列表并使用OpenSSL连接到它们,检索SSL证书,提取服务器名称、证书过期日期,并计算证书过期的天数。代码可以很好地打印到终端会话,但我很难让它以这种格式写入每个服务器的文本文件: 服务器名称:Server01 证书到期日:2020-03-16 23:59:59 过期天数:564 有人能告诉我如何捕获For循环中的每个变量并将其写入文本文件吗?我已经尝试过多次尝试使用f.write的变体,但似乎无法使其发挥作用 f = open("SSL.txt", "a") f.write
f = open("SSL.txt", "a")
f.write(server_name, exp_date, days_to_expire)
完整代码
不要忘记通过f.close关闭文件,否则文件将为空。如果使用with关键字,文件将自动关闭,如复制自的代码示例所示:
此外,write方法只接受1个参数。根据Victor关于关闭文件的评论,要在写入时将多个变量传递给,可以使用python 3的字符串插值 例如:
谢谢你的回复,维克多。是的,我忘了在我的问题中包括f.close。我已经包括了这一点,但您可能已经发现了我在write方法中只使用1个参数时遇到的问题。您可以将此参数发送到write fServer Name:{server\u Name}Day Cert Expires:{exp\u date}Days to expire:{Days\u to\u expire}发送Python将格式化的单个字符串,用3.7中的值替换括号内的变量名。谢谢Oliver!这就是我最后做的。ssl_结果[strip][0]=主机ssl_结果[strip][1]=服务器名称ssl_结果[strip][2]=exp_日期ssl_结果[strip][3]=到期天数
import ssl
from datetime import datetime
import pytz
import OpenSSL
import socket
from datetime import timedelta
import colorama
from colorama import init
from colorama import Fore, Back, Style
## opening file
ipfile = open('server_ip.txt')
cur_date = datetime.utcnow()
for ip in ipfile:
try:
host = ip.strip().split(":")[0]
port = ip.strip().split(":")[1]
print("\nChecking certifcate for server ", host)
ctx = OpenSSL.SSL.Context(ssl.PROTOCOL_TLSv1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, int(port)))
cnx = OpenSSL.SSL.Connection(ctx, s)
cnx.set_connect_state()
cnx.do_handshake()
cert = cnx.get_peer_certificate()
s.close()
server_name = cert.get_subject().commonName
print(server_name)
edate = cert.get_notAfter()
edate = edate.decode()
exp_date = datetime.strptime(edate, '%Y%m%d%H%M%SZ')
days_to_expire = int((exp_date - cur_date).days)
print(exp_date)
print("day to expire", days_to_expire)
if days_to_expire <= 30:
init(convert=True)
print(Fore.YELLOW + "WARNING!",server_name, "SSL Certificate has less than 30 days before it expires." + Style.RESET_ALL)
except:
print("error on connection to Server,", host)
>>> with open('workfile') as f:
... read_data = f.read()
>>> f.closed
True
>>> f = open('test.txt', 'a')
>>> for x in range(10):
... y = str(1*x)
... z = str(10* x)
... j = str(100*x)
... f.write(f"{y} {z} {j}\n")
>>> f.close()