簡體   English   中英

為什么在Python 3.4的循環中使用socket.connect()會停止工作?

[英]Why does socket.connect() stop working when used within a loop in Python 3.4?

我剛剛開始學習python編程,並且一直在關注創建簡單端口掃描程序的教程,以了解有關套接字編程的知識。 當我手動輸入所有代碼進行一次迭代時,我能夠成功連接到本地主機,但是,如果我使用相同的代碼,並使用try / except將其應用到for循環中,則我會立即獲得每個端口的異常范圍內,即使我知道某些端口已打開。 我相信我已經將問題隔離到socket.connect(),因為我在下面輸入了我永遠都不會執行的代碼。

我可以輸入以下代碼,並獲得成功的回報:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
port = 22
s.connect(('127.0.0.1', port))
s.send(b'test')
banner = s.recv(1024)
print(banner)
s.close()

返回:

b'SSH-2.0-OpenSSH_6.2\r\n'

Process finished with exit code 0

但是,一旦我獲取該代碼並將其移動到以端口號作為迭代器的for循環中,它便停止工作。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(10)
for port in range(1,26):
    print("[+]Attempting to connect to : " + str(port))
    try:
      s.connect(('127.0.0.1', port))
      s.send(b'test')
      banner = s.recv(1024)
      s.close()
      if banner:
        print("Port " + port + "is Open: " + banner)
    except: print("[+]Port " + str(port) + " is closed")  

返回:

[+]Attempting to connect to : 1
[+]Port 1 is closed
[+]Attempting to connect to : 2
[+]Port 2 is closed
[+]Attempting to connect to : 3
[+]Port 3 is closed
....ETC....ETC....ETC....
[+]Attempting to connect to : 24
[+]Port 24 is closed
[+]Attempting to connect to : 25
[+]Port 25 is closed

即使我知道端口22已打開並且正在localhost上偵聽。 (即我能夠ssh到127.0.0.1,沒有問題)。 我已經嘗試了所有我能想到的一切,包括使用內部int()函數手動將端口的數據類型更改為int,嘗試了socket.connect_ex對象,等等。我還放置了代碼在socket.connect語句的正下方,只是查看它是否顯示出來,而從未執行過。

Python的禪宗指出:

錯誤絕不能默默傳遞。
除非明確地保持沉默。

只有您沒有使錯誤消失,而只是將其替換為對實際發生的情況沒有描述的消息:

>>> "Port" + 1
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    "Port "+1
TypeError: Can't convert 'int' object to str implicitly

如果打開端口1會得到的結果是,但是在關閉套接字之后,您將無法連接到其他任何設備:

>>> a = socket.socket()
>>> a.close()
>>> a.connect(("www.python.com",80))
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    a.connect(("www.python.com",80))
OSError: [Errno 9] Bad file descriptor

因此,您需要在循環內創建一個新套接字,以使其正常工作,但最重要的是:您需要限制捕獲的錯誤:

try:
    #if this is the only line you expect to fail, then it is the only line in the try
    s.connect(('127.0.0.1', port))
except ConnectionError: 
    #if a ConnectionError is the only one you expect, it is the only one you catch
    print("[+]Port " + str(port) + " is closed")
else: #if there was no error
    s.send(b'test')
    banner = s.recv(1024)
    s.close()
    if banner:
        print("Port " + port + "is Open: " + banner)

然后您將看到實際的錯誤,而不是猜測哪里出了問題,這也不利於The Zen of Python

面對模棱兩可的想法,拒絕猜測的誘惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM