Python python-nmap多線程端口掃描腳本(轉(zhuǎn)載)

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

我就看了幾天的python。這個作為練習(xí),若有錯誤,望指出。

就是基于socket,每個端口去連一下能返回信息就是開啟的。一想這么的沒必要。
可以去連接,異常出錯就是沒有開啟。

            s=socket.socket() 
            s.connect((ip,port))

但是有的連接要很長時間,那么設(shè)置時間:

            s.settimeout(0.1)

只是ip,沒有域名很沒意思那么來個域名解析成ip:

socket.gethostbyname(Domain)  

先不考慮多線程:

import socket
def getip(Domain):  
    try:  
        return socket.gethostbyname(Domain)  
    except socket.error,e:  
        print '%s: %s'%(Domain,e)  
        return 0  

def scan(ip):
    list1=list()
    list2=range(1,65535)
    for port in list2:
        try:
            s=socket.socket() 
            s.settimeout(0.1)
            s.connect((ip,port))
            str1= "[+] Port:"+str(port) +" open "
            print str1
            list1.append(port)
            s.close()
        except:pass
    print list1
def main():
    print '.........'
    print 'please input Domain/ip'
    Domain = raw_input("input:")
    ip = getip(Domain)
    print 'ip:'+ip
    scan(ip)
if __name__=='__main__':  
    main()  

這里寫圖片描述

不用線程,一個一個去連接,因?yàn)槭亲枞?,真的真的是異常的慢。?!?br> 上網(wǎng)查了下別人是怎么寫的:

import socket 
import threading 
from Queue import Queue 
def scan(port): 
  s = socket.socket() 
  s.settimeout(0.1) 
  if s.connect_ex(('localhost', port)) == 0: 
    print port, 'open'
  s.close() 

def worker(): 
  while not q.empty(): 
    port = q.get() 
    try: 
      scan(port) 
    finally: 
      q.task_done() 

if __name__ == '__main__': 
  q = Queue() 
  map(q.put,xrange(1,65535)) 
  threads = [threading.Thread(target=worker) for i in xrange(100)] 
  map(lambda x:x.start(),threads) 
  q.join() 

代碼轉(zhuǎn)自:
http://www.jb51.net/article/86615.htm

還有個很好的:


# -*- coding: utf-8 -*-
__author__ = 'Phtih0n'
import threading, socket, sys, cmd, os, Queue
#掃描常用端口
PortList = [21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015]
#得到一個隊列
def GetQueue(list):
    PortQueue = Queue.Queue(65535)
    for p in list:
        PortQueue.put(p)
    return PortQueue
#單IP掃描線程個數(shù)
nThread = 20
#線程鎖
lock = threading.Lock()
#超時時間
Timeout = 3.0
#打開的端口列表
OpenPort = []
class ScanThread(threading.Thread):
    def __init__(self, scanIP):
        threading.Thread.__init__(self)
        self.IP = scanIP
    def Ping(self, Port):
        global OpenPort, lock, Timeout
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(Timeout)
        address = (self.IP, Port)
        try:
            sock.connect(address)
        except:
            sock.close()
            return False
        sock.close()
        OpenPort.append(Port)
        if lock.acquire():
            print "IP:%s  Port:%d" % (self.IP, Port)
            lock.release()
        return True

class ScanThreadSingle(ScanThread):
    def __init__(self, scanIP, SingleQueue):
        ScanThread.__init__(self, scanIP)
        self.SingleQueue = SingleQueue
    def run(self):
        while not self.SingleQueue.empty():
            p = self.SingleQueue.get()
            self.Ping(p)

class ScanThreadMulti(ScanThread):
    def __init__(self, scanIP, PortList):
        ScanThread.__init__(self, scanIP)
        self.List = PortList[:]
    def run(self):
        for p in self.List:
            self.Ping(p)
class Shell(cmd.Cmd):
    u'''Py Port Scanner 0.1 使用說明:
    port [port..] 設(shè)置掃描的端口,用逗號分隔。
        默認(rèn):21, 22, 23, 25, 80, 135, 137, 139, 445, 1433, 1502, 3306, 3389, 8080, 9015
        example:port 21,23,25
        example: port 1000..2000
        example: port 80,443,1000..1500
    scan [IP] 掃描某一IP地址
        example: scan 192.168.1.5
    search [IP begin]-[IP end] 掃描某一IP段
        example: search 192.168.1.1-192.168.1.100
    time [timeout] 設(shè)置超時時間,默認(rèn)為3秒
        example: time 5
    cls 清楚屏幕內(nèi)容
    listport 打印端口列表
    help 打開本幫助
        '''
    def __init__(self):
        cmd.Cmd.__init__(self)
        reload(sys)
        sys.setdefaultencoding('utf-8')
        self.prompt = "Port Scan >>"
        self.intro = "Py Port Scanner 0.1"
    def do_EOF(self, line):
        return True
    def do_help(self, line):
        print self.__doc__
    #設(shè)置端口
    def do_port(self, line):
        global PortList
        PortList = []
        ListTmp = line.split(',')
        for port in ListTmp:
            if port.find("..") < 0:
                if not port.isdigit():
                    print "輸入錯誤"
                    return False
                PortList.append(int(port))
            else:
                RangeLst = port.split("..")
                if not (RangeLst[0].isdigit() and RangeLst[1].isdigit()):
                    raise ValueError
                    exit()
                for i in range(int(RangeLst[0]), int(RangeLst[1])):
                    PortList.append(i)
    def do_scan(self, line):
        global nThread, PortList
        ThreadList = []
        strIP = line
        SingleQueue = GetQueue(PortList)
        for i in range(0, nThread):
            t = ScanThreadSingle(strIP, SingleQueue)
            ThreadList.append(t)
        for t in ThreadList:
            t.start()
        for t in ThreadList:
            t.join()
    def do_search(self, line):
        global nThread, PortList
        ThreadList = []
        (BeginIP, EndIP) = line.split("-")
        try:
            socket.inet_aton(BeginIP)
            socket.inet_aton(EndIP)
        except:
            print "輸入錯誤"
            return
        IPRange = BeginIP[0:BeginIP.rfind('.')]
        begin = BeginIP[BeginIP.rfind('.') + 1:]
        end = EndIP[EndIP.rfind('.') + 1:]
        for i in range(int(begin), int(end)):
            strIP = "%s.%s" % (IPRange, i)
            t = ScanThreadMulti(strIP, PortList)
            ThreadList.append(t)
        for t in ThreadList:
            t.start()
        for t in ThreadList:
            t.join()
    def do_listport(self, line):
        global PortList
        for p in PortList:
            print p,
        print '\n'
    def do_time(self, line):
        global Timeout
        try:
            Timeout = float(line)
        except:
            print u"參數(shù)錯誤"
    def do_cls(self, line):
        os.system("cls")

if '__main__' == __name__:
    try:
        os.system("cls")
        shell = Shell()
        shell.cmdloop()
    except:
        exit()

轉(zhuǎn)自:
http://www.jb51.net/article/60165.htm

要學(xué)的還有很多。先練習(xí)下。先從模仿別人學(xué)起。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容