2013-05-05 96 views
8

我想寫一個遠程控制檯,像telnet服務器一樣工作。用戶可以使用telnet登錄服務器,然後編寫一些命令來完成一些工作。如何呈現遠程ncurses控制檯?

一個很好的例子就是路由器os的控制檯。我現在很困惑的是,我可以接受用戶的輸入,做些什麼然後打印一些文本,但是我想用ncurses使控制檯具有更多功能(比如「cmd auto-complete」,語法顏色... ),那我該怎麼做?因爲控制檯在用戶端,如果服務器調用ncurses API它只會改變服務器上的東西...

也許這是一個愚蠢的問題,但我真的很新鮮。任何建議表示讚賞。

回答

9

這比您想象的要困難得多。

您需要了解終端是如何工作的 - 他們使用特殊的控制序列用於移動光標或顏色輸出。這由終端特定的terminfo文件來描述。 Ncurses使用terminfo將API調用(例如,將光標移動到某個位置)轉換爲此類控制序列。

由於終端(時下xtermgnome-terminalscreentmux等)是在客戶端,則必須從客戶機到服務器的通過終端的類型。這就是爲什麼例如ssh將此信息從ssh客戶端傳遞到服務器(在您的ssh會話中嘗試echo $TERM - 如果您通過控制檯登錄,則可能是'linux',如果您使用X和xterm,則可能'xterm')。另外,您最好在服務器上提供各自的terminfo。

另一塊難題是僞終端。由於目前相對較少的人使用串行終端,因此它們的語義被仿真,使得最初爲串行控制檯開發的應用程序和庫(例如curses及其朋友)繼續工作。這是通過僞終端實現的 - 這些就像管道,一個主設備和一個從設備進行通信,一端寫入的任何內容都會在另一端傳出。例如,對於登錄過程,getty可以只使用一個pty設備的一端,並認爲它是一個串行線路 - 您的服務器程序必須處理pty的另一端,將它從pty獲得的所有內容發送到您的客戶端通過網絡。

終端模擬器也使用的pty,類型tty到你的終端,如果您使用的是終端仿真器,你會得到這樣的/dev/pts/9。在pty的另一面,它通常是你的shell,通過pty與你的終端模擬器進行通信。

您的客戶程序可以或多或少地使用標準輸入和標準輸出。如果您的終端信息是正確的,其餘的將由您的終端仿真程序處理,只需將您從服務器程序收到的任何內容傳遞給stdout,並將您從stdin讀取的任何內容發送到您的服務器程序。

希望我沒有遺漏任何重要的細節。祝你好運!

2

可以讓ncurses對標準輸入和標準輸出以外的流進行操作。在initscr()之前調用newterm()來設置ncurses的輸入和輸出文件句柄。

但是,您需要知道連接的遠程端是什麼類型的終端(ssh和telnet都有與服務器通信的機制),您還需要回退到非ncurses接口如果遠端不是受支持的終端類型(或者無法確定終端類型)。