我的代码出现问题,当我输入一个端口范围时,程序将暂停一个关闭的端口。它有开放端口时很好。有人可以帮忙吗?
#!/usr/bin/env python
import sys
import socket
import subprocess
address = raw_input("Which IP would you like to scan? ")
r1 = input("What starting IP would you like to scan? i.e 10: ")
r2 = input("Which ending IP would you like to scan? i.e 300: ")
print "This can take a while for big port ranges. Scan commencing on", address
for port in range(r1,r2):
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if(sock.connect_ex((address,port))==0):
print "Port " , port, "is open"
sock.close()
print " "
print "Scan completed sucessfully"
else:
print " "
print "Scan completed, No ports found!"
答案 0 :(得分:1)
问题是(在大多数防火墙下),远程计算机故意不会响应进入关闭端口的TCP连接数据包 - 如果这样做,你的connect_ex()调用将很快失败(使用errno = ECONNREFUSED )。这将允许您快速继续尝试下一个端口,这不是防火墙设计者想要鼓励的。
因此,他们只是忽略传入的TCP数据包,并且您的计算机无法确定远程计算机是故意忽略您,还是只是响应缓慢。
所以你真正做的就是为自己选择一个“合理的”超时,并假设在超时期限内没有成功连接的任何TCP连接都必须指明一个防火墙端口。
至于如何在Python中这样做,它非常简单;有关详细信息,请参阅here。