python 多线程端口扫描
时间: 2023-06-05 12:47:29 浏览: 159
python实现多线程端口扫描
Python 中可以通过多线程实现端口扫描,实现快速扫描目标主机上哪些端口是开放状态的,从而可以进一步确认主机的安全状况。
多线程端口扫描原理是:主线程开启多个子线程执行端口扫描任务,每个子线程单独扫描一部分端口,将结果存储到共享变量中,主线程最后将这些结果合并并输出。
下面是一个基本的 Python 多线程端口扫描程序:
```python
import threading
import socket
target = '127.0.0.1' # 目标主机
start_port = 1 # 扫描的起始端口
end_port = 100 # 扫描的终止端口
open_ports = [] # 存放开放端口的列表
def scan(port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
try:
s.connect((target, port))
open_ports.append(port)
s.close()
except:
pass
def main():
for port in range(start_port, end_port + 1):
t = threading.Thread(target=scan, args=(port,))
t.start()
for t in threading.enumerate():
if t != threading.current_thread():
t.join()
open_ports.sort()
for port in open_ports:
print(f'Port {port} is open')
if __name__ == '__main__':
main()
```
这个程序定义了一个扫描函数 scan(),使用 socket 模块创建 TCP 套接字 s,设置 timeout 时间为 0.5 秒,然后通过 connect() 方法连接目标主机的某个端口,如果连接成功则将端口号添加到 open_ports 列表中。
在主函数中,使用 for 循环创建多个子线程,每个子线程执行一次 scan() 函数来扫描一个端口号。然后通过 threading.enumerate() 方法获取当前所有线程的列表,再使用 join() 方法等待所有子线程完成,最后按端口号从小到大排序,输出所有开放的端口。
需要注意的是,端口扫描是一种比较敏感的操作,因此需要获得目标主机的合法授权后进行,否则可能会对目标主机造成安全风险。
阅读全文