Python实现telnet命令测试防火墙

Python实现telnet命令测试防火墙

  • telnet主要用于测试主机端口是否开通
  • ping主要是用来测试网络是否畅通和主机是否正在使用

使用Python实现Telnet测试主机端口是否开通的功能。使用telnet命令是会出现以下集中情况:

  1. 主机和端口都是通的
  2. 主机通端口不通
  3. 主机不通

通过Python的socket模块来实现,根据上述三种情况进行不同的处理

Telnet协议是基于tcp协议实现的

主机和端口都是通的

这种情况,就会正常连接,正常发送和返回,socket没有任何异常,不用管是否需要密码这一情况,这种情况只需要socket连接主机ip和port,就肯定能链接目标主机ip和端口。

只需要连接自后断开就ok

主机通端口不通

这种情况,连接过程中,socket会抛出ConnectionRefusedError异常,这种情况只需要socket连接主机ip和port,然后捕获对应的异常进行处理即可。

只需要针对连接过程中会抛出ConnectionRefusedError异常进行处理

主机不通

这种情况,socket会一直尝试连接,针对这种情况设置一个超时时间,会抛出socket.timeout的异常,捕获该异常进行处理即可

只需要针对连接过程中会抛出socket.timeout异常进行处理

代码逻辑如下:

#!/usr/bin/python3
# -*-encoding: utf8 -*-

import socket


Buffer_ = 1024


def write_ip_port(file_name, host, ports):
    """
    文件操作,生成对应的记录文件
    :param file_name: 生成的文件名
    :param host: 主机IP
    :param ports: 主机端口
    :return:
    """
    with open('./%s' % file_name, mode='a+', encoding='utf8') as file_handler:
        file_handler.write("%s	%s
" % (host, ports))


def connection_host(host, port):
    """
    测试防火墙是否开通
    :param host: 主机ip
    :param port: 主机端口
    :return:
    """
    cli = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    cli.settimeout(1)
    try:
        """
        处理正常连接
        """
        cli.connect((host, int(port)))
        cli.close()
        file = 'successful.txt'
        write_ip_port(file, host, port)
    except ConnectionRefusedError as cre:
        """
        处理端口关闭
        """
        # print(cre)
        file = 'ConnectionRefusedError.txt'
        write_ip_port(file, host, port)
    except socket.timeout as scto:
        """
        处理主机不通
        """
        # print(scto)
        file = "failed.txt"
        write_ip_port(file, host, port)


def read_ip_list(file_name):
    """
    读取ipList.txt文件中的ip和端口,添加到ip_list列表中
    """
    ip_list = []
    with open('./%s' % file_name, mode='r', encoding='utf8') as file_handle:

        for line in file_handle.readlines():
            line = line.replace("
", '').strip()
            if line is '':
                continue
            line = line.split(' ')
            ip_list.append(line)
    return ip_list


def main(file):
    """
    主程序入口
    :param file: ip和端口的文件名,及其为路径,默认是当前路径
    :return:
    """
    ip_list = read_ip_list(file)
    for ip_port in ip_list:
        connection_host(ip_port[0], ip_port[1])


if __name__ == '__main__':
    main("ipList.txt")
原文地址:https://www.cnblogs.com/linga/p/11097793.html