今天添加端口探測功能,主要實現方式是通過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,為什么中間會有空格呢,奇怪,慢慢改吧