0

我正在用 Python 编写一个程序,其中一部分是扫描网站上的活动端口。在模块扫描端口中,如果我说扫描端口 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系统调用手册页:

    通常,基于连接的协议套接字可能只成功连接一次()

    因此,如果要测试多次连接尝试,请每次创建一个新套接字。您还应该在使用后关闭这些套接字。

于 2012-10-11T01:18:05.530 回答