Python错误处理&连接错误

时间:2014-03-05 11:47:12

标签: python bukkit telnetlib

我正在研究Telnet客户端。我开始在我的笔记本(Windows)上编码,最后我将它上传到我的服务器(Debian)上。这两个系统都适用于Python 3.在我的笔记本上,脚本运行良好,但在Debian上,它确实会出错。

守则:

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')

服务器(带有RemoteToolKit的CraftBukkit服务器):

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,]

Greets miny

编辑:错误处理现在有效! THX @ Wojciech Walczak 客户端不报告错误,但服务器报告错误。如果我在Windows上运行相同的代码,它不会出错。

5 个答案:

答案 0 :(得分:1)

...你确定你使用的是Python 3.3或更高版本吗? Python 3.3中添加了ConnectionRefusedError

编辑:

鉴于您的客户端从笔记本电脑启动时工作正常,并且正在另一台计算机上捕获ConnectionRefusedError,我会说问题不在于脚本本身。它更像是服务器的telnet /防火墙设置。其他telnet客户端是否在脚本失败的环境中工作?

答案 1 :(得分:0)

服务器脱机时回溯的原因是因为您试图捕获不存在的异常(也就是说尚未为名称ConnectionRefusedError分配值)。

仅仅因为它的教育目的,我会删除`try ... except ...“并让错误被提出然后希望你会发现究竟是什么例外。

关于Java追踪,WTF?

答案 2 :(得分:0)

错误在脚本中。 Linux上的telnet命令运行良好。

答案 3 :(得分:0)

我没有尝试使用代码,但它没有报告错误。

我用字节串做了一些测试。

如果我运行此代码,机器会显示不同的字符串。

命令:

print(b"Hello there!")

视窗:

b"Hello there!"

Linux的:

Hello there!

答案 4 :(得分: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上运行代码时,它没有说什么,但服务器说*连接重置“。