Неправильное тестирование TCP-порта с помощью `ip = ipaddress.ip_address (args.ip)` - PullRequest
0 голосов
/ 22 декабря 2018

В этой тестовой машине tcp/80 прослушивает, а tcp/4444 нет.(Я уже проверил это с помощью netstat -an)

Если я просто передам args.ip значение ip и перенаправлю его в функцию scan(), результат сканирования всегда будет точным.

ip = args.ip

Нормальный вывод:

C:\>python script.py 127.0.0.1
Port number: 80
Connecting to 127.0.0.1:80
OK 127.0.0.1:80

C:\>python script.py 127.0.0.1
Port number: 4444
Connecting to 127.0.0.1:4444
FAIL 127.0.0.1:4444

C:\>

Однако, когда я пытаюсь проверить IP-адрес с помощью следующей функции

ip = ipaddress.ip_address(args.ip)

результат сканирования всегда неверен.

Неверный вывод ... tcp / 80 запущен и работает:

C:\>python script.py 127.0.0.1
Port number: 80
Connecting to 127.0.0.1:80
FAIL 127.0.0.1:80

Что не так с этим кодом?

import socket, argparse, ipaddress

def main():
    global ip
    parser = argparse.ArgumentParser()
    parser.add_argument('-u')
    group = parser.add_mutually_exclusive_group()
    group.add_argument('-i')
    group.add_argument('ip', nargs='?')
    args = parser.parse_args()
    if args.i:                                      
        print("IP Address is .. " + args.i)
    elif args.ip:                                   
        ip = ipaddress.ip_address(args.ip)          # Prob
        #ip = args.ip                               # OK
        scan()
    elif args.u:
        print("URL is " + args.u)
    else:
        print('No argument provided')

def scan():
    port = input('Port number: ')
    print('Connecting to %s:%s' % (ip,port))    
    try:
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, int(port)))
        print('OK %s:%s' % (ip, port))
    except:
        print('FAIL %s:%s' % (ip, port))

main()

Можно ли будет проверить IP-адрес, а затем переслать его в другую функцию, и при этом пройти проверку правильности сканирования порта?

1 Ответ

0 голосов
/ 22 декабря 2018

Вы пытаетесь передать IPv4Address вместо строки в s.connect.

Было бы более очевидно, если бы вы не использовали универсальный except.Вот что вы получите без него:

thierry@amd:~$ python3 test.py 127.0.0.1
Port number: 80
Connecting to 127.0.0.1:80
Traceback (most recent call last):
  File "test.py", line 32, in <module>
    main()
  File "test.py", line 16, in main
    scan()
  File "test.py", line 27, in scan
    s.connect((ip, int(port)))
TypeError: str, bytes or bytearray expected, not IPv4Address

Просто используйте str(ip) вместо ip:

def scan():
    port = input('Port number: ')
    print('Connecting to %s:%s' % (ip,port))    
    try:
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((str(ip), int(port)))  # ip is an IPv4Address
        print('OK %s:%s' % (ip, port))   # no problem here, str will be used for print
    except ValueError:
        print('FAIL %s:%s' % (ip, port))

thierry@amd:~$ python3 test.py 127.0.0.1
Port number: 80
Connecting to 127.0.0.1:80
OK 127.0.0.1:80

Вы также можете изменить свойexcept: в except ConnectionRefusedError:, чтобы избежать нечеткого определения всех исключений.

...