NMAP Python TypeError: строковые индексы должны быть целыми числами

Я выполняю функцию сканирования портов с помощью nmap. Однако я получил эту ошибку типа строковых индексов, которые должны быть целыми числами. Можете помочь, где я ошибся?

        self.txtarea.Clear()    
        targetServerinput = self.targethost_input.GetValue()
        if len(targetServerinput) == 0:
            empty_error = wx.MessageDialog(None,"There is no input.\nPlease Try Again.","",wx.OK|wx.ICON_ERROR)
            empty_error.ShowModal()
        else:
            try:        
                targetServerIP = socket.gethostbyname(targetServerinput)    
                nm = nmap.PortScanner()
                nm.scan(targetServerIP,'1-1024')
                nm[targetServerIP]['tcp'].keys()
                for host in nm.all_hosts():
                    print('----------------------------------------------------')
                    print('Host : %s (%s)' % (host, nm[host].hostname()))
                        print('State : %s' % nm[host].state())
                        for proto in nm[host].all_protocols():
                         print('----------')
                             lport = nm[host][proto].keys()
                             lport.sort()
                             for port in lport:
                                print('port : %s\tstate : %s' %(port,nm[host][proto][port]['state']))

                #targetServerResult = str(targetServerIP)
            except socket.gaierror:
                name_error = wx.MessageDialog(None,"Name or service not known\nPlease Try Again.","",wx.OK|wx.ICON_ERROR)
                name_error.ShowModal()

Я получил эту ошибку -

Traceback (most recent call last):
  File "wxloginv1.py", line 168, in scan_btnClick
    print('port : %s\tstate : %s' %(port,nm[host][proto][port]['state']))
TypeError: string indices must be integers

person ku1918    schedule 26.09.2013    source источник
comment
Какую версию Python вы используете?   -  person ProfessionalAmateur    schedule 26.09.2013
comment
Я думаю, что он использует Python 3 и смотрит на функцию печати.   -  person RyPeck    schedule 26.09.2013


Ответы (2)


В строке 168 -

print('port : %s\tstate : %s' %(port,nm[host][proto][port]['state']))

РЕДАКТИРОВАТЬ. Вот что происходит на самом деле.

Пример, подробно описанный на веб-сайте использования Python nmap, на самом деле является причиной, по которой вы получаете эту ошибку. Ключ 'state' не всегда находится в nm[host][proto][port]. Вы захотите изменить цикл for, чтобы он выполнялся только для определенных протоколов, таких как TCP или UDP.

person RyPeck    schedule 26.09.2013
comment
print(nm[host][proto][port]['state']) TypeError: строковые индексы должны быть целыми числами, так как я могу это исправить? - person ku1918; 26.09.2013
comment
Это означает, что nm[host][proto][port] — это строка. Распечатайте это для меня и опубликуйте результаты? - person RyPeck; 26.09.2013
comment
{'продукт': u'Sendmail', 'имя': u'smtp', 'extrainfo': '', 'причина': u'syn-ack', 'состояние': u'open', 'версия': u'8.14.7/8.14.7', 'conf': u'10'} {'product': '', 'name': u'rpcbind', 'extrainfo': u'RPC #100000', 'reason ': u'syn-ack', 'state': u'open', 'version': u'2-4', 'conf': u'10'} {'product': u'CUPS', 'name ': u'ipp', 'extrainfo': '', 'причина': u'syn-ack', 'состояние': u'open', 'версия': u'1.6', 'conf': u'10 '} - person ku1918; 26.09.2013
comment
Это странно. Это пример кода с сайта Python nmap? Я собираюсь попробовать запустить его сам и посмотреть, получу ли я аналогичную ошибку... - person RyPeck; 26.09.2013
comment
Я использую пример nmap. Так что я должен заменить ['state'] чем-то другим? как [TCP] ? - person ku1918; 27.09.2013
comment
Вам нужно будет выяснить, чем вы можете его заменить, я бы рекомендовал удалить его и выяснить, основываясь на выводе, что вы хотите сделать. Реальность такова, что вы не должны использовать ['state'] там, потому что вы не всегда знаете, будете ли вы обращаться к словарю. В любом случае, в примере Python nmap его там быть не должно. - person RyPeck; 27.09.2013

У меня была та же проблема, и я обнаружил, что установка прототипа на статический ['tcp'] помогла. (Мой вопрос: Python Nmap Parser).

    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('----------------------------------------------------')
person Dusty Boshoff    schedule 12.02.2014