版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。
我就看了幾天的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()
這裡寫圖檔描述
不用線程,一個一個去連接配接,因為是阻塞的,真的真的是異常的慢。。。
上網查了下别人是怎麼寫的:
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要學的還有很多。先練習下。先從模仿别人學起。