我正在研究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上运行相同的代码,它不会出错。
答案 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上运行代码时,它没有说什么,但服务器说*连接重置“。