使用Python编写简单的端口扫描程序

实现功能

端口扫描

具体用法

我们这里是模仿nmap扫描工具那种用法,在执行程序的时候要加入参数来调用,如图所示:
在这里插入图片描述

运用的模块

sys(用来接收追加的参数)、socket(用来判断端口是否开放)、re(使用正则来提取端口列表)

最终代码

import socket
import sys
import re

port_list = [22, 80, 3389, 21, 3306, 1521, 1433]  # 常用端口

def open_test(ip, port):
    # 用socket连接探测端口是否开放
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((ip, port))
        return True
    except:
        return False
      
def scan_port(ip):
    # 调用上面的方法来返回是否开放
    if len(port_list) > 2:
        for i in port_list:
            if open_test(ip, int(i)):
                print('%s host %s is open' % (ip, i))
            else:
                print('%s host %s is close' % (ip, i))
    else:
        if open_test(ip, port_list):
            print('%s host %s is open' % (ip, port_list))
        else:
            print('%s host %s is close' % (ip, port_list))


try:
    # 捕获异常,CTRL+C 时打印  程序终止  而不是报错
    if len(sys.argv) == 1:
        # 打印使用帮助
        print('''
        This program prints files to the standard output.
        Any number of files can be specified.
        Options include: 
            python scanport.py     ip       ports
            python scanport.py 127.0.0.1 扫描默认端口
            python scanport.py 127.0.0.1 22,80,21,23...   
            python scanport.py 127.0.0.1 80-89   
            python scanport.py 127.0.0.1 21,23,80-89   
            python scanport.py 127.0.0.1 21,23,80-89,135   
            python scanport.py 127.0.0.1 80-89,135   
            python scanport.py 127.0.0.1 all    
        ''')
    elif len(sys.argv) == 2:
        # 扫描默认端口
        scan_port(sys.argv[1])
    elif len(sys.argv) == 3:
    	if ',' in sys.argv[2]:
            if '-' in sys.argv[2]:
            # 如果同时包含,和-  用以下方法筛选出端口
            port_list = sys.argv[2].split(',')
            # print(port_list)
            length = len(port_list)
            for i in range(0, length):
                if '-' in port_list[i]:
                    p = re.findall('\\d\\d', port_list[i])  # 使用正则将开始和末尾的元素拿出来
                    # print(p)
                    port_list.remove(port_list[i])
                    # print(port_list)
                    for j in range(int(p[0]), int(p[1])+1):
                        port_list.append(str(j))  # 转换成字符串加入进列表中
                        # print(port_list)
	        scan_port(sys.argv[1])
	        else:
	            # 第二种方式
	            port_list = sys.argv[2].split(',')
	            scan_port(sys.argv[1])
	    elif '-' in sys.argv[2]:
	        # 第三种方式
	        temp = sys.argv[2].split('-')
	        port_list = range(int(temp[0]), int(temp[1])+1)
	        scan_port(sys.argv[1])
	    elif sys.argv[2] == 'all':
	        # 第四种方式
	        port_list = range(1, 65535)
	        scan_port(sys.argv[1])
	    else:
	        port_list = sys.argv[2]
	        scan_port(sys.argv[1])
except KeyboardInterrupt:
    print('Program end!')



结果展示

扫描默认端口:
在这里插入图片描述
扫描自定义端口:
在这里插入图片描述
扫描固定范围端口:
在这里插入图片描述
也可以混合一起使用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
扫描所有端口(1-65535):
在这里插入图片描述
这样简单的端口扫描程序就写好了,欢迎各位师傅们一起交流~

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值