python调用nmap脚本_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()

这里写图片描述

不用线程,一个一个去连接,因为是阻塞的,真的真的是异常的慢。。。

上网查了下别人是怎么写的:

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

还有个很好的:

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

要学的还有很多。先练习下。先从模仿别人学起。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值