2017-05-28 18 views
1

私は、ポートが開いているか閉じているかをチェックするポートスキャナを作っていますが、動作しているかどうかを確認するためだけに開いたポートであっても、誰も私のコードで間違ったことを見ることができますか?どのようにポートスキャナが動作しているかどうかを確認できますか?

if userChoice == "1": 
    # code for option 1 
    print("You selected Port Scan Tool") 
    loop = 0 
    subprocess.call('cls', shell=True) 
    remoteServer = input("Enter a remote host to scan: ") 
    start=input("Enter starting port number: ") 
    start = int(start) 
    end=input("Enter ending port number: ") 
    end = int(end) 
    remoteServerIP = socket.gethostbyname(remoteServer) 

    # Print a nice banner with information on which host we are about to scan 
    print ("-" * 60) 
    print("Please wait, scanning remote host", remoteServerIP) 
    print("-" * 60) 

    # Check what time the scan started 
    t1 = datetime.now() 
    timestr = time.strftime("%d.%m.%Y-%H.%M.%S")# creates time stamp on text file 

    try: 
     textFileLocation = timestr + " - Port Scan Results.txt"# creates and names text file 
     for port in range(start, end): # lets user select range 
      sock = (socket.socket(socket.AF_INET, socket.SOCK_STREAM)) 
      result = sock.connect_ex((remoteServerIP, port)) 
      if result == 0: 
       print("Port {}: \t Open".format(port)) 
       #print("Port {}: \t Closed".format(port)) 
       #print("Port {} \t Closed".format(port)) 
       textFileLocation = timestr + " - Port Scan Results.txt" 
       textFile = open(textFileLocation, "a") 
       textToWrite = "Open: Port %d\n" % port 
       textFile.write(textToWrite) 
       textFile.close() 
      else: 
       print("Port {}: \t Closed".format(port)) 
       textFileLocation = timestr + " - Port Scan Results.txt" 
       textFile = open(textFileLocation, "a") 
       textToWrite = "Closed: Port %d\n" % port 
       textFile.write(textToWrite) 
       textFile.close() 
      sock.close() 
+0

ソケット関数をループに入れる前にテストしましたか?また、ループの前に実際に出力ファイルを開くべきです –

+0

@ cricket_007間違った場所でopen()だけでなく、このコードは、私はそれが何であるか分からない。ショッキングなバグやそれに似た表現が私にはあると思います。 – Dalen

答えて

2

これは、上記のポートでリッスンするプログラムがあるかどうかをテストするだけです。

これが機能するかどうかを確認するには、最初にtryブロックを削除して、返されるエラーを確認します。例外処理で正しいエラーを使用します。つまり、マシンがネットワーク上にない場合は、接続できない場合と同様に試行が失敗します。 また、ソケットが接続しようとしてハングしないようにタイムアウトを導入する必要があります。

あなたのコードがターゲットマシンに何かをしているかどうかを確認するには、そこにファイアウォールをアクティブにして、誰かがあなたのやっていることがあれば通知するように設定します。ルーター/スイッチャーがネットワーク上のポートスキャンを妨げている場合は、コードが失敗することもあります。ファイアウォールの設定も確認する必要があります。

コードにexceptブロックがありません。とにかくtryが間違っています。

except socket.SocketError as error: 

と、例外が格納される変数エラーにエラー番号などを確認してください:あなたは、インスタンスのために使用する必要がありますが

for x in range(...): 
    try: 
     s = socket.socket(...) 
     s.connect(...) 
     s.close() 
    except: pass 

: あなたは、各接続をテストする必要があります。

ああ、BTW、socket.socket.connect()はNoneを返すので、チェックは常にFalseになります。 これはPythonのC言語ではありません。

>>> ... 
>>> result = sock.connect(...) 
>>> print result 
None 

Try-exceptは、接続が成功したかどうか、さらに多くの情報が渡されたかどうかを示します。

+0

本当の問題は「あなたの小切手はいつもFalseです」 –

関連する問題