2015-10-20 56 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