2015-03-18 119 views
1

我正在使用暴力Python書,並且有一個錯誤阻止我移過第一個nmap構建(第40-41頁)。在VM上使用Ubuntu 14.04。我輸入'python nmapScan.py -H 10.50.60.125 -p 21,1720'到終端。「KeyError:」(插入IP)'「是什麼意思?

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

對不起獲取信息,但它爲我工作得很好。嘗試添加一些調試打印語句,例如'print nmap.all_hosts()'。有些nmap信息位於http://xael.org/norman/python/python-nmap/。 – matsjoyce 2015-03-18 22:14:27

+1

你確實在問'KeyError是什麼意思?如果是這樣,請參閱[python文檔](https://wiki.python.org/moin/KeyError)。如果您的意思是「爲什麼我的PortScanner對象不包含我試圖掃描的主機」,請更新問題。 – 2015-03-18 22:20:02

回答

1

在nmap中的KeyError意味着ip無法訪問。你應該驗證ip是否真的啓動。

如果你並不總是知道如果主機會漲還是不你需要一個try/except

try: 
    state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state'] 
except KeyError as e: 
    print(e) 
    return 
1

此主機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

+0

非常感謝你們。這本書的例子已經過時了 – PythonPractice 2015-03-19 00:05:11

0

這是因爲沒有端口的信息由NMAP scaned, 可以用

檢查
nmScan = nmap.PortScanner() 
data = nmScan.scan(tgtHost,tgtPort) 
print(data.get(tgtHost)) 

,你會發現,輸出值是空

從源頭鱈魚,我們可以知道: nmScan[tgtHost]等於data.get(tgtHost)[tgtHost]

更好的辦法是用data.get(tgtHost)[tgtHost]data.get(tgtHost).get(tgtHost, {})