Парсер Python Nmap

Я играю с парсером nmap для python, расположенным по адресу (http://xael.org/norman/python/python-nmap/). Он предоставляет пример фрагмента кода, который я использовал в сценарии .py для выполнения рутинных проверок, автоматизируя некоторые задачи. Однако я получаю сообщение об ошибке в строке 25. Может кто-нибудь, пожалуйста, помогите мне..?

import nmap

nm = nmap.PortScanner()

nm.scan('127.0.0.1', '22-2223')
nm.command_line()
nm.scaninfo()

for host in nm.all_hosts():
    print('----------------------------------------------------')
    print('Host : %s (%s)' % (host, nm[host].
    print('State : %s' % nm[host].state())
    for proto in nm[host].all_protocols():
         print('----------')
         print('Protocol : %s' % proto)
         lport = nm[host][proto].keys()
         lport.sort()
         for port in lport:
             print ('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
             print('----------------------------------------------------')

ОШИБКА Ниже:

    root@server:~/python/python# python MyApp.py 
    ----------------------------------------------------
    Host : 127.0.0.1 (localhost)
    State : up
    ----------
    Protocol : addresses
    Traceback (most recent call last):
      File "MyApp.py", line 25, in <module>
        print ('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
    TypeError: string indices must be integers
    root@damnation:~/python/python# 

Строка 25 — это предпоследняя строка печати снизу. 'порт: %s\tstate: %s' % (порт, nm[хост][прото][порт]'.

Будем признательны любому совету. благодарю вас .


person Dusty Boshoff    schedule 10.02.2014    source источник
comment
Порт является целым числом, поэтому либо используйте str(port), чтобы преобразовать его в строку в строке 25, либо измените формат оператора печати на '%d' для целого числа.   -  person hd1    schedule 10.02.2014
comment
Thnx, я попробовал оба ваших предложения, но у меня все еще есть та же проблема.   -  person Dusty Boshoff    schedule 10.02.2014
comment
если я полностью удалю «состояние», я получу этот вывод ---> порт: 80 состояние: {'продукт': u'lighttpd', 'состояние': u'open', 'версия': u'1.4.28', 'имя': u'http', 'conf': u'10', 'extrainfo': '', 'причина': u'syn-ack', 'cpe': ''}   -  person Dusty Boshoff    schedule 10.02.2014
comment
Как насчет print('port : '+port+'\tstate : '+ nm[host][proto][port]['state'])? Что это за распечатка? Я предполагаю, что ваш объект состояния не является строкой.   -  person hd1    schedule 11.02.2014
comment
привет, hd1, он возвращает следующий файл MyApp.py, строка 22, в ‹module› print('port : '+port+'\tstate : '+ nm[host][proto][port]['state']) TypeError : строковые индексы должны быть целыми числами. Та же ошибка.   -  person Dusty Boshoff    schedule 11.02.2014
comment
Вот так сейчас выглядит скрипт. pastebin.com/KRWwQUgr   -  person Dusty Boshoff    schedule 11.02.2014
comment
И... что на выходе?   -  person hd1    schedule 11.02.2014
comment
выложил уже. Файл MyApp.py, строка 22, в ‹module› print('port : '+port+'\tstate : '+ nm[host][proto][port]['state']) TypeError: строковые индексы должны быть целыми числами. Та же ошибка.   -  person Dusty Boshoff    schedule 11.02.2014
comment
давайте продолжим это обсуждение в чате   -  person hd1    schedule 11.02.2014


Ответы (1)


Я обнаружил, что указание прототипа в параметре lport позволяет циклу for правильно видеть строки в dict. Ниже приведен правильный скрипт, который позволяет корректно работать синтаксическому анализатору python-nmap. Очевидно, что пакет for обслуживает только TCP, однако для требования UDP будет достаточно других параметров с пакетом for.

    import nmap                         # import nmap.py module

    nm = nmap.PortScanner()
    host = '127.0.0.1'
    nm.scan(host, '1-1024')
    nm.command_line()
    nm.scaninfo()

    for host in nm.all_hosts():
        print('----------------------------------------------------')
        print('Host : %s (%s)' % (host, nm[host].hostname()))
        print('State : %s' % nm[host].state())
        print('----------------------------------------------------')

    for proto in nm[host].all_protocols():
            print('----------')
            print('Protocol : %s' % proto)

    lport = nm[host]['tcp'].keys()   #<------ This 'proto' was changed from the [proto] to the ['tcp'].
    lport.sort()
    for port in lport:
                    print('----------------------------------------------------')
                    print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
                    print('----------------------------------------------------')

Я не эксперт по python (пока), и мне помог друг (Tx AdriaanDL :)). Однако это решает проблему, с которой я столкнулся с этим образцом, который разработчики nmap.py разместили на своем веб-сайте.

person Dusty Boshoff    schedule 12.02.2014