2016-05-20 6 views
0

Ich habe ein einfaches Python-Programm, das nmap-Bibliothek verwendet, um Port-Scan zu tun.Verwenden von nmap-Bibliothek im Python-Programm

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

Wenn ich das Programm ausführen, erhalte ich den folgenden Fehler.

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' 

Ich versuchte mit der URL anstelle von ip in der Befehlszeile. Aber ich bekomme den gleichen Fehler. Da ich neu bei Python bin, kann ich das nicht verstehen und lösen.

+0

Was erwarten Sie von 'Staat'? – fips

Antwort

1

x (Instanz von nmap.PortScanner) enthält diese Schlüssel nicht. Um die Scan-Ergebnisse zu wiederholen, dies zu tun:

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

ist es am besten, wenn Sie an der docs oder Quellcode python-nmap zu sehen, was andere nützliche Informationen suchen ist verfügbar z.B. Dienstname und -version, die diesen Port überwacht.

Mehr Infos hier: https://bitbucket.org/xael/python-nmap/src/f368486a2cf12ce2bf3d5978614586e89c49c417/nmap/nmap.py?at=default&fileviewer=file-view-default#nmap.py-381

+0

funktioniert wie ein Charme. Danke – Akshay

+0

Aber laut der Dokumentation unter https://pypi.python.org/pypi/python-nmap, ist meine Syntax korrekt @ fips – Akshay

+0

Sie haben Recht, es scheint, dass beide Optionen funktionieren sollten. Wenn du 'x [host]' tust, greift es intern auf '_scan_result ['scan']' zu, was im Wesentlichen dasselbe ist. Sie haben also einen Schlüsselfehler erhalten, weil dieser Host im Ergebnis nicht vorhanden war. Hier ist die Zeile, die versucht, die angegebenen Host-Ergebnisse zu erhalten: https://bitbucket.org/xael/python-nmap/src/f368486a2cf12ce2bf3d5978614586e89c49c417/nmap/nmap.py?at=default&fileviewer=file-view-default#nmap.py -555 Vielleicht können Sie überprüfen, bevor Sie mit 'if host in x.all_hosts()' darauf zugreifen. – fips

0

Der Host existiert nicht im Ergebnis der Abfrage als „Schlüssel“ für das Wörterbuch, das einen Teil der Daten bildet von Scandaten geworfen. Das ist meiner Meinung nach der Grund für den Fehler. Danke

+1

Okay, aber wie sollte OP dieses Problem lösen? – nerdlyist

Verwandte Themen