是的,是的,我知道我可以只使用 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
查看发生了什么,基本上在开头添加一个“扫描端口 X”行,print result
在末尾添加一行,stdout 会被队列中所有端口的“扫描端口”行淹没,然后打印结果行。意思是,看起来当前脚本并没有等待result
获取值,而是继续迭代,就好像它有一样。
我在这里做错了什么?