2013-09-26 5 views
1

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

 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 
+1

Какую версию Python вы используете? – ProfessionalAmateur

+0

Я думаю, что он работает Python 3, глядя на функцию печати. – RyPeck

ответ

0

В строке 168 -

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

EDIT - Вот что на самом деле происходит.

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

+0

print (nm [host] [proto] [port] ['state']) TypeError: строковые индексы должны быть целыми числами так как я могу исправить? – ku1918

+0

Значит, nm [host] [proto] [port] - это строка. Распечатайте это для меня и опубликуйте результаты? – RyPeck

+0

{'product': u'Sendmail ',' name ': u'smtp', 'extrainfo': '', 'reason': u'syn-ack ',' state ': u'open', 'version' : 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 ':' ',' reason ': u'syn-ack', 'state': u'open ',' version ': u'1.6', 'conf': u'10 '} – ku1918

0

У меня была такая же проблема, и я обнаружил, что настройка прото в статическую ['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('----------------------------------------------------') 
Смежные вопросы