python扫描器_7.python实现高效端口扫描器之nmap模块

对于端口扫描,使用的最多的就是nmap这个工具,不想python已经强大到,提供了nmap这个扫描端口的模块。

本片文章主要介绍nmap模块的两个常用类:

PortScanner()类,实现一个nmap工具的端口扫描功能的封装;

PortScannerHostDict()类,实现存储与访问主机的扫描结果。

安装:这里需要安装的是python-nmap模块,不是nmap模块,pip install python-nmap。

PortScanner()类的一些常用方法:

1. scan()方法:

scan(self,host='127.0.0.1',ports=None,arguments='-sV')

实现指定主机,端口,nmap命令行参数的扫描。

参数说明:

hosts:字符串类型,表示扫描的主机的地址,格式可以用"scanme.nmap.org","127.0.0.1/24"表示;

ports:字符串类型,表示要扫描的端口,可以用"22,80,443-1000"表示;

arguments:字符串类型,表示nmap命令行参数,格式为"-sU -sX -sC"表示。

import nmap

#实例化

nm= nmap.PortScanner()

#端口扫描

nm.scan('www.baidu.com','22,80,443','-sV')

2. command_line(self)方法

返回的扫描方法映射到具体的nmap命令行

nm.command_line()

3. scaninfo(self)方法

返回nmap扫描信息,格式为字典类型

nm.scaninfo()

4. all_hosts(self)方法

返回nmap扫描的主机清单,格式为列表类型

nm.all_hosts()

------------------------------------------------------

PortScannerHostDict()类的一些常用方法

1. hostname(self)方法

返回扫描对象的主机名

nm['61.135.169.125'].hostname()

2. state(self)方法

返回扫描对象的状态,包括四种状态(up,down,unknown,skipped)

nm['61.135.169.125'].state()

3. all_protocols(self)方法

返回扫描的协议

nm['61.135.169.125'].all_protocols()

4.all_tcp(self)方法

返回TCP协议扫描的端口

nm['61.135.169.125'].all_tcp()

5.tcp(self,port)方法

返回扫描TCP协议port的信息

nm['61.135.169.125'].tcp(443)

实践:实现高效的端口扫描

实践代码采用scan()方法的arguments参数指定为 "-v  -PE  -p + 端口",-v表示启用细节模式,可以返回非up状态主机清单;-PE 表示采用TCP同步扫描(TCP,SYN)方式;-p指定扫描端口范围。程序输出部分采用了三个for循环体,第一层遍历扫描主机,第二层遍历协议,第三层遍历端口,最后输出主机状态。

import sys

import nmap

scan_row=[]

input_data = input('Please input hosts and port: ')

scan_row = input_data.split(" ")

if len(scan_row)!=2:

print("Input errors,example \"192.168.1.0/24 80,443,22\"")

sys.exit(0)

#接收用户输入的主机

hosts=scan_row[0]

#接收用户输入的端口

port=scan_row[1]

try:

#创建端口扫描对象

nm = nmap.PortScanner()

except nmap.PortScannerError:

print('Nmap not found', sys.exc_info()[0])

sys.exit(0)

except:

print("Unexpected error:", sys.exc_info()[0])

sys.exit(0)

try:

#调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments

nm.scan(hosts=hosts, arguments=' -v -sS -p '+port)

except Exception as e:

print("Scan erro:"+str(e))

#遍历扫描主机

for host in nm.all_hosts():

print('----------------------------------------------------')

#输出主机及主机名

print('Host : %s (%s)' % (host, nm[host].hostname()))

#输出主机状态,如up、down

print('State : %s' % nm[host].state())

for proto in nm[host].all_protocols():

#遍历扫描协议,如tcp、udp

print('----------')

#输入协议名

print('Protocol : %s' % proto)

#获取协议的所有扫描端口

lport = nm[host][proto].keys()

#端口列表排序

list(lport).sort()

#遍历端口及输出端口与状态

for port in lport:

print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值