Python 错误处理与连接错误

0 投票
5 回答
1788 浏览
提问于 2025-04-17 20:55

我正在开发一个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')

服务器(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

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

5 个回答

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上运行这段代码时,它没有任何输出,但服务器却显示“连接重置”。

0

我运行了这段代码,没有使用try和except,但它没有报错。

我对字节字符串做了一些测试。

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

命令:

print(b"Hello there!")

Windows:

b"Hello there!"

Linux:

Hello there!
0

当服务器离线时出现错误追踪的原因是你试图捕捉一个不存在的错误(也就是说,ConnectionRefusedError这个名字还没有被赋值)。

为了学习的目的,我建议你去掉 `try ... except ...` 这部分,让错误直接抛出来。这样你就能清楚地看到到底是什么错误被抛出了。

至于Java的错误追踪,真是让人摸不着头脑。

1

...你确定你在使用Python 3.3或更高版本吗?ConnectionRefusedError是在Python 3.3中新增的。

编辑:

考虑到你的客户端在笔记本电脑上运行正常,但在另一台机器上捕获到了ConnectionRefusedError,我认为问题不在于脚本本身。更可能是服务器的telnet或防火墙设置出了问题。在你的脚本失败的环境中,其他telnet客户端能正常工作吗?

0

这个错误出在脚本里。Linux上的telnet命令运行得很好。

撰写回答