Python Nmap Parser

时间:2014-02-10 07:42:08

标签: python nmap

我正在使用位于(http://xael.org/norman/python/python-nmap/)的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行,是从底部开始的第二个打印行。 'port:%s \ tstate:%s'%(port,nm [host] [proto] [port]'。

任何建议都会很棒。谢谢 。

1 个答案:

答案 0 :(得分:1)

我发现在lport param中指定proto使得for bundle循环能够正确地看到dict中的字符串。下面是允许python-nmap解析器正常工作的正确脚本。显然,for bundle只适用于TCP,但是另一个用于bundle的params就足以满足UDP要求。

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

我不是蟒蛇专家(还)并得到了朋友的帮助(Tx AdriaanDL :))。然而,它确实解决了我在这个样本中遇到的问题,nmap.py开发人员在他们的网站上有这个问题。