python - 多线程端口扫描器

标签 python multithreading sockets python-2.7

是的,是的,我知道我可以只使用 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/

相关文章:

python - 如果某行包含 pandas 中的某个值,则删除该行

python - 两全其美 : python packaging for a game

c# - C# 多线程下载器

java - 我无法将套接字从 android 客户端连接到 java 服务器

python - pandas DataFrame.join 的运行时间(大 "O"顺序)是多少?

Python 正则表达式(\..+)?

java - 线程不工作

使用 boost asio 的 C++ 线程

linux - Sockets、传输类型、端口号、IP之间的关系

java - 套接字关闭异常