可以用telnetlib发送“resize pty”命令吗?

2024-05-15 15:14:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 方法终端paramiko协议内容屏幕sshtelnet
1条回答
网友
1楼 · 发布于 2024-05-15 15:14:38

好吧,我已经组装了以下杰作:

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为您提供的所有选项。不过,在这方面没有任何便利。在

相关问题 更多 >