我正在制作一个端口扫描程序,用于检查端口是打开还是关闭,但我确信它不起作用,因为它将每个端口列为关闭,即使我专门打开的端口只是为了检查如果它工作。任何人都可以看到我的代码有什么问题吗?
if userChoice == "1":
# code for option 1
print("You selected Port Scan Tool")
loop = 0
subprocess.call('cls', shell=True)
remoteServer = input("Enter a remote host to scan: ")
start=input("Enter starting port number: ")
start = int(start)
end=input("Enter ending port number: ")
end = int(end)
remoteServerIP = socket.gethostbyname(remoteServer)
# Print a nice banner with information on which host we are about to scan
print ("-" * 60)
print("Please wait, scanning remote host", remoteServerIP)
print("-" * 60)
# Check what time the scan started
t1 = datetime.now()
timestr = time.strftime("%d.%m.%Y-%H.%M.%S")# creates time stamp on text file
try:
textFileLocation = timestr + " - Port Scan Results.txt"# creates and names text file
for port in range(start, end): # lets user select range
sock = (socket.socket(socket.AF_INET, socket.SOCK_STREAM))
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
print("Port {}: \t Open".format(port))
#print("Port {}: \t Closed".format(port))
#print("Port {} \t Closed".format(port))
textFileLocation = timestr + " - Port Scan Results.txt"
textFile = open(textFileLocation, "a")
textToWrite = "Open: Port %d\n" % port
textFile.write(textToWrite)
textFile.close()
else:
print("Port {}: \t Closed".format(port))
textFileLocation = timestr + " - Port Scan Results.txt"
textFile = open(textFileLocation, "a")
textToWrite = "Closed: Port %d\n" % port
textFile.write(textToWrite)
textFile.close()
sock.close()
答案 0 :(得分:2)
这只测试是否有任何程序正在侦听所述端口。
要查看这是否有效,请首先删除try块以查看返回的错误。然后在异常处理中使用正确的错误,即如果您的计算机不在网络上,尝试将失败以及无法连接时。 此外,您还必须引入超时,以便套接字不会因尝试连接而挂起。
要查看您的代码是否对目标计算机执行了任何操作,请在此处激活防火墙并进行设置以通知您是否有人正在执行您所执行的操作。如果您的路由器/交换机阻止网络上的端口扫描,您的代码也可能会失败。您也应该检查其防火墙设置。
您也错过了代码中的except块,无论如何都尝试在错误的位置。 您必须测试每个连接:
except socket.SocketError as error:
虽然您应该使用例如:
>>> ...
>>> result = sock.connect(...)
>>> print result
None
然后检查变量错误中的错误号等,其中将存储异常。
哦,BTW,socket.socket.connect()返回None,所以你的检查总是False。 这不是C,它的Python。
{{1}}
Try-except会通过更多信息告诉您连接是通过还是失败。