使用python实现端口扫描的脚本,使用到optparse模块解析命令
大部分解释已写入脚本注释。文件名为portscan.py

'''
命令解析,多线程,端口扫描
----------author:Bluecap-------------
'''#命令行参数解析模块
from optparse import OptionParser
import queue
import socket
import re
import threadingparser=OptionParser('Usage: %prog -i<target ip>')
#添加命令,这里可以选定类型,当然后面的正则可能没有必要
parser.add_option('-i',dest='ip',type='string',help='specify target ip')
#端口为范围,或者单个。单个单线程,多个多线程
parser.add_option('-p',dest='port',type='string',help='specify target port')
parser.add_option('--thread',dest='thread',type='int',help='specify thread num')
#接上--brief只显示开放端口,store_true为加上--brief时brief为True,否则为False
parser.add_option('--brief',dest='brief',action='store_true',help='brief mode')
#全局参数控制输出
# flag=False
#解析命令
opts,argv=parser.parse_args()
# print('opts:',opts)
# print('argv:',argv)
# print(type(opts))
# print(opts.ip)
# print(opts.port)
# print(type(opts.thread))
'''
opts: {'ip': None, 'port': None, 'thread': None}
E:\python作业2>python portscan.py -i 120.0.0.1 -p 21 --thread 4
opts: {'ip': '120.0.0.1', 'port': '21', 'thread': 4}
argv: []
'''
def print_help():print('Usage: %prog -i<target ip> -p<target port> --thread<thread num> --brief<show detail>')#至少要输入ip和端口#单线程扫描 单个端口或者端口范围
def singleThread(ip,ports):try:port=int(ports)s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)if s.connect_ex((ip,port))==0:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'开放'))else:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'关闭'))except:pre_port=int(opts.port.split('-')[0])suf_port=int(opts.port.split('-')[1])if pre_port==suf_port:port=pre_ports=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接成功返回0,失败返回编码if s.connect_ex((ip,port))==0:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'开放'))else:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'关闭'))elif pre_port<suf_port:try:for port in range(pre_port,suf_port+1):s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接成功返回0,失败返回编码if s.connect_ex((ip,port))==0:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'开放'))else:#flag=opts.briefif opts.brief:pass#加上breif后不输出扫描信息else:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'关闭'))except Exception as e:print(e)else:print('端口范围错误')exit(1)#面向对象的方式进行调用
# ip=opts.ip
# ports=opts.port.split('-')def scanport(ip ,port):#给线程上锁,防止取出重复端口with threading.Lock():#线程锁,自动加自动解s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#TCP连接if s.connect_ex((ip,port))==0:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'开放'))else:if opts.brief:passelse:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'关闭'))#多线程端口扫描
def MultiThread(ip,port,threads):pre_port=int(opts.port.split('-')[0])suf_port=int(opts.port.split('-')[1])#print('pre_port:',pre_port)if pre_port==suf_port:singleThread(ip,pre_port)s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)banner()#连接成功返回0,失败返回编码if s.connect_ex((ip,port))==0:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'开放'))else:print('|{:^16}|{:^16}|{:^16}|'.format(ip,port,'关闭'))elif pre_port<suf_port:port_num=suf_port-pre_port#print('port_num:',port_num)#把端口放入队列中,每个线程结束后取出一个queue_ports=queue.Queue(port_num+1)for port in range(pre_port,suf_port+1):queue_ports.put(port)#print('queue_ports size:',queue_ports.qsize())#print('queue_ports size:',queue_ports.qsize())#扫描的端口数小于用户输入的线程数,让线程数等于端口数if threads>0 and threads<=20:if threads>=port_num:#print('多线程第一种情况')threads=port_numfor t in range(threads):try:thread=threading.Thread(target=scanport,args=(ip,pre_port+t),daemon=True)#传递参数,设置为守护线程thread.start()#print(f'线程{t+1}开始启动...')except threading.ThreadError as e:print(f'线程{t+1}执行异常')else:#print('多线程第二种情况')#初始时创建四个线程for th in range(threads):try:thread=threading.Thread(target=scanport,args=(ip,queue_ports.get()))#如果设置成守护线程可能有几个端口就有几个线程thread.start()#print(f'线程{th+1}开始启动...')except threading.ThreadError as e:print(f'线程{th+1}执行异常')else:#执行完for后执行elsewhile True:# if queue_ports.empty():#     breakthread_number=threading.active_count()#等同于threading.enumerate()surplus_ports=queue_ports.qsize()#当前未扫描端口数#print('surplus_ports:',surplus_ports)if surplus_ports==0:break#print('未扫描端口数:',surplus_ports)#保证有4个进程在运行,当扫描的端口少于4个时,且线程够用,就不再增加线程if thread_number<(threads+1):#补齐gap_thread=threads-thread_number#差的线程数for i in range(gap_thread):thread=threading.Thread(target=scanport,args=(ip,queue_ports.get()))thread.start()#print(f'当前线程数为:{len(threading.enumerate())}')else:#等线程结束后再增加线程continueelse:print('线程数最大为20')exit(1)if queue_ports.empty():#print('扫描完成...')exit(1)def banner():print('+'+'-'*50+'+')print('|{:^16}|{:^16}|{:^16}|'.format('ip','port','status'))print('+'+'-'*50+'+')if __name__=='__main__':#None为python空类型if opts.ip is None or opts.port is None:print_help()else:#检查IP格式ip=re.match('^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$',opts.ip)#匹配成功返回ip,不成功返回Noneif ip is None:print('ip格式错误')exit(1)else:ip=ip.group()try:#检查端口格式port=int(opts.port)except:#端口格式报错,说明输入是端口范围ports=re.match('^\d{1,5}-\d{1,5}$',opts.port)if ports is None:print('端口格式错误')exit(1)else:#print('端口格式正确')ports=ports.group()threads=opts.thread#print('threads:',type(threads))if threads is None:#不输入线程数默认使用单线程print('单线程扫描...')banner()singleThread(ip,ports)else:if threads>0 and threads<=20:print('多线程扫描...')banner()MultiThread(ip,ports,threads)print('-'*50)print('扫描完成...')else:print('线程数错误,最大为20')exit(1)else:banner()#为单端口singleThread(ip,port)#只剩下主线程,结束程序if threading.enumerate()==1:exit(1)    '''
使用示例:
python portscan.py -i 127.0.0.1 -p 440-500 --thread 10 --brief使用10个线程扫描,只显示开放端口
python portscan.py -i 127.0.0.1 -p 440-500 --thread 10 使用10个线程扫描,显示所有端口
python portscan.py -i 127.0.0.1 -p 440-500不加线程参数,默认使用单线程
python portscan.py -i 127.0.0.1 -p 440-440只扫描440端口
python portscan.py -i 127.0.0.1 -p 445只扫描445端口
'''

练习使用python optparse写的一个作业,粗糙还望见谅!目前还存在Bug,也暂时还找不出问题所在。有需求的大佬可以进一步更改以实现更多的功能,比如说扫描ip段。

python命令解析使用多线程扫描端口相关推荐

  1. python多线程扫描_Python多线程扫描端口代码示例

    本文代码实现Python多线程扫描端口,具体实现代码如下. #coding:utf-8 import socket import thread import time socket.setdefaul ...

  2. python命令解析_python解析命令行

    可以解析这样的命令 ./cron_ctrl jobname1 --stop ;./cron_ctrl jobname1 --start;./cron_ctrl jobname1 --list #!/u ...

  3. python命令解析_python学习(命令行的解析)

    在python中我们不需要进行字符串的解析,而是可以直接使用一个类OptionParse即可,直接进行调用,首先要将该类进行导入 from optparse import OptionParser 这 ...

  4. python在命令端口运行脚本_扫描端口占用情况的python脚本

    之前项目上线前,领导要求让写一个脚本用来判断端口的占用情况.由于现在python3使用也比较多,基于python2修改了一下,做了个python3版本的,现在做一下总结. 一.python脚本实现扫描 ...

  5. 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. java多线程实现端口扫描,使用Java开发多线程端口扫描工具

    前言:这里只给出命令行版的扫描工具,后续可能是写一个独立的界面,或者是集成到其他工具上去. 一 扫描原理 其实原理非常简单,就是使用Socket去连接目标IP或者域名的指定端口,如果能够连上则说明该端 ...

  7. Python # 扫描端口功能 # 获取网卡的Mac地址 # 局域网扫描器IP地址和MAC地址,获取网卡名称和其ip地址

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 开发人员: # time: 2021-09-07 20:37 # 开发工具: PyCharm # Ver ...

  8. 几行命令实现日常任务的自动化执行,包括解析html、扫描二维码、语音转换、pdf编辑、程序员问题搜索、自动化手机、监控cpu、上传机器人、视频水印等

    几行命令实现日常任务的自动化执行,包括解析html.扫描二维码.语音转换.pdf编辑.程序员问题搜索.自动化手机.监控cpu.上传机器人.视频水印等. 01.解析和提取 HTML 02.二维码扫描仪 ...

  9. 网络安全nmap扫描端口命令详解linux网络探测

    简介: nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管理员必用的 ...

最新文章

  1. 内控与IT安全的关系,IT内控与安全审计的关系
  2. 【两种解法】基础实验4-2.2 列出叶结点 (25 分)
  3. [转载] 【零基础学爬虫】python中的yield详解
  4. 20200507:力扣151周赛下
  5. java模板导出excel_POI导出excel模板三种方式
  6. 知道对方IP,你该这样入侵(附:如何隐藏IP地址)
  7. Altium Designer--如何走差分等长线
  8. 使用 Android 开发 MQTT 客户端
  9. 【科研必备】常用数学符号大全
  10. 新出行超级产业链之交通工具变革(网址导航)
  11. oracle数据库迁移到DM数据库
  12. oracle 播布客 视频,播布客视频-Managing Indexes笔记
  13. design pattern scard
  14. 短视频直播电商抖音项目孵化流程运营带货商业计划书方案范本
  15. 基于Android的健康宝体检app介绍(一)
  16. 步进电机c语言驱动原理,《步进电机【驱动电路+C语言驱动程序】》.doc
  17. 《Beta Embeddings for Multi-Hop Logical Reasoning in Knowledge Graphs》论文阅读笔记
  18. 英特尔90亿卖NAND内存业务“回血”,SK海力士买得值吗?
  19. 从搜狗网站爬取微信公众号文章
  20. 以自动化为核心的自服务大数据治理

热门文章

  1. C++十进制二进制十六进制转换
  2. 广州数控机器人编程讲解视频_广州数控工业机器人如何编程,使用什么语言?...
  3. 基于仿真器的两种程序烧录模式:JTAG和SWD
  4. JESD204接口调试总结——Xilinx JESD204B IP AXI寄存器简介
  5. MFC Tab 控件使用
  6. Ubuntu 安装中文支持
  7. cocos 贝塞尔曲线编辑器
  8. 查看表空间、schema和表空间下所有表相关理解
  9. 关于word粘贴图片无法显示的原因
  10. MOOC战德臣数据库课程自用笔记_6_数据库完整性