0

我正在开发一个 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,]

迎接我的

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

4

5 回答 5

1

...您确定您使用的是 Python 3.3 或更高版本吗?ConnectionRefusedError已在 Python 3.3 中添加。

编辑:

鉴于您的客户端在从笔记本电脑启动时运行良好,并且正在ConnectionRefusedError另一台机器上运行,我会说问题不在于脚本本身。它与服务器的远程登录/防火墙设置有关。其他 telnet 客户端是否在您的脚本失败的环境中工作?

于 2014-03-05T12:53:31.753 回答
0

我没有尝试运行代码,但它没有报告错误。

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

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

命令:

print(b"Hello there!")

视窗:

b"Hello there!"

Linux:

Hello there!
于 2014-03-05T19:43:59.460 回答
0

服务器离线时进行回溯的原因是因为您试图捕获一个不存在的异常(也就是说该名称ConnectionRefusedError尚未被赋值)。

仅出于教育目的,我将删除 `try ... except ..." 并引发错误然后希望您能确切地找出引发了什么异常。

至于Java回溯,WTF?

于 2014-03-05T11:54:04.327 回答
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 上运行代码时,它什么也没说,但服务器说 *Connection reset"。

于 2014-03-06T07:53:37.813 回答
0

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

于 2014-03-05T18:03:16.750 回答