0

私はPythonでプログラムを書いていますが、その一部はWebサイトのアクティブなポートをスキャンしています。モジュールのスキャンポートでは、スキャンポート79から81と言えば、80を含むリストが返されるはずです。scanportを実行すると、ポート80が起動していることが示されるため、これは確かにわかっています。コメントがないことをお詫びします:

import subprocess, socket, urllib2, sys
class pymap:
    def __init__(self):
        pass

################################################################################
################################################################################

    def host(self, host):
        self.host = host
        socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock = socket1

################################################################################
################################################################################

    def getip(self):
        if self.host == None:
            print "Specify a host first."
        else:
            return socket.gethostbyname(self.host)

################################################################################
################################################################################

    def scanports(self, start, end):
        ports = []
        self.sock.settimeout(0.000001)
        for i in xrange(start, end+1):  #49151
            try:
                self.sock.connect((self.host, i))
                ports.append(i)
            except:
                pass
        return i

################################################################################
################################################################################

    def scanport(self, port1):
        self.sock.settimeout(0.000001)
        try:
            self.sock.connect((self.host, port1))
            return 1
        except:
            return 0

################################################################################
################################################################################

    def traceroute(self):
        if self.host == None:
            print "Specify a host first."

        else:
            proc=subprocess.Popen(('tracert', self.host), shell=True, stdout=subprocess.PIPE)
            output=proc.communicate()[0]
            return output

################################################################################
################################################################################

    def getsource(self, url):
        page = urllib2.urlopen(url)
        return page.read()

################################################################################
################################################################################

x = pymap()
x.host("www.google.com")
print x.scanports(70, 85)
print x.scanport(80)

編集:私はそれを変更しました。反復変数を使用していることを指摘してくれたJames Henstridgeに感謝します。そうしないと、はるかに困難になります。ただし、それでも機能しません。

    def scanports(self, start, end):
        ports = []
        self.sock.settimeout(3)
        for i in xrange(start, end+1):  #49151
            try:
                self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.sock.connect((self.host, port1))
                self.sock.close()
                ports.append(i)
            except:
                pass
            return ports

編集:私はそれを理解しました、それはports.appendの問題でした、あなたの助けに感謝します。

4

1 に答える 1

1

コードにはいくつかの問題があります。

  1. メソッドscanportsはループ反復変数を返すため、end検出したポートに関係なく常に戻ります。portsおそらく、代わりにリストを返すつもりでしたか?

  2. 同じソケットを何度も再利用しています。connectシステムコールのマニュアルページから:

    一般に、接続ベースのプロトコルソケットは、接続に成功するのは1回だけです。

    したがって、複数の接続試行をテストする場合は、毎回新しいソケットを作成してください。また、使用後はこれらのソケットを閉じる必要があります。

于 2012-10-11T01:18:05.530 に答える