2014-03-05 123 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上运行代码时,它并没有说什么,但服务器说*连接重置“。