在Python中实现端口扫描

时间:2015-08-22 19:28:39

标签: python

我有一个程序可以扫描远程主机上的开放端口。 完成扫描需要很长时间。我想让它快速工作。

这是我的代码:

端口扫描

1.0

你们其中一个Python向导可以帮助我吗? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以在套接字上设置超时,以便在关闭的端口上花费很多时间。我还会使用线程并允许用户指定他们想要运行的线程数。这里是一些代码的链接,您可以使用线程模块String#split(String)

来实现线程
#!/usr/bin/env python

'''
A simple port scanner.
'''

import socket

def scan_host(host, **options):
    '''
    Scan a host for open ports.
    '''
    options.setdefault('timeout', 0.30)
    options.setdefault('port_range', (1, 1024))
    timeout = options.get('timeout')
    port_range = options.get('port_range')
    host_ip = socket.gethostbyname(host)
    print("Please wait, scanning remote host {} : {}".format(host, host_ip))
    for port in xrange(*port_range):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        result = sock.connect_ex((host_ip, port))
        if result == 0:
            print "Port: {} Open".format(port)
            sock.close()


if __name__ == '__main__':
    scan_host('www.google.com', timeout=0.30, port_range=(1, 8000))

答案 1 :(得分:-1)

这个程序变得太简单了。它一次只监控一个端口,并且在一个端口上查看它是否正在监听需要很长时间。因此,如果无法连接,请尝试缩短收听的时间,通过在"期望:"下设置该数字的递归限制来认为它是关闭的。在run()。

就像这样,

            try:
                # connect to the given host:port
                result = sock.connect_ex((hostIP, port))
                if result == 0:
                    print "%s:%d Open" % (hostIP, port)
                    sock.close()
            except: #pass
                sock.recurse += 1
                if sock.recurse < sock.limit: 
                    sock.run()
                else:
                    print "%s:%d Closed" % (hostIP, port)

还有其他方法可以通过导入threading()模块来提高效率,这可以用来同时关注大量套接字。

这是关于线程的文档。

参考这个, https://docs.python.org/2/library/threading.html#

希望能帮到你。 一切顺利。