2014-03-05 122 views
0

我正在使用Telnet客戶端。我開始在我的筆記本上編寫代碼(Windows),並在完成時將其上傳到我的服務器(Debian)。這兩個系統都適用於Python 3.在我的筆記本中,腳本運行良好,但在Debian上,它確實出錯。Python錯誤處理和連接錯誤

驗證碼:

import telnetlib 
import sys 
try: 
    HOST = sys.argv[1] 
    user = sys.argv[3] 
    password = sys.argv[4] 
    cmd= sys.argv[5] 
    port=int(sys.argv[2]) 

    tn = telnetlib.Telnet(HOST, port) 

    tn.read_until(b"username: ") 
    tn.write(user.encode('ascii') + b"\n") 
    if password: 
     tn.read_until(b"password: ") 
     tn.write(password.encode('ascii') + b"\n") 

    tn.write(cmd.encode('ascii') + b"\n") 
except ConnectionRefusedError: 
    print('ERROR') 
else: 
    print('OK') 

服務器(CraftBukkit服務器RemoteToolKit):

Mar 05, 2014 12:39:58 PM net.wimpi.telnetd.net.ConnectionManager makeConnection 
INFO: connection #1 made. 
Unexpected error in shell! 
java.net.SocketException: Connection reset 
>  at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118) 
>  at java.net.SocketOutputStream.write(SocketOutputStream.java:159) 
>  at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
>  at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
>  at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
>  at net.wimpi.telnetd.io.TelnetIO.flush(Unknown Source) 
>  at net.wimpi.telnetd.io.TerminalIO.flush(Unknown Source) 
>  at net.wimpi.telnetd.io.TerminalIO.write(Unknown Source) 
>  at com.drdanick.McRKit.Telnet.ConsoleShell.run(ConsoleShell.java:78) 
>  at net.wimpi.telnetd.net.Connection.run(Unknown Source) 
Mar 05, 2014 12:39:58 PM net.wimpi.telnetd.net.ConnectionManager cleanupClosed 
INFO: cleanupClosed():: Removing closed connection Thread[Connection1,5,] 

電賀MINY

編輯:錯誤處理的工作吧! THX @ Wojciech Walczak 客戶端不報告錯誤,但服務器報告錯誤。如果我在Windows上運行相同的代碼,它不會產生錯誤。

+0

你確定你在Debian的'python3'上運行腳本嗎? –

+0

是的,我使用cmd python3。 – miny1997

回答

0

服務器處於脫機狀態時追溯的原因是因爲您試圖捕獲不存在的異常(即名稱ConnectionRefusedError尚未分配值)。

僅僅爲了其教育的目的我想刪除`嘗試...除了......」而讓錯誤得到提升然後希望你會發現異常被提出什麼。

至於Java的?回溯,WTF

1

...和你確定你正在使用Python 3.3或更高版本ConnectionRefusedError已經在Python 3.3增加了

編輯:

由於啓動時您的客戶端工作正常從你的筆記本電腦,和在另一臺機器上捕獲ConnectionRefusedError,我會說這個問題不是腳本本身。這是關於服務器的telnet /防火牆設置。其他Telnet客戶端是否在腳本失敗的環境中工作?

+0

我現在更新了Python到3.3.4。一個問題解決了! – miny1997

0

錯誤在腳本中。 Linux上的telnet命令運行良好。

+0

您可以在沒有try/except子句的情況下運行代碼併發布完整的回溯? –

+0

沒有錯誤,我認爲問題是字節串 – miny1997

0

我跑的代碼W/O嘗試和除了它不報告錯誤。

我用字節字符串做了一些測試。

如果我運行此代碼,機器顯示不同的字符串。

命令:

print(b"Hello there!") 

的Windows:

b"Hello there!" 

的Linux:

Hello there! 
+0

我認爲服務器端仍然存在錯誤?如果是這樣,當你將'b'放入你的telnet客戶端時會發生什麼? (請回答下面我的評論。) –

+0

服務器端沒有錯誤。我用PuTTY測試了服務器。 'tn.write(b'say Hi')'''tn.write(「say Hi」.encode('ascii'))'That does not work – miny1997

+0

有沒有什麼問題呢? –

0

更新的代碼在Debian的(Windows仍然使用舊代碼):

import telnetlib 
import sys 
if(True): 
    HOST = sys.argv[1] 
    user = sys.argv[3] 
    password = sys.argv[4] 
    cmd= sys.argv[5] 
    port=int(sys.argv[2]) 

    tn = telnetlib.Telnet(HOST, port) 

    tn.read_until(b"username:") 
    tn.write(user.encode('ascii') + b"\n") 
    if password: 
     tn.read_until(b"password:") 
     tn.write(password.encode('ascii') + b"\n") 

    tn.write(cmd.encode('ascii') + b"\n") 

我在Windows上測試了代碼,telnet服務器可以運行這些命令。 當我在Debian上運行代碼時,它並沒有說什麼,但服務器說*連接重置「。