Python Nmap Parser

旧城冷巷雨未停 提交于 2020-01-25 11:35:26

问题


I'm playing with the nmap parser for python located at (http://xael.org/norman/python/python-nmap/). It provides a sample code snippet that I used in a .py script in order to do routine checks, automating some tasks. However I get a error on "Line 25". Can someone please help me..?

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

ERROR Below:

    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# 

Line 25, is the second last print line from the bottom. 'port : %s\tstate : %s' % (port, nm[host][proto][port]'.

any advice would be great. thank you .


回答1:


I have found that specifying the proto in the lport param enabled the for bundled loop to correctly see the strings within the dict. Below is the correct script that allows for the python-nmap parser to work correctly. Obviously the for bundle only caters for TCP, however another params with for bundle would suffice for the UDP requirement.

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

I'm not a python expert(yet) and had some help from a friend (Tx AdriaanDL :)). However it does sort out the problem I have been having with this sample that the nmap.py developers have on their website.



来源:https://stackoverflow.com/questions/21671509/python-nmap-parser

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!