資源簡介
個人用python寫的掃描主機端口的小程序,可用于掃描一臺指定主機開放且正在監聽哪些端口,請注意,在一臺主機上netstat -an看到的正在listening的端口未必是開放的,還要看主機的防火墻以及路由器的防火墻的設置。腳本中可以配置的參數說明,可以自行修改:
gd.Host = "127.0.0.1"
#要被掃描的主機IP
gd.ThreadSize = 1000
#并行線程數,建議值1000-3000
gd.ExitNum = 10
#掃描到多少個開放端口后退出
gd.Timer = 5
#超時時間,內網設1,公網不超過5
gd.PortList_1 = range(1,2000)
#端口范圍
gd.PortList_2 = [3389,6000]
#特殊端口列表
腳本開始運行后會打印掃描到的主機正在監聽且開放的端口,按ctrl+c隨時結束掃描。

代碼片段和文件信息
#!/usr/bin/python
import?ossystimesocketthreadingcopy
?
class?cGlobalData:
????pass
gd=cGlobalData()
gd.Host?=?“127.0.0.1“
gd.ThreadSize?=?1000
gd.ExitNum?=?100
gd.Timer?=?5
gd.PortList_1?=?range(30000)
gd.PortList_2?=?[33896000]
gd.OpenPorts?=?[]
gd.NewPorts?=?[]
gd.PrintLock?=?threading.Lock()
gd.UpdateLock?=?threading.Lock()
gd.OpenLock?=?threading.Lock()
gd.ThreadLock?=?threading.Lock()
gd.ExitLock?=?threading.Lock()
gd.ScanPorts?=?[]+gd.PortList_1?+?gd.PortList_2
gd.ScanedNum?=?0
gd.Exit?=?False
gd.ThreadNum=0
gd.GroupSize=int((len(gd.ScanPorts))/gd.ThreadSize)
class?cScanThread(threading.Thread):
????def?__init__(selfaIdxaLenaId):
????????threading.Thread.__init__(self)
self.vId?=?aId
????????self.vIdx=aIdx
self.vLen=aLen
????????return
????def?run(self):
????????global?gd
gd.PrintLock.acquire()
#print?“thread“self.vId“scan?from“self.vIdx“to“self.vIdx+self.vLen
gd.PrintLock.release()
for?i?in?range(self.vIdxself.vIdx+self.vLen):
????gd.ExitLock.acquire()
????vExit=gd.Exit
????gd.ExitLock.release()
????if(vExit):
gd.ThreadLock.acquire()
gd.ThreadNum?=?gd.ThreadNum?-1
gd.ThreadLock.release()
gd.PrintLock.acquire()
#print?“thread“self.vId“exit?because?ports?enough“
gd.PrintLock.release()
return
????sk?=?socket.socket(socket.AF_INET?socket.SOCK_STREAM)
????sk.settimeout(gd.Timer)
????try:
sk.connect((gd.Hostgd.ScanPorts[i]))
????except?Exception:
gd.UpdateLock.acquire()
gd.ScanedNum?=?gd.ScanedNum?+?1
gd.UpdateLock.release()
sk.close()
continue
????sk.close()
????gd.PrintLock.acquire()
????print?‘******************‘+str(gd.ScanPorts[i])+‘***‘
????gd.PrintLock.release()
????gd.OpenLock.acquire()
????gd.NewPorts.append(gd.ScanPorts[i])
????gd.OpenLock.release()
gd.ThreadLock.acquire()
gd.ThreadNum?=?gd.ThreadNum?-1
gd.ThreadLock.release()
gd.PrintLock.acquire()
#print?“thread“self.vId“scan?over“
gd.PrintLock.release()
return
def?main():
????global?gd
????try:
pass
for?i?in?range(gd.ThreadSize):
????gd.ThreadLock.acquire()
????gd.ThreadNum?=?gd.ThreadNum?+?1
????vTrd?=?cScanThread(i*gd.GroupSizegd.GroupSizegd.ThreadNum)
????gd.ThreadLock.release()
????vTrd.start()
if(len(gd.ScanPorts)-(gd.ThreadSize*gd.GroupSize)?>?0):
????gd.ThreadLock.acquire()
????gd.ThreadNum?=?gd.ThreadNum?+?1
????vTrd?=?cScanThread((gd.ThreadSize-1)*gd.GroupSizelen(gd.ScanPorts)-(gd.ThreadSize*gd.GroupSize)gd.ThreadNum)
????gd.ThreadLock.release()
????vTrd.start()
gd.ThreadLock.acquire()
vThreadNum?=?gd.ThreadNum
gd.ThreadLock.release()
gd.PrintLock.acquire()
#print?vThreadNum“threads“
#print?gd.GroupSize“GroupSize“
gd.PrintLock.release()
vOldNum=0
vOpenNum=0
while(True):
????time.sleep(2)
????gd.ThreadLock.acquire()
????vThreadNum?=?gd.ThreadNum
????gd.ThreadLock.release()
????gd.UpdateLock.acquire()
????vScanedNum?=?gd.ScanedNum
????gd.UpdateLock.release()
????if(vOldNum?==?vScanedNum):
if(vThreadNum?<=?0):
????break
continue
????print?vScaned
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3720??2010-03-30?16:27??scanport.py
-----------?---------??----------?-----??----
?????????????????3720????????????????????1
評論
共有 條評論