對於端口掃描,使用的最多的就是nmap這個工具,不想python已經強大到,提供了nmap這個掃描端口的模塊。python
本片文章主要介紹nmap模塊的兩個經常使用類:tcp
安裝:這裏須要安裝的是python-nmap模塊,不是nmap模塊,pip install python-nmap。工具
PortScanner()類的一些經常使用方法:spa
1. scan()方法:命令行
scan(self,host='127.0.0.1',ports=None,arguments='-sV')
實現指定主機,端口,nmap命令行參數的掃描。code
參數說明:對象
import nmap #實例化 nm = nmap.PortScanner()
#端口掃描
nm.scan('www.baidu.com','22,80,443','-sV')
2. command_line(self)方法blog
返回的掃描方法映射到具體的nmap命令行排序
nm.command_line()
3. scaninfo(self)方法ip
返回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']))