1

我正在制作一个端口扫描器来检查端口是打开还是关闭,但我确信它不起作用,因为它将每个端口都列为关闭,即使是我专门打开只是为了检查它是否工作的端口。任何人都可以看到我的代码有什么问题吗?

    if  userChoice == "1":
    # code for option 1
    print("You selected Port Scan Tool")
    loop = 0
    subprocess.call('cls', shell=True)
    remoteServer = input("Enter a remote host to scan: ")
    start=input("Enter starting port number: ")
    start = int(start)
    end=input("Enter ending port number: ")
    end = int(end)
    remoteServerIP = socket.gethostbyname(remoteServer)

    # Print a nice banner with information on which host we are about to scan
    print ("-" * 60)
    print("Please wait, scanning remote host", remoteServerIP)
    print("-" * 60)

    # Check what time the scan started
    t1 = datetime.now()
    timestr = time.strftime("%d.%m.%Y-%H.%M.%S")# creates time stamp on text file

    try:
        textFileLocation = timestr + " -  Port Scan Results.txt"# creates and names text file
        for port in range(start, end):  # lets user select range
            sock = (socket.socket(socket.AF_INET, socket.SOCK_STREAM))
            result = sock.connect_ex((remoteServerIP, port))
            if result == 0:
                print("Port {}: \t Open".format(port))
                #print("Port {}: \t Closed".format(port))
                #print("Port {} \t Closed".format(port))
                textFileLocation = timestr + " - Port Scan Results.txt"
                textFile = open(textFileLocation, "a")
                textToWrite = "Open: Port %d\n" % port
                textFile.write(textToWrite)
                textFile.close()
            else:
                print("Port {}: \t Closed".format(port))
                textFileLocation = timestr + " - Port Scan Results.txt"
                textFile = open(textFileLocation, "a")
                textToWrite = "Closed: Port %d\n" % port
                textFile.write(textToWrite)
                textFile.close()
            sock.close()
4

1 回答 1

2

这仅测试是否有任何程序在该端口上侦听。

要查看这是否有效,请首先删除 try 块以查看返回的错误。然后在异常处理中使用正确的错误,即如果您的机器不在网络上,尝试将失败以及无法连接时。此外,您将不得不引入超时,以便套接字不会在尝试连接时挂起。

要查看您的代码是否对目标机器执行任何操作,请在此处激活防火墙并将其设置为通知您是否有人正在执行您所做的操作。如果您的路由器/切换器阻止网络上的端口扫描,您的代码也可能会失败。您也应该检查其防火墙设置。

您还缺少代码中的 except 块,并且无论如何 try 都在错误的位置。您必须测试每个连接:

for x in range(...):
    try:
        s = socket.socket(...)
        s.connect(...)
        s.close()
    except: pass

尽管您应该使用例如:

except socket.SocketError as error:

然后检查将存储异常的变量错误中的错误号等。

哦,顺便说一句,socket.socket.connect() 返回无,所以你的检查总是假的。这不是 C,它的 Python。

>>> ...
>>> result = sock.connect(...)
>>> print result
None

Try-except 将通过更多信息告诉您连接是通过还是失败。

于 2017-05-28T14:17:06.517 回答