2015-10-20 79 views
1

我必须通过SSH来测试远程机器上可用的伪图形菜单(pdmenu)。像我这样的菜单最好的例子是mc,htoptzconfig,但它们要复杂得多。
只是在任何情况下,我不知道如何阅读这个菜单并导航想到它。
在我的项目中使用paramiko包装,但我可以直接切换到pexpectsubprocesspexpectsubprocess的包装)。
我的目标是能够发送箭头键菜单,找到(或阅读文本)突出显示的行,发送进入空间逃生,检测和发送短信到文本字段 s。是否可能
我宁愿解决方案是跨平台的。如何通过基于SSH的控制台菜单(pdmenu)从Python导航?

回答

1

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

下面是一个ASCII control chars的列表。例如,ESC将是\x1b,Space将是\x20Enter将是\r

特殊键和颜色表示为ANSI-Escape sequences。例如,right arrow将是\x1b[C,left arrow将是\x1b[D,up arrow将是\x1b[Adown arrow将是\x1b[BHighlightedinverted文本的前缀为\x1b[7m,blinking文本的前缀为\x1b[5m,依此类推。

谈到paramiko,您很可能必须要ssh.invoke_shell(),并且在评估收到的内容的同时不断接收该通道,以便了解远程菜单中实际发生的情况。应该很容易通过clear-screen escape sequence

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 

这应该让你开始。

+0

我刚刚修改了一下你的解决方案:a)最好通过len(chan.in_buffer)来验证剩余缓冲区的长度b)ESC字符是'\ x1b'。非常感谢! – Jury