我正在使用Violent Python的书,有一个错误使我无法通过第一个nmap构建(第40-41页)。在虚拟机上使用Ubuntu 14.04。我正在终端中输入"python nmapScan.py-H 10.50.60.125-p 21720"。
import nmap
import optparse
def nmapScan(tgtHost,tgtPort):
nmScan = nmap.PortScanner()
nmScan.scan(tgtHost,tgtPort)
state=nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
print "[*] " + tgtHost + " tcp/"+tgtPort +" "+state
def main():
parser = optparse.OptionParser('usage %prog '+
'-H <target host> -p <target port>')
parser.add_option('-H', dest='tgtHost', type='string',
help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string',
help='specify target port[s] separated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = str(options.tgtPort).split(',')
if (tgtHost == None) | (tgtPorts[0] == None):
print parser.usage
exit(0)
for tgtPort in tgtPorts:
nmapScan(tgtHost, tgtPort)
if __name__ == '__main__':
main()
错误如下:
File "nmapScan.py", line 24, in <module>
main()
File "nmapScan.py", line 21, in main
nmapScan(tgtHost, tgtPort)
File "nmapScan.py", line 7, in nmapScan
state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
File "build/bdist.linux-x86_64/egg/nmap/nmap.py", line 567, in __getitem__
KeyError:'10.50.60.125'
nmap中的KeyError
表示无法访问ip
。你应该验证ip是否真的启动了。
如果您不总是确定主机是否会启动,则需要try/except
:
try:
state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
except KeyError as e:
print(e)
return
无法访问此主机10.50.60.125
。
ping 10.50.60.125
PING 10.50.60.125 (10.50.60.125): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
尝试使用一些可访问的主机,如:127.0.0.1
。
这是因为nmap没有扫描端口的信息,你可以用查询
nmScan = nmap.PortScanner()
data = nmScan.scan(tgtHost,tgtPort)
print(data.get(tgtHost))
你会发现输出值是空的
从来源cod,我们可以知道:nmScan[tgtHost]
等于data.get(tgtHost)[tgtHost]
更好的方法是用data.get(tgtHost)[tgtHost]
或data.get(tgtHost).get(tgtHost, {})