Как я могу узнать, работает ли мой сканер портов?

Я делаю сканер портов, который проверяет, открыты или закрыты порты, но я убежден, что он не работает, поскольку перечисляет все порты как закрытые, даже порты, которые я специально открыл, просто чтобы проверить, работает ли он. Кто-нибудь может увидеть что-то не так с моим кодом?

    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()

1 ответ

Это только проверяет, есть ли какая-либо программа, слушающая указанный порт.

Чтобы увидеть, работает ли это или нет, сначала удалите блок try, чтобы узнать, какая ошибка возвращается. Затем используйте правильную ошибку при обработке исключений, т. Е. Если ваша машина не подключена к сети, попытка не удастся, а также при невозможности подключения. Также вам нужно будет ввести таймауты, чтобы при подключении сокет не зависал.

Чтобы увидеть, что ваш код что-то делает с целевой машиной, активируйте там брандмауэр и настройте его, чтобы уведомлять вас, если кто-то делает то, что вы сделали. Ваш код может также потерпеть неудачу, если ваш маршрутизатор / коммутатор запрещает сканирование портов в вашей сети. Вы должны проверить его настройки брандмауэра тоже.

Вам также не хватает блока исключений в вашем коде, и попытка в любом случае не в том месте. Вы должны проверить каждое соединение:

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

Хотя вы должны использовать, например:

except socket.SocketError as error:

а затем проверьте номер ошибки и т. д. в переменной error, где будет сохранено исключение.

О, кстати, socket.socket.connect() возвращает None, поэтому ваша проверка всегда будет ложной. Это не C, это Python.

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

Try-кроме сообщит вам, прошло ли соединение или не удалось, с гораздо большей информацией.

Другие вопросы по тегам