Python try 块中的错误处理将条目传递给数组

Python Error handling in try block pass entry to array

我正在从一个文本文件中获取服务器列表,并使用 pyopenssl 来解析、连接和检索 SSL 证书信息,并将我的结果传递给一个数组。它工作正常,直到列表中的一台服务器无法解析并且我收到 socket.gaierror 错误。

虽然我可以在日志中捕获错误,但我正在尝试传递一些东西,这些东西会在我的数组结果中记录异常,并且我将能够传递给 table 并发送电子邮件。我希望它在主机字段中注明“无法解决”任何人都可以指出我实现这一目标的好方法吗?谢谢! 基本操作顺序:

  1. 抓取文件中的每个主机

  2. 创建一个数组来存放结果

  3. 使用 SSL 连接到服务器

  4. 获取 SSL 信息并关闭连接

  5. 从 SSL 证书获取主机名、到期日期和解码

  6. 获取日期、格式并计算 SSL 到期前的天数

  7. 在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