【问题标题】:Is it possible to send "resize pty" command with telnetlib?是否可以使用 telnetlib 发送“resize pty”命令?
【发布时间】:2012-07-19 12:09:14
【问题描述】:

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

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

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

【问题讨论】:

  • 你能详细说明你在做什么吗?您是否需要 telnetlib 为您处理带有服务器输出的某种伪终端,或者只是向它发送调整大小终端请求?
  • @MichałGórny:我已经更新了这个问题,我希望它现在更有意义...... :)
  • 谢谢。我做了一些研究,当终端调整大小时,telnetd 调试td: recv suboption NAWS 0 97 (97) 0 26 (26)。遗憾的是,我在 telnetlib 中没有看到任何特定选项来发送子选项,但我必须仔细研究一下协议。

标签: python telnet telnetlib


【解决方案1】:

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

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

现在解释几句。

首先telnetlib不支持直接发送命令;它只是逃脱了他们。因此,要发送命令,我们必须直接使用底层套接字。我们使用Telnet 对象实例的get_socket() 方法(此处为t)来做到这一点。

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

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

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

【讨论】:

  • 谢谢!!!我必须完全按照您的描述使用set_option_negotiation_callback() 来设置WILL NAWS。这也不是很多工作,我只是研究了 telnetlib.py 并复制了它对消息的处理——只有几行。它现在完美运行。 :)
  • 是的,telnetlib 在代码中看起来很简单。它还有一些你可以使用的符号常量;但我认为您需要在pack() 调用中将B 替换为c
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多