2012-07-20 35 views
3

我正在尋找一種在使用telnetlib時調整終端大小的方法。我使用Paramiko的resize_pty在SSH上取得了類似的效果,但我也需要支持telnet協議。這甚至可能(telnet甚至有控制流)?是否可以用telnetlib發送「resize pty」命令?

請注意,telnetlib不是一個要求 - 如果有更好的庫,我會很樂意使用它。

更新(更多背景信息):我正在構建一個基於Web的界面,用於連接到網絡設備。前端使用JS/AJAX構建,它基本上只是將按鍵發送到後端並從中接收屏幕內容。後端是用Python編寫的,負責打開設備的SSH/Telnet會話,向其發送鍵擊並獲取輸出流,然後通過VT100虛擬終端(pyte)傳遞輸出流。虛擬屏幕的內容然後被髮回到前端。當用戶想要在瀏覽器中調整終端屏幕尺寸時,就會出現問題。通過SSH,我只需通過Paramiko發送resize_pty(),然後調整pyte的虛擬終端屏幕大小。但是對於telnet,我無法找到適當的調整大小的功能,它會告訴設備它應該調整它的終端。這可能嗎?

+0

能否詳細說明你在做什麼?你需要telnetlib來爲你處理某種帶有服務器輸出的僞終端,或者只是發送調整大小的終端請求給它? – 2012-07-30 08:07:52

+0

@MichałGórny:我已經更新了這個問題,我希望現在更有意義...... :) – johndodo 2012-07-30 11:17:33

+0

謝謝。我做了一些研究,當終端調整大小時,telnetd調試'td:recv suboption NAWS 0 97(97)0 26(26)'。可悲的是,我在'telnetlib'中看不到任何特定的選項來發送子選項,但我必須仔細看看協議。 – 2012-07-30 14:08:06

回答

4

好吧,我已經能夠收集下列代表作:

naws_command = struct.pack('!BBBHHBB', 
     255, 250, 31, # IAC SB NAWS 
     width, height, 
     255, 240) # IAC SE 
t.get_socket().send(naws_command) 

現在的解釋幾句。

首先,telnetlib不支持直接發送命令;它只是逃避它們。因此,要發送命令,我們必須直接使用底層套接字。我們使用Telnet對象實例的get_socket()方法(此處爲t)執行此操作。

這裏組裝的NAWS命令由RFC 1073定義。 widthheight變量是常規Python整數,它們被打包成兩個16位無符號整數。

請注意,這不是一個完美的解決方案,我不確定它是否會真正爲您工作。最重要的是,在功能協商期間,telnetlib會通知服務器它WON'T NAWS,所以特定的服務器可能實際上忽略了這些命令。

如果是這種情況,您可能需要使用set_option_negotiation_callback()。不幸的是,這意味着你將不得不處理通常爲你所做的所有選項。而且AFAIK沒有這方面的便利。

+1

謝謝!!!我必須使用'set_option_negotiation_callback()'來完全按照您所描述的設置'WILL NAWS'。這也不算什麼,我只研究了telnetlib.py並複製了它對消息的處理 - 只有幾行。它現在完美。 :) – johndodo 2012-07-31 06:52:59

+1

是的,'telnetlib'在代碼中看起來非常簡單。它也有一些符號常量可供您使用;但我認爲你需要在'pack()'調用中用'c'替換'B'。 – 2012-07-31 07:19:20

相關問題