> 这里是引用
import socket,gevent,time
import gevent.monkey
import gevent.pool
class Scan_Plus_V5():
def scan_port(self,ip,port):
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.settimeout(0.5)
try:
result = sk.connect_ex((ip,port))
if result == 0:
print(f'主机:{ip},端口:{port}已开放>>>>')
Scan_Plus_V5().write_text(f'主机:{ip},端口:{port}已开放>>>>\n')
except:
pass
sk.close()
def gevent_scan_port(self,ip):
gevent.monkey.patch_all() #非阻塞方式。在操作IO的時候,立馬切換到其他的协程運行!
g = gevent.pool.Pool(500) # 限制协程数
start_time = time.time()
RunList = [] # 设置协程池
for one in range(1,65536):
RunList.append(g.spawn(Scan_Plus_V5().scan_port,ip,one))
gevent.joinall(RunList) # 阻塞,↑↓,直到运行结束,主线程退出
end_time = time.time()
print(f'扫描端口花费:{end_time}~{start_time}')
Scan_Plus_V5().write_text(f'扫描端口花费:{end_time}~{start_time}\n')
def input(self):
result = input('请输入域名或者ip,我们会为您扫描开放的端口,请耐心等待>>>>\n')
if ("http:" in result or "https:" in result) or "www." in result:
try:
self.ip_addres = socket.gethostbyname(result)
print(f'您输入的域名:{result},解析出的端口为:{self.ip_addres}')
Scan_Plus_V5().write_text(f'您输入的域名:{result},解析出的端口为:{self.ip_addres}\n')
return self.ip_addres
except:
print('"您输入的端口不正确!"')
else:
Scan_Plus_V5().gevent_scan_port(result)
@staticmethod
def write_text(info):
f = open("port_scan_result",'a',encoding='utf-8')
f.write(info)
f.close()
Scan_Plus_V5().gevent_scan_port(Scan_Plus_V5().input())
利用协程技术,完成对域名/ip地址的端口扫描
最新推荐文章于 2023-05-28 14:09:13 发布