python-nmap是python的一个模块库,使用这个模块可以让python很方便的操作nmap扫描器来工作,它可以帮助管理员完成自动扫描任务和生成报告的工具,它还支持nmap的脚步输出。python-nmap模块有两个常用类,一个为PortScanner()类,实现一个nmap工具的端口扫描功能封装;另一个为PortScannerHostDict()类,实现存储于访问主机的扫描结果,下面介绍PortScanner()类的一些常用方法。
scan(self,hosts='127.0.0.1',port=None,arguments='-sV')
方法,实现指定主机,端口,nmap命令行参数的扫描。
<code> In [1]: import nmap In [2]: nm = nmap.PortScanner() In [3]: nm.scan('192.168.1.20','22,80') Out[3]: {'nmap': {'command_line': 'nmap -oX - -p 22,80 -sV 192.168.1.20', 'scaninfo': {'tcp': {'method': 'syn', 'services': '22,80'}}, 'scanstats': {'downhosts': '1', 'elapsed': '0.66', 'timestr': 'Sat Nov 21 23:21:15 2015', 'totalhosts': '1', 'uphosts': '0'}}, 'scan': {}} </code>
command_line(self)
方法,返回的扫描方法映射到具体nmap命令行,如:
<code> In [4]: nm.command_line() Out[4]: 'nmap -oX - -p 22,80 -sV 192.168.1.20' </code>
scaninfo(self)
方法,返回nmap扫描的主机清单,格式为列表类型,如:
<code> In [5]: nm.scaninfo() Out[5]: {'tcp': {'method': 'syn', 'services': '22,80'}} </code>
all_hosts(self)
方法,返回nmap扫描的主机清单,格式为列表类型,如:
<code> In [8]: nm.all_hosts() Out[8]: ['192.168.1.1', '192.168.1.62'] </code>
以下介绍PortScannerHostDictionary()
类的一些常用方法。
hostname(self)
方法,返回扫描对象的主机名,如:
<code> In [9]: nm['192.168.1.1'].hostname() Out[9]: 'feiyu' </code>
state(self)
方法,返回扫描对象的状态,包括四种状态(up,down,unknown,skipped),如:
<code> In [15]: nm['192.168.1.1'].state() Out[15]: 'up' </code>
all_protocols(self)
方法,返回扫描的协议,如:
<code> In [12]: nm['192.168.1.1'].all_protocols() Out[12]: ['tcp'] </code>
all_tcp()(self)
方法,返回tcp协议扫描的端口,如:
<code> In [13]: nm['192.168.1.1'].all_tcp() Out[13]: [22, 80] </code>
tcp(self,port)
方法,返回扫描tcp协议port(端口)的信息,如:
<code> In [14]: nm['192.168.1.1'].tcp(22) Out[14]: {'conf': '10', 'cpe': '', 'extrainfo': 'protocol 2.0', 'name': 'ssh', 'product': 'OpenSSH', 'reason': 'syn-ack', 'state': 'open', 'version': '5.3'} </code>
下面是一个完整的示例,在python3下面进行测试过:
<code> #!/usr/bin/python #coding:utf-8 import sys import nmap ''' 高效端口扫描 www.tianfeiyu.com ''' scan_row = [] input_date = input('please input hosts and ports:') scan_row = input_date.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() except : print('unexpected error:',sys.exc_info()[0]) sys.exit() try: #调用扫描方法,参数指定扫描主机hosts,nmap扫描命令行参数arguments nm.scan(hosts=hosts,arguments=' -v -sS -p '+port) except Exception as e: print('scan error:'+str(e)) for host in nm.all_hosts(): #遍历扫描主机 print('----------------------------------------------') print('Host : %s (%s)' % (host,nm[host].hostname())) #输出主机及主机名 print('State : %s' % nm[host].state()) #输出主机状态信息,如up,down for proto in nm[host].all_protocols(): #遍历扫协议,如tcp,udp print('---------------------------') print('Protocol : %s' %proto) #输入协议名 lport = nm[host][proto].keys() #获取协议的所有扫描端口,输出为字典形式 sorted(lport) #端口列表排序 for port in lport: #遍历端口及输出端口与状态 print('port : %s \tstate : %s' % (port,nm[host][proto][port]['state'])) </code>
运行结果如下:
<code> [root@sta auto]# python port_scan.py please input hosts and ports:192.168.1.0/24 22,80 ---------------------------------------------- Host : 192.168.1.0 () State : down ---------------------------------------------- Host : 192.168.1.1 () State : up --------------------------- Protocol : tcp port : 80 state : open port : 22 state : open ---------------------------------------------- Host : 192.168.1.10 () State : down ---------------------------------------------- Host : 192.168.1.100 () State : down ---------------------------------------------- Host : 192.168.1.101 () State : down ---------------------------------------------- 。。。。。。 。。。。。。 </code>