是的,是的,我知道我可以只使用 nmap,但我想自己尝试一下。
我正在尝试编写一个线程脚本来查找目标 IP 地址上的开放端口。这是我现在拥有的:
import socket, Queue
from threading import Thread
print "Target to scan: "
targetIP = raw_input("> ")
print "Number of threads: "
threads = int(raw_input("> "))
q = Queue.Queue()
# Fill queue with port numbers
for port in range(1, 1025):
q.put(port)
def scan(targetIP, port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(4)
result = s.connect_ex((targetIP, port))
if result == 0:
print 'Port {0} is open'.format(port)
s.close
q.task_done()
while q.full:
for i in range(threads):
port = q.get()
t = Thread(target=scan, args =(targetIP, port))
t.daemon = True
t.start()
但是我有几个问题:
1) 当我按原样运行它时,它会遍历端口队列但随后只是挂起,即使队列为空也不会从 while
循环中断。
2) 如果我在 scan
中添加一个打印行以查看发生了什么,基本上在开头添加一个“Scanning port X”行,并在最后,stdout 被队列中所有端口的“扫描端口”行淹没,然后打印结果行。意思是,看起来当前脚本并没有在等待 result
获取值,而是继续迭代就好像它已经获取了值一样。
我在这里做错了什么?
最佳答案
你的实际问题已经被一些人回答了,所以这里有一个使用 multiprocessing.Pool
而不是 threading
的替代解决方案:
import socket
from multiprocessing import Pool
def scan(arg):
target_ip, port = arg
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
try:
sock.connect((target_ip, port))
sock.close()
return port, True
except (socket.timeout, socket.error):
return port, False
if __name__ == '__main__':
target_ip = raw_input('Target IP: ')
num_procs = int(raw_input('Number of processes: '))
ports = range(1, 1025)
pool = Pool(processes=num_procs)
for port, status in pool.imap_unordered(scan, [(target_ip, port) for port in ports]):
print port, 'is', 'open' if status else 'closed'
关于python - 多线程端口扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16780055/