3

我正在寻找一种在使用telnetlib. 我使用 Paramiko 的resize_pty在 SSH 上实现了类似的效果,但我也需要支持 telnet 协议。这甚至可能吗(telnet 甚至有控制流)?

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

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

4

1 回答 1

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()方法(这里)来做到这一点。Telnett

此处组装的NAWS命令由RFC 1073定义。width和变量是常规的heightPython 整数,它们被打包成两个 16 位无符号整数。

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

如果是这种情况,您可能必须使用set_option_negotiation_callback()。可悲的是,这意味着您将不得不处理通常telnetlib对您有用的所有选项。而且AFAIK对此没有任何便利。

于 2012-07-30T20:19:58.277 回答