2015-11-24 68 views
1

我正在使用我的開源串行到IP轉換器(串行網絡接口,SNI)使用ttyS0控制檯與無頭的Slackware服務器進行通信。連接期間的SNI發送回Telnet命令集ff fb 01 ff fb 03。這將Telnet從Line模式切換到Char模式。但我注意到,Telnet將我的CR按(0x0d)替換(添加)爲兩個字符0x0d 0x00。 Slackware的TTY本身不受此限制,但我在其下運行的一些命令,至少是catmcedit,不是。所以我儘量做到以下幾點:在我的SNITelnet:如何在發送時使用char模式(交互模式)刪除每個CR(0x0d)後的NULL(0x00)?

  1. 將過濾所以它只是扔掉空值的方向IP->系列。它可以工作,但它非常難看,因爲不再允許二進制轉換。
  2. 更改Telnet的源代碼以刪除addind NULL到CR:

    inetutils-1.9.4/telnet/telnet.c from line 2294: 
         case '\r': 
          if (!crlf) 
         { 
          NETADD ('\r'); <-- added 
    //  NET2ADD ('\r', '\0'); <-- removed 
         } 
          else 
         { 
          NET2ADD ('\r', '\n'); 
         } 
          bol = flushline = 1; 
          break; 
    

它還工作,所以我保證我是在正確的道路追趕的問題。 但由於多種原因,它也很醜陋,包括它不可移植,並且有義務讓我擁有自己的非標準telnet二進制文件。

所以問題是:有可能命令Telnet不要修改我的CR? (看這個源代碼片斷,原始代碼根本不可能,但我肯定我錯過了一些東西,而且這應該是可能的,而不需要修改源代碼)。注意:將0x0d替換爲0x0d,0x0a(代碼中存在)不適用於Linux TTY:它將其解釋爲兩個CR。

而子問題是:0x0d + 0x00在哪裏使用?我不知道任何硬件設備,電傳打字機等等,以及任何TT在CR之後都使用NULL的地方。謝謝。

回答

0

我相信你正在尋找的解決方案是較高的幾行:

if (!crlf) 

如果我們設置crlf = true,那麼我們將得到\r\n而不是\r\0。這可能適用於貓和朋友。

翻閱遠程登錄源,看起來crlf是某種「切換」選項。尋找一個man telnet和一點谷歌搜索,它似乎可以運行something like this

$ telnet 
telnet> toggle crlf 

...你會得到從此發送\r\n

+1

是的,「toggle crlf」按照您的描述工作,但不是。它對我沒有幫助:正如我之前提到的,linux TTY將'r \ n'解釋爲兩個CR(現在我測試'cat'命令,它的行爲是相同的)。我仍然想知道在哪裏使用'\ r \ 0',並且Telnet應用程序在全球範圍內是否被固定,然後會發生什麼。謝謝你的答案。 – jpka

+0

我確定telnet的人有一個很好的理由發送'\ r \ 0'和'\ r \ n',它可能不應該被固定到'\ r'。我認爲真正的問題可能在telnet之外:爲什麼按Enter鍵時發送'\ r \ n'?如果你只發送了'\ n',那麼你的問題就會被解決,我認爲這是telnet所期望的。也許你可以在一些終端設置或Windows設置中解決這個問題。 –

+1

我使用Telnet(Ubuntu,英語UTF8控制檯)進行的當前設置僅發送給telnet'\ r'代碼。目前由於未知原因,Telnet不能僅僅傳輸'\ r',而是替換爲'\ r \ 0'或'\ r \ n'。所以我不發送'\ r \ n',但是Telnet執行它。 使用'\ n'作爲CR是個不錯的主意,但看起來好像不太容易獲得,因爲我甚至無法想象軟件級別在哪裏搜索,驅動程序,控制檯等(我只使用Linux機箱)。而這對於rs232控制檯來說遠非標準,至少因爲鍵的代碼爲0x0d,而不是0x0a,至少在世界範圍內至少有半個世紀,AFAIK ... – jpka

1

因此,我採取一些調查,看看如何正確解決這個問題,不要濫用軟件,找到正確的工具,或清楚地顯示目前沒有這樣的工具。

首先,我說明了爲什麼我的設置完全按照它的樣子,以及爲什麼它使用(或不使用)標準工具。

我的目標對Linux世界非常普遍和必不可少(正如我之前所想的)。由於Linux是網絡操作系統,因此Linux機器應該可以通過網絡完全配置(因此無人機時可以/應該完全有用,即沒有顯示器)。但是在Lilo/Grub開始的時候,沒有網絡。目前只有串行端口可用(並且Lilo/Grub支持它)。爲什麼此時遠程控制很重要?僅僅因爲你可以爲你的Slackware盒子(遠程)編譯新的自定義內核,並且想要測試它,在Lilo列表中添加第二個選項,並且即使在啓動時遠程機器卡住也要返回到原始內核,所以沒辦法遠程編輯/ agjust Lilo選項。

但是串口控制檯對於Linux機器來說真的是更強大的工具。 它顯示引導消息並關閉無法通過ssh看到的消息,因爲網絡在這些時刻未被初始化。 (請記住,我們沒有顯示)。 它允許您(突然或有意)丟棄所有網絡接口,而無需擔心機器丟失,因爲距離您很遠。

注意:串行控制檯不能立即使用,但可以採用衆所周知的標準方式進行配置,並在許多地方進行了描述。示例是http://docs.slackware.com/howtos:general_admin:serial_console

注意:存在串行端口應該是BIOS識別的問題,即完全在板上。當Lilo/Grub啓動時,USB和PCIE設備將無法正常工作。幸運的是有一個好消息。硬件串行端口現在(緩慢)返回到主板。我爲我的服務器測試了新的現代華碩J1900I-C,它有兩個rs232端口,並且一切正常。

要遠程使用串行控制檯的優點,應該使用某種類型的SNI,串行網絡接口(這是唯一的方法,AFAIK)。 SNI通常包含(最簡單的)TCP偵聽服務器和原始IP到串行雙工轉換器。當Lantronix X-Port發明時,我開始研究和使用SNI。這是在2006年,並與Slackware盒正常工作。 (我不記得XPort是否存在\r\0問題,但讓我們繼續)。 XPort是也是昂貴,並且在Wiznet W5100發佈時立即被我自己的開源SNI替代。 (真的,還有其他一些基本問題,爲什麼我需要更換Lantronix,它不能按主板上的重置或電源按鈕,而我的設備可以,而且現在服務器在內核恐慌之後絕對處於完全遠程控制之下;但是它在這裏是offtopic)。現在在網上商店也有很多便宜的不叫SNI的;我不測試這些。

所有這些時間我使用telnet連接到SNI。主要原因是XPort文檔有這樣的例子。而且,大多數時候它工作。我不能說\r\0問題會阻止我的工作。大多數時候它根本不明顯(比如,mc指揮官抵制NULL's)。但mcedit害怕NULL。最近我開始瞭解這個問題,所以這個問題就因此而出現了。 (現在請從線程開始重新閱讀)。

現在我試着回答我自己的問題。所有這些時間我都在誤用這個軟件。 telnet是而不是爲人類溝通而寫的;相反,Telnet(突然)使用Telnet協議,而不是Raw協議;和\r\0 s可能是協議的一部分。 (可能是因爲RFC在任何地方都沒有提到NULL的要求)。 雖然Telnet和原始協議可能看起來相當接近,但它們不匹配,所以有時應該可以工作,但有時不可以。 使用bruteforce並重新編譯二進制文件,我表明,Telnet可以很容易地轉向原始模式;但之後它是非標準軟件,並且不可能將其推向全球回購。

所以我尋找Raw utilites。 netcatncat沒有Char模式,只有Line模式,所以只有純控制檯可能,沒有ANSI顏色,mc,密碼等Putty太複雜並且使用GUI。而且...沒有更多的實用工具,我發現!這是相當奇怪和煩人的... 然後,我嘗試使用最初的基於字符的終端,minicomgtkterm。他們都不允許飼料ip:port結構是ttyS*名稱。但有數據翻譯存在,我試着socat。它連接到SNI服務器並創建虛擬串口;然後字符終端軟件連接到該端口。

而且,最後,工作。哇。 但是這條鏈上有很多缺點;複雜,難以記憶的命令,不能寫入一行;當SNI丟棄TCP連接時,不可能看到/捕獲該連接;在連接時間由socat發送到虛擬端口的很多垃圾(457 數據包我算!)。這裏是勇敢的人誰可能會發現我的工作有用的命令。

sudo socat pty,link=/dev/ttyMYPORT,raw tcp:10.1.1.11:10001 & 
then 
sudo chmod a+rw /dev/ttyMYPORT; gtkterm -p /dev/ttyMYPORT 
or 
sudo chmod a+rw /dev/ttyMYPORT; minicom -o --color=on -D /dev/ttyMYPORT 

和結論,我沒有發現任何簡單的軟件現在,可以直接用於人類的原始字符模式下通過網絡橋接串口通信。 (請提出建議)。謝謝。