天天看點

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

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

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

就是基于socket,每個端口去連一下能傳回資訊就是開啟的。一想這麼的沒必要。

可以去連接配接,異常出錯就是沒有開啟。

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

但是有的連接配接要很長時間,那麼設定時間:

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

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

這裡寫圖檔描述

不用線程,一個一個去連接配接,因為是阻塞的,真的真的是異常的慢。。。

上網查了下别人是怎麼寫的:

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

代碼轉自:

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掃描線程個數
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..] 設定掃描的端口,用逗号分隔。
        預設: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] 設定逾時時間,預設為3秒
        example: time 5
    cls 清楚螢幕内容
    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__
    #設定端口
    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"參數錯誤"
    def do_cls(self, line):
        os.system("cls")

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

轉自:

http://www.jb51.net/article/60165.htm

要學的還有很多。先練習下。先從模仿别人學起。