我必須通過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. 導航控制檯菜單
- 2. 如何從數組中創建基於控制檯的菜單?
- 3. Ruby:基於控制檯的菜單
- 4. Skrollr基於FIXED的菜單導航animateTo?
- 5. 如何從菜單導航
- 6. 導軌 - 通過控制檯
- 7. 如何從簡單的視圖創建基於導航控制器的視圖?
- 8. 在控制檯應用程序中實現導航菜單
- 9. 在bash中基於控制檯的菜單
- 10. 基於JAVA控制檯的菜單問題
- 11. 我如何通過ssh直接登錄到rails控制檯?
- 12. Rstudio控制檯導航
- 13. 如何製作固定導航菜單?
- 14. 如何製作左側導航菜單
- 15. 導航和子菜單導航與CSS通過Wordpress網站
- 16. 基於jQuery的YUI風格的菜單用於網站導航
- 17. 如何從導航抽屜菜單項
- 18. CSS:如何使用直接位於其下的子導航菜單製作導航菜單?
- 19. 通過調制解調器導航按鍵式菜單
- 20. 通過控制檯
- 21. java控制檯菜單
- 22. 控制檯啓動菜單
- 23. 用於Jetbrains的數據庫導航器PHPStorm和WebStorm通過SSH
- 24. 我遇到菜單導航問題。如何通過動態菜單導航反應JS
- 25. 關於導航控制器
- 26. 關於導航控制器
- 27. 帶定製控制器的Umbraco 6導航菜單用於預處理
- 28. 導航菜單
- 29. 導航菜單
- 30. 導航菜單
我剛剛修改了一下你的解決方案:a)最好通過len(chan.in_buffer)來驗證剩餘緩衝區的長度b)ESC字符是'\ x1b'。非常感謝! – Jury