如何从Python通过SSH在控制台菜单(pdmenu)上导航?

如何从Python通过SSH在控制台菜单(pdmenu)上导航?,python,ssh,menu,navigation,Python,Ssh,Menu,Navigation,我必须通过SSH测试远程计算机上可用的伪图形菜单(pdmenu)。像my这样的菜单最好的例子是mc、htop或tzconfig,但它们要复杂得多。 无论如何,我都不知道如何阅读和浏览这个菜单。 在我的项目中使用了paramiko包装器,但我可以直接切换到pexpect或子流程(pexpect是子流程的包装器)。 我的目标是能够将箭头键发送到菜单,查找(或读取)突出显示的行,发送输入,空格,转义,检测文本并将其发送到文本字段中。有可能吗? 我希望解决方案是跨平台的。当然这是可能的。但是,您必须解析

我必须通过
SSH
测试远程计算机上可用的伪图形菜单(
pdmenu
)。像my这样的菜单最好的例子是
mc
htop
tzconfig
,但它们要复杂得多。
无论如何,我都不知道如何阅读和浏览这个菜单。
在我的项目中使用了
paramiko
包装器,但我可以直接切换到
pexpect
子流程
pexpect
子流程的包装器)。
我的目标是能够箭头键发送到菜单,查找(或读取)突出显示的行,发送输入空格转义,检测文本并将其发送到文本字段中。有可能吗?

我希望解决方案是跨平台的。

当然这是可能的。但是,您必须解析ascii响应(流)以找到您所需要的所有元素(例如突出显示的字符),这些元素可能不是琐碎的且依赖于终端

这是一份清单。例如,
ESC
将是
\x1b
空格
将是
\x20
Enter
将是
\r

特殊键和颜色表示为。例如,
右箭头
将是
\x1b[C
左箭头
将是
\x1b[D
上箭头
将是
\x1b[A
下箭头
将是
\x1b[B
突出显示的
倒置的
文本将以
\x1b>为前缀[7m
闪烁的
文本将以
\x1b[5m
为前缀,依此类推

谈到paramiko,您很可能必须
ssh.invoke_shell()
,并在评估接收内容的同时不断从该频道接收,以了解远程菜单中实际发生的情况。通过


这应该可以让您开始了。

我刚刚修改了您的解决方案:a)最好通过
len(chan.in\u buffer)
b)
ESC
char是'\x1b'。非常感谢!
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy() )
ssh.connect(ip, username='root', password="password")

chan = ssh.invoke_shell()
while not chan.exit_status_ready()
    buff = ''
    while not buff.endswith('\x1b[2J'):
        resp = chan.recv(1) # tweak, bigger chunks, use select.
        buff += resp
    # buff hold data up to clear-screen
    # evaluate screen, send keystrokes to navigate
    chan.send('\x1b\r')    # ESC