2016-05-20 18 views
0

nmapライブラリを使ってポートスキャンを行う単純なPythonプログラムがあります。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' 

私はコマンドラインでipの代わりにurlを使ってみました。しかし、私は同じエラーが発生します。 Pythonを初めて使用しているので、私はこれを理解し解決することができません。

+0

あなたは 'state'に何があると思いますか? – fips

答えて

1

x(nmap.PortScannerのインスタンス)にはこれらのキーが含まれていません。あなたがこれを行うことができ、スキャン結果反復処理できるようにするには:あなたは、例えば利用できる有用な他のどのような情報を参照するのpython-nmapののドキュメントやソースコードを見ている場合

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

をそれは最高ですそのポートで待機しているサービス名とバージョン。ここ

さらに詳しい情報:https://bitbucket.org/xael/python-nmap/src/f368486a2cf12ce2bf3d5978614586e89c49c417/nmap/nmap.py?at=default&fileviewer=file-view-default#nmap.py-381

+0

は魅力的に機能します。ありがとう – Akshay

+0

しかし、https://pypi.python.org/pypi/python-nmapのドキュメントによれば、私の構文は正しい@fips – Akshay

+0

あなたはそうです、両方のオプションが動作するはずです。実際に 'x [host]'を実行すると '_scan_result ['scan']'に内部的にアクセスします。これは基本的に同じことです。そのホストが結果に存在しなかったため、キーエラーが発生しました。指定されたホスト結果を取得しようとする行は次のとおりです。https://bitbucket.org/xael/python-nmap/src/f368486a2cf12ce2bf3d5978614586e89c49c417/nmap/nmap.py?at=default&fileviewer=file-view-default#nmap.pyおそらく、 'if host in x.all_hosts()'を使ってアクセスする前にチェックすることができます。 – fips

0

ホストがスキャンデータで投げたデータの一部を構成する辞書のための「鍵」として、スキャンの結果には存在しません。それはおそらく、私の意見では、エラーの理由です。ありがとう

+1

さて、OPでこの問題をどのように解決すればよいですか? – nerdlyist

関連する問題