0

現在開発中の単純な Python プログラムがありますが、何らかの理由で動作しません。
完全なプログラムが機能する方法は、20 個のポートのリストがあり、そのリストをループして、基本的に選択したポートでホストに ping を実行します。コードは次のとおりです。

import socket
import sys

print '  +-====================================================-+'
print ' /                                                        \ '
print '|                       PyPortScanner                      |'
print '|                       by Ag3ntChr0m                      |'
print ' \                                                        /'
print '  +-====================================================-+'
print ''

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    print 'Failed to create socket. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1]
    sys.exit()
print 'Socket Created'

host = raw_input('Enter the desired host to scan: ')
port = [80, 443, 21, 22, 4567, 8080, 25, 3389, 23, 53, 1723, 110, 135, 445,
        139, 1863, 143, 8081, 10000, 1025]
portFail = []
print 'Scanning top 20 most often open ports ...'

try:
    remote_ip = socket.gethostbyname( host )

except socket.gaierror:
    #couldn't resolve host at port
    print 'Hostname could not be resolved. Program exiting'
    sys.exit()

print 'IP address of ' + host + ' is ' + remote_ip

print '+-===================================-+'
print '| Ports Scanned:----------------------|'
print '+-===================================-+'
print ''

#Connect to remote server
for i in range(0, 20):
    portScan = int(str(port[i]))    <----
    try:

        s.connect((remote_ip, portScan))
        print "\t" + str(portScan)
        s.close()

    except:

        portFail.append(portScan)
        err = True

raw_input('Press Enter to Continue...')

if err:
    print '+-=============================-+'
    print '| Failed Port Scan:-------------|'
    print '+-=============================-+'
    print ''
    size = len(portFail)
    for i in range(1, size):
        print "\t" + str(portFail[i])

プログラムを実行すると、

  • s.socket が接続を試みるために使用できる変数にポート番号を (矢印でマークされた行で) ロードします。
  • 次に、ホストでソケットを開こうとし (基本的には ping を実行)、閉じようとします。
  • 接続すると、これが画面の Ports Scanned の下に表示されます。
  • ただし、失敗した場合 (最近はそうです)、Failed Port Scan の下に出力されます。

プログラムを実行すると、リストの最初のポート (80) が Ports Scanned の下に出力されますが、残りのポートは Failed Port Scan の下に置かれます。

このプログラムが最初のポートよりも多くのポートに ping を成功させるにはどうすればよいですか?

4

3 に答える 3

1

同じソケットを再利用して再度接続することはできません。毎回新しいソケットを作成してみてください:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_ip, portScan))

ソケットであってもclose、再接続できる位置には戻りません。

于 2013-03-16T12:15:03.730 に答える
0

@cnicutar からの回答で述べたように、socket. ただしclose()、すべてのケースで使用後にソケットを使用する必要があります。これにより、基になるリソースが解放されます。これは、 API ドキュメントにある例でも確認できます。

ポートへの接続に成功したら、shutdown()後で呼び出してポートが閉じていることを確認する必要があります。

コードの関連部分は次のとおりです。

for portScan in port:
    try:
        print "scanning: %s" % portScan 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((remote_ip, portScan))
        s.shutdown(socket.SHUT_RDWR)
    except:
        portFail.append(portScan)
        err = True
    finally:
        s.close()

また、ループを単純化するために自由を取りました。

注: 私の実験ではshutdown()socket.

于 2013-03-16T12:42:29.900 に答える
0

@cnicutar が指摘しているように、ソケットを再利用することはできませんが、新しい接続ごとにいつでも新しいソケットを開始できます。
ポートをスキャンするには、次のような for ループを使用する必要があります。

for p2scan in port:
    try:
        print "scanning: %s" % p2scan
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((remote_ip, p2scan))
    except:
        portFail.append(p2scan)
        err = True
    finally:
        s.close()
于 2013-03-16T12:53:20.010 に答える