是否可以使用telnetlib发送“resize pty”命令?

时间:2012-07-20 08:23:43

标签: python telnet telnetlib

我正在寻找一种在使用telnetlib时调整终端大小的方法。我使用Paramiko的resize_pty在SSH上取得了类似的效果,但我也需要支持telnet协议。这甚至可能(telnet甚至有控制流)?

请注意,telnetlib不是必需的 - 如果有更好的库我会很乐意使用它。

更新(更多背景信息):我正在构建一个基于Web的界面,用于连接网络设备。前端是使用JS / AJAX构建的,它基本上只是向后端发送击键并从中接收屏幕内容。后端是用Python编写的,负责打开设备的SSH / telnet会话,向它发送击键并获取输出流,然后通过VT100虚拟终端(pyte)传递。然后将虚拟屏幕的内容发送回前端。当用户想要在他的浏览器中调整终端屏幕大小时,问题就出现了。使用SSH我只需通过Paramiko发送resize_pty(),然后调整pyte的虚拟终端屏幕大小。但是使用telnet,我无法找到适当的调整大小函数,告诉设备它应该调整其终端的大小。这可能吗?

1 个答案:

答案 0 :(得分:4)

好的,我已经能够组装以下杰作:

naws_command = struct.pack('!BBBHHBB',
        255, 250, 31, # IAC SB NAWS
        width, height,
        255, 240) # IAC SE
t.get_socket().send(naws_command)

现在说几句话。

首先,telnetlib不支持直接发送命令;它只是逃避了它们。因此,要发送命令,我们必须直接使用底层套接字。我们使用get_socket()对象实例的Telnet方法(此处为t)执行此操作。

此处汇编的NAWS命令由RFC 1073定义。 widthheight变量是常规的Python整数,它们被打包成两个16位无符号整数。

请注意,这不是一个完美的解决方案,我不确定它是否真的适合您。最重要的是,在功能协商期间,telnetlib将通知服务器它WON'T NAWS,因此特定服务器实际上可能会忽略这些命令。

如果是这种情况,您可能必须使用set_option_negotiation_callback()。遗憾的是,这意味着您必须处理通常telnetlib为您做的所有选项。而AFAIK则没有这方面的便利。