在 Python 程序中使用 nmap 库

Using nmap library in Python program

我有一个简单的 Python 程序,它使用 nmap 库进行端口扫描。

from optparse import OptionParser
import nmap  
from threading import * 

screenLock=Semaphore(value=1)

def nmapScan(thost,tport):
    x=nmap.PortScanner()
    x.scan(thost,tport)
    state=x[thost]['tcp'][int(tport)]['state']
    print "[*]" + thost + "tcp/"+tport+" "+state


def main():
    parser=OptionParser('usage %prog -H <target host> -p <target port>')
    parser.add_option('-H',dest='thost',type='string',help='specify target host')
    parser.add_option('-p',dest='tports',type='string',help='specify target port[s] seperated by comma')
    (options,args)=parser.parse_args()
    thost=options.thost
    tports=options.tports
    tports=tports.split(',')
    if (thost==None)|(tports==None):
        print parser.usage
        exit(0)
    for i in tports:
        nmapScan(thost,i)

main()

当我运行程序时,我得到以下错误。

akshayrajmacbookpro$ python nmapScanner.py -H 192.168.1.60 -p 80,443
Traceback (most recent call last):
  File "nmapScanner.py", line 28, in <module>
main()
File "nmapScanner.py", line 26, in main
nmapScan(thost,i)
File "nmapScanner.py", line 10, in nmapScan
state=x[thost]['tcp'][int(tport)]['state']
File "build/bdist.macosx-10.11-intel/egg/nmap/nmap.py", line 555, in __getitem__
KeyError: '192.168.1.60'

我尝试在命令行中使用 url 而不是 ip。但我得到了同样的错误。作为 Python 的新手,我无法理解和解决这个问题。

x(nmap.PortScanner 的实例)不包含这些键。为了能够迭代扫描结果,您可以这样做:

for host, result in x._scan_result['scan'].items():
    print "[*]" + thost + "tcp/" + tport + " " + result['status']['state']

最好查看 python-nmap 的文档或源代码,看看还有哪些有用的信息,例如在该端口上侦听的服务名称和版本。

更多信息在这里:https://bitbucket.org/xael/python-nmap/src/f368486a2cf12ce2bf3d5978614586e89c49c417/nmap/nmap.py?at=default&fileviewer=file-view-default#nmap.py-381

扫描结果中不存在作为扫描数据抛出的数据的一部分的字典的"Key"主机。在我看来,这可能是错误的原因。谢谢