2013-12-09 118 views
3

我已經打開一個連接用於Telnet客戶端的服務器,像 例如標籤完成: 我運行服務器./server並在另一個窗口我運行Telnet客戶端的遠程登錄本地主機9999,當我運行telnet客戶端時,我會通過CLI >>得到新的CLI提示符。如何實現的Telnet客戶端

從這個提示我需要自定義選項卡完成,但許多博客的說,我們可以真的沒有的Telnet端實現的readline功能,如果是這樣,我們走我們自己的客戶。

我該如何實現它?任何相關的幫助將不勝感激。我使用的是Linux(Ubuntu)和C語言。

+0

看來你可能想[閱讀更多關於telnet協議](http://en.wikipedia.org/wiki/Telnet)。特別是[相關的RFC](http://en.wikipedia.org/wiki/Telnet#Related_RFCs)(如[linemode選項](http://tools.ietf.org/html/rfc1184))。 –

回答

1

您可以在客戶端或服務器上實現此功能。

對於客戶端的實現有兩種方式(這基本上是相同的):

  1. 當客戶端連接,服務器發送命令及其參數的列表,並且在緩存客戶端。當用戶按下TAB鍵時,客戶端將搜索此緩存數據。

  2. 當客戶端通知TAB鍵被按下時,它會要求服務器列出可能的完成項。爲了加快速度,這個列表應該緩存在客戶端。

所以這裏的基本解決方案是:服務器發送數據到客戶端,客戶端顯示數據。


對於服務器端執行,你必須使用telnet協商來告訴客戶端發送原始未煮過的字符和按鍵,而不到服務器的任何干擾。然後服務器可以檢查TAB密鑰並執行完成。

這裏的問題是,那麼你必須添加的所有命令行編輯,並在服務器代碼提示,並且可以不依賴於客戶端上的是什麼,但一個「啞終端」。


擁有全部處理完成服務器端具有您幾乎可以使用任何Telnet客戶端(只要它能夠處理的telnet談判),並沒有使自己的自定義客戶端的上行空間。缺點是你必須自己在服務器中實現整個命令行編輯功能,並且按鍵的等待時間可能很長,因爲每個密鑰都必須發送到服務器,然後從服務器回傳。

有一個定製的客戶端,有可以輕鬆處理命令行編輯,並完成幫助圖書館上攻。這裏的主要缺點是你必須製作一個自定義的客戶端。

+0

Joachim我想知道如何接收客戶端中的'\ t'...這裏的大問題是如何在將telnet設置爲CHARACTER模式後按字符收集字符。 – Puneeth

+0

@Puneeth如果您使用標準的telnet客戶端,並且它處於字符模式,那麼只要收到它,它應該簡單地將選項卡發送到服務器。如果您有自定義客戶端,則[GNU readline庫](http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html)支持標籤(或其他字符,可配置)來調用您的回調函數碼。閱讀[自定義完成者](http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC44)。 –

+0

@Puneeth如果您有一個自定義的基於GUI的客戶端,那麼GUI將具有識別密鑰的功能,包括選項卡。請參閱您在此情況下使用的GUI工具包的參考資料。 –

0

你必須把一個字符模式的Telnet客戶端,所以它時,它的類型(而不是等待返回鍵發送完整的線)直接發送每個鍵到服務器。然後,每當您收到'\ t'時,請檢查您在'\ t'之前收到的內容,並根據是否可以完成該行,發送完整行或可能的列表。基本上,你正在服務器中實現readline()。

+0

你能告訴我如何將這種行模式設置爲字符模式......是編程模式還是手動模式。 – Puneeth

+0

檢查此:http://stackoverflow.com/questions/273261/force-telnet-client-into-character-mode –

+0

我以前看到這個鏈接,但沒有得到準確的做什麼,我是遠程登錄的新手。我是否需要啓用字符模式,但是在發出telnet命令時如何......是一個telnet localhost 999 ..或者它與編程有關...或者應該輸入什麼內容以及應該在哪裏發出命令。 – Puneeth

0

當您telnet主機後,輸入ctrl + ]進入telnet命令提示符,然後執行mode character。之後,telnet客戶端進入「一次一個字符」模式,並且選項卡完成應該正常工作。

[email protected]:~$ telnet 192.168.193.88 10015 
Trying 192.168.193.88... 
Connected to 192.168.193.88. 
Escape character is '^]'. 



my_prompt> 
my_prompt> 

my_prompt> 

my_prompt>^] 
telnet> mod character 

my_prompt�� 
my_prompt> 
my_prompt>