我必须通过SSH
来测试远程机器上可用的伪图形菜单(pdmenu
)。像我这样的菜单最好的例子是mc
,htop
或tzconfig
,但它们要复杂得多。
只是在任何情况下,我不知道如何阅读这个菜单并导航想到它。
在我的项目中使用paramiko
包装,但我可以直接切换到pexpect
或subprocess
(pexpect
是subprocess
的包装)。
我的目标是能够发送箭头键菜单,找到(或阅读文本)突出显示的行,发送进入,空间,逃生,检测和发送短信到文本字段 s。是否可能?
我宁愿解决方案是跨平台的。如何通过基于SSH的控制台菜单(pdmenu)从Python导航?
1
A
回答
1
当然这是可能的。但是,您必须解析ascii响应(流)才能找到所需的所有元素(例如突出显示的字符),这些元素可能不是微不足道的,也不依赖于终端。
下面是一个ASCII control chars的列表。例如,ESC
将是\x1b
,Space
将是\x20
,Enter
将是\r
。
特殊键和颜色表示为ANSI-Escape sequences。例如,right arrow
将是\x1b[C
,left arrow
将是\x1b[D
,up arrow
将是\x1b[A
和down arrow
将是\x1b[B
。 Highlighted
或inverted
文本的前缀为\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
这应该让你开始。
相关问题
- 1. Ruby:基于控制台的菜单
- 2. 导轨 - 通过控制台
- 3. 如何从简单的视图创建基于导航控制器的视图?
- 4. 基于JAVA控制台的菜单问题
- 5. 我如何通过ssh直接登录到rails控制台?
- 6. 如何制作固定导航菜单?
- 7. 如何从导航抽屉菜单项
- 8. 基于jQuery的YUI风格的菜单用于网站导航
- 9. java控制台菜单
- 10. 我遇到菜单导航问题。如何通过动态菜单导航反应JS
- 11. 导航菜单
- 12. 关于导航控制器
- 13. 通过SSH读取进程的控制台输出,linux
- 14. jquery:基于菜单选择的标签式菜单导航,激活和停用
- 15. Rails控制台(END)如何通过它?
- 16. 我如何通过控制台
- 17. 如何通过导航控制器管理UIViewControllers?
- 18. 基于jquery的下拉式导航菜单
- 19. 基于部署的罐子动态创建导航菜单
- 20. 如何通过亚马逊aws控制台导入公钥
- 21. 导航菜单的URL定制
- 22. 通过控制台从php访问pdo
- 23. 通过Python从Python控制VirtualBox?
- 24. 如何基于Symfony中的原则生成多级导航菜单嵌套集?
- 25. Jenkins通过SSH运行Shellscript不离开控制台
- 26. 连接到远程SSH服务器(通过Node.js/html5控制台)
- 27. 导航控制台不加载
- 28. 保存控制台登录导航
- 29. 导航控制台测试问题
- 30. 通过下拉菜单的从视图控制器
我刚刚修改了一下你的解决方案:a)最好通过len(chan.in_buffer)来验证剩余缓冲区的长度b)ESC字符是'\ x1b'。非常感谢! – Jury