Python扫描IP段查看指定端口是否开放的方法
本文实例讲述了Python扫描IP段查看指定端口是否开放的方法。分享给大家供大家参考。具体实现方法如下:
#!/usr/local/bin/python
#-*-coding:UTF-8-*-
####################################################################
##################################################
#BLOG:http://hi.baidu.com/alalmn
#Python扫描IP段指定端口是否开放
##################################################
importsocket
importthreading,time
socket.setdefaulttimeout(10)#设置了全局默认超时时间
#查看IP端口是否开放
classsocket_port(threading.Thread):
def__init__(self,cond,name):
super(socket_port,self).__init__()
self.cond=cond
self.cond.set()#将标识位设为Ture
self.HOST=name
defrun(self):
#time.sleep(1)#确保先运行Seeker中的方法
try:
PORT=21
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((self.HOST,PORT))
print""
printself.HOST,u":",PORT,u"端口开放"
#self.cond.wait()#堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。
self.cond.set()#将标识位设为Ture
return1
except:
print".",
#printself.HOST,u":",PORT,u"端口未开放"
#self.cond.wait()#堵塞线程,直到Event对象内部标识位被设为True或超时(如果提供了参数timeout)。
self.cond.set()#将标识位设为Ture
return0
##
#socket_port("192.168.2.1")
#ifsocket_port("192.168.2.100"):
#print"开放"
#else:
#print"未开放"
defip2num(ip):
ip=[int(x)forxinip.split('.')]
returnip[0]<<24|ip[1]<<16|ip[2]<<8|ip[3]
defnum2ip(num):
#time.sleep(0.05)#50ms
#time.sleep(0.1)#s
#data='%s.%s.%s.%s'%((num&0xff000000)>>24,
#(num&0x00ff0000)>>16,
#(num&0x0000ff00)>>8,
#num&0x000000ff)
##socket_port(data)#查看IP端口是否开放
ifnum>=IPend:
printu"IP导入数组完成"
return'%s.%s.%s.%s'%((num&0xff000000)>>24,
(num&0x00ff0000)>>16,
(num&0x0000ff00)>>8,
num&0x000000ff)
defgen_ip(ip1,ip2):#返回数组
#ip
#globalIPend
#start,IPend=[ip2num(x)forxinip.split('-')]
globalIPend
IPend=ip2
return[num2ip(num)fornuminrange(ip1,ip2+1)ifnum&0xff]
importini
if__name__=='__main__':
ini.ini_get()#读取INI
list_ip=gen_ip(ip2num(ini.IP1),ip2num(ini.IP2))
I1=0#得到list的第一个元素
printu"开始扫描IP"
ip=0
whileI1<len(list_ip):
#printlist_ip[I1]
time.sleep(0.3)#确保先运行Seeker中的方法
cond=threading.Event()
hider=socket_port(cond,list_ip[I1])
hider.start()
ifip>=255:
ini.ini_write(list_ip[I1],ini.IP2)#修改INI
printip
ip=0
ip=ip+1
I1=I1+1#一层
ini.py:
#!/usr/local/bin/python
#-*-coding:UTF-8-*-
##################################################
#qq:316118740
#BLOG:http://hi.baidu.com/alalmn
#Python操作ini文件
#刚学写的不好请大家见谅
##################################################
IP1=""#扫描IP
IP2=""#当前已经扫到的IP
INITXT="IP.ini"#INI文件名字
importConfigParser
defini_get():#读取INI
try:
globalIP1
globalIP2
globalINITXT
config=ConfigParser.ConfigParser()
config.readfp(open(INITXT))
IP1=config.get("ipdata","ip1")
IP2=config.get("ipdata","ip2")
except:
print"读取INI错误"
ini_add("","")#写入INI
defini_add(ip1,ip2):#写入INI
try:
globalINITXT
config=ConfigParser.ConfigParser()
config.add_section("ipdata")#设置section段及对应的值
config.set("ipdata","ip1",ip1)
config.set("ipdata","ip2",ip2)
config.write(open(INITXT,"w"))#写入文件
except:
print"写入INI错误"
defini_write(ip1,ip2):#修改INI
try:
globalINITXT
config=ConfigParser.ConfigParser()
config.read(INITXT)
ifnotconfig.has_section("ipdata"):#看是否存在该Section,不存在则创建
temp=config.add_section("")
config.set("ipdata","ip1",ip1)
config.set("ipdata","ip2",ip2)
config.write(open(INITXT,"r+"))
except:
print"修改INI错误"
ini_add("","")#写入INI
#if__name__=='__main__':
##ini_get()#读取INI
##printIP1
##printIP2
#
##ini_add("222222222","3333333333333")#写入INI
##ini_get()#读取INI
##printIP1
##printIP2
#
#ini_write("999999999","0000000000")#修改INI
#ini_get()#读取INI
#printIP1
#printIP2
运行:
pythonTCP21.py
希望本文所述对大家的Python程序设计有所帮助。