具有线程的Python端口扫描程序

时间:2016-11-16 00:55:09

标签: python multithreading

我正在尝试用Python创建一个端口扫描程序。我得到扫描仪,但打印结果需要45分钟。我开始设置线程但是我无法弄清楚如何将不同的范围放入脚本中。我开始创建一个全局变量并尝试在每个线程中传递它。不幸的是它没有正常工作,我得到一个无效的语法错误。以下是代码。

import socket
import os
import sys
from threading import Thread

server = raw_input("Please enter a server name ")

def portConnect():

    global num 

    try:
        serv_ip = socket.gethostbyname(server) # connects to server through try
        print "Please wait, scanning remote host", serv_ip

        for port in range(num):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            connect =  sock.connect_ex((serv_ip, port))
            if connect == 0:
                print "Port {}: Open".format(port)
        sock.close()

    except socket.gaierror:
        print """
        I can't find that server, idiot! Try again
        """ 
        sys.exit()          

for i in range(1):
    t = Thread(target=portConnect,(num=100))
    t.start()

我做错了什么?

2 个答案:

答案 0 :(得分:1)

线程期望args=作为元组,并将其作为参数发送到函数

这样您就可以100作为第一个参数(num)发送给portConnect()

 def portConnect(num):
     print(num)
     # code

 t = Thread(target=portConnect, args=(100,) )

要发送范围,您需要两个参数

def portConnect(from_, to_):
    print(from_, to_)
    for port in range(from_, to_):
        # ...

size = 20
for i in range(1, 100, size):
    t = Thread(target=portConnect, args=(i, i+size))
    t.start()

BTW:模块scapy允许您发送单个数据包,因此它用于端口扫描,嗅探等。

您可以使用nmap(GUI包装器:Zenmap)或Kali Linux

等特殊工具执行更多操作

您可以尝试在Python中使用nmappython-nmap : nmap from python

答案 1 :(得分:0)

你可以使用nmap轻松解决这个问题。

nmap -p- <some_host>