Python try 块中的错误处理将条目传递给数组
Python Error handling in try block pass entry to array
我正在从一个文本文件中获取服务器列表,并使用 pyopenssl 来解析、连接和检索 SSL 证书信息,并将我的结果传递给一个数组。它工作正常,直到列表中的一台服务器无法解析并且我收到 socket.gaierror 错误。
虽然我可以在日志中捕获错误,但我正在尝试传递一些东西,这些东西会在我的数组结果中记录异常,并且我将能够传递给 table 并发送电子邮件。我希望它在主机字段中注明“无法解决”任何人都可以指出我实现这一目标的好方法吗?谢谢!
基本操作顺序:
抓取文件中的每个主机
创建一个数组来存放结果
使用 SSL 连接到服务器
获取 SSL 信息并关闭连接
从 SSL 证书获取主机名、到期日期和解码
获取日期、格式并计算 SSL 到期前的天数
在ssl_results数组中记录条目
import ssl
from datetime import datetime
import OpenSSL
import socket
from datetime import timedelta
import datetime
import traceback
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
formatter = logging.Formatter('%(asctime)s:%(levelname)s:% (message)s')
file_handler = logging.FileHandler('log/SSLNag.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
try:
ipfile = open('server_ip.txt')
cur_date = datetime.datetime.utcnow()
ssl_results = {}
except Exception as e:
logger.warning("ERROR ENCOUNTERED! \n\n")
logger.warning(str(traceback.format_exc()))
for ip in ipfile:
ssl_results[str(ip)] = {'host': '', 'server_name': '',
'exp_date': '', 'days_to_expire': ''}
try:
host = ip.strip().split(':')[0]
port = ip.strip().split(':')[1]
print('\nChecking certificate 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.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)
ssl_results[str(ip)]['host'] = host
ssl_results[str(ip)]['server_name'] = server_name
ssl_results[str(ip)]['exp_date'] = exp_date
ssl_results[str(ip)]['days_to_expire'] = days_to_expire
except Exception as e:
logger.warning('Error on connection to Server,', str(ip))
logger.warning("ERROR ENCOUNTERED", host, "\n\n")
logger.warning(str(traceback.format_exc()))
首先在第二次尝试时缺少缩进,除了 :-)
是不是就这么简单:
import ssl
from datetime import datetime
import OpenSSL
import socket
from datetime import timedelta
import datetime
import traceback
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
formatter = logging.Formatter('%(asctime)s:%(levelname)s:% (message)s')
file_handler = logging.FileHandler('log/SSLNag.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
try:
ipfile = open('server_ip.txt')
cur_date = datetime.datetime.utcnow()
ssl_results = {}
except Exception as e:
logger.warning("ERROR ENCOUNTERED! \n\n")
logger.warning(str(traceback.format_exc()))
for ip in ipfile:
global server_name, host, exp_date, days_to expire
ssl_results[str(ip)] = {'host': '', 'server_name': '',
'exp_date': '', 'days_to_expire': ''}
try:
host = ip.strip().split(':')[0]
port = ip.strip().split(':')[1]
print('\nChecking certificate 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.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)
ssl_results[str(ip)]['host'] = host
ssl_results[str(ip)]['server_name'] = server_name
ssl_results[str(ip)]['exp_date'] = exp_date
ssl_results[str(ip)]['days_to_expire'] = days_to_expire
except Exception as e:
logger.warning('Error on connection to Server,', str(ip))
logger.warning("ERROR ENCOUNTERED", host, "\n\n")
logger.warning(str(traceback.format_exc()))
ssl_results[str(ip)]['host'] = "Unable to resolve"
ssl_results[str(ip)]['server_name'] = " "
ssl_results[str(ip)]['exp_date'] = " "
ssl_results[str(ip)]['days_to_expire'] = " "
或者你想完成什么?
您还想要电子邮件客户端吗?
试试这个:https://realpython.com/python-send-email/
我只需要为 socket.gaierror 添加一个例外并更新数组。
except socket.gaierror as e:
ssl_results[str(ip)]['host'] = host
ssl_results[str(ip)]['server_name'] = "Could not connect"
ssl_results[str(ip)]['exp_date'] = 0
ssl_results[str(ip)]['days_to_expire'] = 0
我正在从一个文本文件中获取服务器列表,并使用 pyopenssl 来解析、连接和检索 SSL 证书信息,并将我的结果传递给一个数组。它工作正常,直到列表中的一台服务器无法解析并且我收到 socket.gaierror 错误。
虽然我可以在日志中捕获错误,但我正在尝试传递一些东西,这些东西会在我的数组结果中记录异常,并且我将能够传递给 table 并发送电子邮件。我希望它在主机字段中注明“无法解决”任何人都可以指出我实现这一目标的好方法吗?谢谢! 基本操作顺序:
抓取文件中的每个主机
创建一个数组来存放结果
使用 SSL 连接到服务器
获取 SSL 信息并关闭连接
从 SSL 证书获取主机名、到期日期和解码
获取日期、格式并计算 SSL 到期前的天数
在ssl_results数组中记录条目
import ssl from datetime import datetime import OpenSSL import socket from datetime import timedelta import datetime import traceback import logging logger = logging.getLogger(__name__) logger.setLevel(logging.WARNING) formatter = logging.Formatter('%(asctime)s:%(levelname)s:% (message)s') file_handler = logging.FileHandler('log/SSLNag.log') file_handler.setFormatter(formatter) logger.addHandler(file_handler) try: ipfile = open('server_ip.txt') cur_date = datetime.datetime.utcnow() ssl_results = {} except Exception as e: logger.warning("ERROR ENCOUNTERED! \n\n") logger.warning(str(traceback.format_exc())) for ip in ipfile: ssl_results[str(ip)] = {'host': '', 'server_name': '', 'exp_date': '', 'days_to_expire': ''} try: host = ip.strip().split(':')[0] port = ip.strip().split(':')[1] print('\nChecking certificate 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.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) ssl_results[str(ip)]['host'] = host ssl_results[str(ip)]['server_name'] = server_name ssl_results[str(ip)]['exp_date'] = exp_date ssl_results[str(ip)]['days_to_expire'] = days_to_expire except Exception as e: logger.warning('Error on connection to Server,', str(ip)) logger.warning("ERROR ENCOUNTERED", host, "\n\n") logger.warning(str(traceback.format_exc()))
首先在第二次尝试时缺少缩进,除了 :-)
是不是就这么简单:
import ssl
from datetime import datetime
import OpenSSL
import socket
from datetime import timedelta
import datetime
import traceback
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.WARNING)
formatter = logging.Formatter('%(asctime)s:%(levelname)s:% (message)s')
file_handler = logging.FileHandler('log/SSLNag.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
try:
ipfile = open('server_ip.txt')
cur_date = datetime.datetime.utcnow()
ssl_results = {}
except Exception as e:
logger.warning("ERROR ENCOUNTERED! \n\n")
logger.warning(str(traceback.format_exc()))
for ip in ipfile:
global server_name, host, exp_date, days_to expire
ssl_results[str(ip)] = {'host': '', 'server_name': '',
'exp_date': '', 'days_to_expire': ''}
try:
host = ip.strip().split(':')[0]
port = ip.strip().split(':')[1]
print('\nChecking certificate 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.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)
ssl_results[str(ip)]['host'] = host
ssl_results[str(ip)]['server_name'] = server_name
ssl_results[str(ip)]['exp_date'] = exp_date
ssl_results[str(ip)]['days_to_expire'] = days_to_expire
except Exception as e:
logger.warning('Error on connection to Server,', str(ip))
logger.warning("ERROR ENCOUNTERED", host, "\n\n")
logger.warning(str(traceback.format_exc()))
ssl_results[str(ip)]['host'] = "Unable to resolve"
ssl_results[str(ip)]['server_name'] = " "
ssl_results[str(ip)]['exp_date'] = " "
ssl_results[str(ip)]['days_to_expire'] = " "
或者你想完成什么? 您还想要电子邮件客户端吗? 试试这个:https://realpython.com/python-send-email/
我只需要为 socket.gaierror 添加一个例外并更新数组。
except socket.gaierror as e:
ssl_results[str(ip)]['host'] = host
ssl_results[str(ip)]['server_name'] = "Could not connect"
ssl_results[str(ip)]['exp_date'] = 0
ssl_results[str(ip)]['days_to_expire'] = 0