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()  

這里寫圖片描述

不用線程固蚤,一個一個去連接娘汞,因為是阻塞的,真的真的是異常的慢夕玩。你弦。。
上網(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è)置掃描的端口燎孟,用逗號分隔禽作。
        默認: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è)置超時時間,默認為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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萍程,隨后出現(xiàn)的幾起案子幢妄,更是在濱河造成了極大的恐慌,老刑警劉巖茫负,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉鸳,死亡現(xiàn)場離奇詭異,居然都是意外死亡忍法,警方通過查閱死者的電腦和手機置吓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缔赠,“玉大人,你說我怎么就攤上這事友题∴脱撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵度宦,是天一觀的道長踢匣。 經(jīng)常有香客問我,道長戈抄,這世上最難降的妖魔是什么离唬? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮划鸽,結(jié)果婚禮上输莺,老公的妹妹穿的比我還像新娘。我一直安慰自己裸诽,他們只是感情好嫂用,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丈冬,像睡著了一般嘱函。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埂蕊,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天往弓,我揣著相機與錄音,去河邊找鬼蓄氧。 笑死函似,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的喉童。 我是一名探鬼主播缴淋,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了重抖?” 一聲冷哼從身側(cè)響起露氮,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钟沛,沒想到半個月后畔规,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡恨统,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年叁扫,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜埋。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡莫绣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悠鞍,到底是詐尸還是另有隱情对室,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布咖祭,位于F島的核電站掩宜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏么翰。R本人自食惡果不足惜牺汤,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浩嫌。 院中可真熱鬧檐迟,春花似錦、人聲如沸码耐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐坏。三九已至怔匣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桦沉,已是汗流浹背每瞒。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纯露,地道東北人剿骨。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像埠褪,于是被迫代替她去往敵國和親浓利。 傳聞我的和親對象是個殘疾皇子挤庇,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容