Python-利用线程和队列完成简单端口扫描
在学习网络安全的过程中,需要对服务器的端口进行扫描,查看可用端口,所以编写了这段程序。在使用过程中发现多IP、多端口扫描时效率很低,为了充分利用性能,使用了多线程的概念。
功能解析
- SOCKET ,利用socket.connect选项尝试连接服务器的端口;
- threading ,利用多线程使每个IP的端口测试同步进行;
- queue ,利用队列完成线程的管理;
使用详情
这里举例测试了本地环回接口127.0.0.1和本机虚拟机运行的CentOS服务器的10000-10005端口。
详细代码
import socket
import queue
import threading
def get_port_status(ip , port_start , port_stop):
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
for port in range(port_start , port_stop+1):
try:
server.connect((ip,port))
print('{0} port {1} is open'.format(ip,port))
except Exception as err:
print('{0} port {1} is not open'.format(ip,port))
finally:
server.close()
def get_queue(q):
try:
while not q.empty():
server_adit = q.get()
ip = server_adit.get('ip')
port_start = server_adit.get('port_start')
port_stop = server_adit.get('port_stop')
get_port_status(ip,port_start,port_stop)
except queue.Empty() as e:
pass
print('端口扫描程序开始')
q = queue.Queue()
num = int( input('请输入要扫描的IP个数:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200708140901396.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dlaUdvZDAxMjI=,size_16,color_FFFFFF,t_70)') )
for n in range(num):
print('以下是第 {0} 个终端的信息'.format(n+1))
ip = input('请输入要扫描的IP地址:')
port_start = int(input('请输入要扫描的起始端口号:'))
port_stop = int(input('请输入要扫描的终点端口号:'))
q.put( {'ip':ip , 'port_start':port_start , 'port_stop':port_stop} )
for i in range(num):
t = threading.Thread(target=get_queue , args=(q,))
t.start()
t.join