python nmap模塊 端口探測


今天添加端口探測功能,主要實現方式是通過nmap模塊調用,掃描1-65535端口。上一篇中已經將UP的PC機全部獲取到,這里直接從已知在線的PC中進行端口掃描就可以了,會節省很多時間。

代碼如下,還是非常簡單的:

 1 import nmap
 2 import time
 3 import csv
 4 import os
 5 
 6 
 7 class Port_Scan(object):
 8     def __init__(self):
 9         self.rootpath = 'C:/cunhuo/'
10         self.dirpath = 'C:/portScan/'
11         self.savepath = 'C:/portScan/result.csv'
12         self.csv_write = []
13 
14     def get_ip(self, file):
15         ipList = []
16         with open(file, 'r') as f:
17             for ip in f.readlines()[1:]:
18                 ipList.append(ip.strip()[:-3])
19         return ipList
20 
21     def scan(self, ip):
22         if not os.path.exists(self.dirpath):
23             os.mkdir(self.dirpath)
24         nm = nmap.PortScanner()
25         try:
26             nm.scan(ip, arguments='1-65535')
27             print '[*]Host:%s' % ip
28             for proto in nm[ip].all_protocols():
29                 lport = nm[ip][proto].keys()
30                 lport.sort()
31                 for port in lport:
32                     self.csv_write.append([ip, port, nm[ip][proto][port]['state']])
33                     print 'port : %s\tstate : %s' % (port, nm[ip][proto][port]['state'])
34         except:
35             self.csv_write.append([ip, 'unknown', 'unknown'])
36             print 'port : unknown\tstate : unknown'
37 
38     def run(self):
39         print '[+]Scanning...'
40         startTime = time.time()
41         files = os.listdir(self.rootpath)
42         for file in files:
43             ips = self.get_ip(self.rootpath + file)
44             
45             for ip in ips:
46                 self.scan(ip)
47         with open(self.savepath,'w') as f:
48             fieldnames = ['ip', 'port', 'state']
49             w = csv.writer(f, dialect='excel')
50             w.writerow(fieldnames)
51             w.writerows(self.csv_write)
52         endTime = time.time()
53         print '------------------------------------------------------'
54         print '[+]Scanning cost %ss, result have saved %s' % (endTime - startTime, self.savepath)
55         print '[+]Done.'
56 
57 if __name__ == '__main__':
58     myScan = Port_Scan()
59     myScan.run()

這里對於錯誤捕獲的實現有點偷懶了,我們之前掃描出的存活主機可能在端口探測這個腳本執行時離線了,所以如果不加try...except判斷的話會跑出keyerror的錯誤,說結果中的port、state不在字典中。但是這樣加判斷也有失偏頗...除了離線主機無法探測到,其他情況導致的也一並將port和state設置為unknown了,不知道以后的實驗中會不會發生誤報,到時候會進行修改調整。

掃描用時比較長,我就展示一下運行中的截圖了:

result.csv,為什么中間會有空格呢,奇怪,慢慢改吧

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM