下面我将详细介绍如何实现Python多线程端口扫描功能。
1. 获取目标主机IP地址
要进行端口扫描,首先需要获取目标主机的IP地址。我们可以使用Python自带的socket库来获取。
import socket
target_host = "localhost"
target_ip = socket.gethostbyname(target_host)
在上面的代码中,我们通过socket.gethostbyname()函数获取到了主机名对应的IP地址,返回的是一个字符串类型的地址。接下来需要确定要扫描的端口范围。
2. 确定端口范围
我们可以通过一个包含起始和结束端口的元组来确定要扫描的端口范围。比如,我们要扫描1000-2000之间的端口,可以这样定义一个元组:
port_range = (1000, 2000)
3. 进行端口扫描
接下来就是核心部分:多线程端口扫描。
import threading
def port_scan(target_ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((target_ip, port))
if result == 0:
print("[+] Port {} is open".format(port))
sock.close()
for port in range(port_range[0], port_range[1]+1):
t = threading.Thread(target=port_scan, args=(target_ip, port))
t.start()
在上面的代码中,我们定义了一个函数port_scan,用来扫描单个端口。在for循环中,我们使用threading.Thread来创建多个线程,每个线程执行port_scan函数扫描一个端口。在端口开放的情况下,打印出相应的消息。
需要注意的是,我们在使用socket时,设置了socket连接的超时时间为1秒钟,以防止程序的阻塞。
示例说明
下面给出两个示例说明:
- 示例1:扫描本地主机上的1000-2000端口范围
import socket
import threading
target_host = "localhost"
target_ip = socket.gethostbyname(target_host)
port_range = (1000, 2000)
def port_scan(target_ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((target_ip, port))
if result == 0:
print("[+] Port {} is open".format(port))
sock.close()
for port in range(port_range[0], port_range[1]+1):
t = threading.Thread(target=port_scan, args=(target_ip, port))
t.start()
- 示例2:扫描远程主机上的80端口
import socket
target_host = "www.baidu.com"
target_ip = socket.gethostbyname(target_host)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
def port_scan(port):
result = sock.connect_ex((target_ip, port))
if result == 0:
print("[+] Port {} is open".format(port))
port_scan(80)
sock.close()
在示例2中,我们只需要扫描一个端口,所以不需要使用多线程。需要注意的是,我们打开连接时设置了2秒的超时时间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现的多线程端口扫描功能示例 - Python技术站