2017-04-13 121 views
0

我有一臺服務器的IP和一個可以通過Ubuntu 14.04上的nc連接的端口。使用Netcat或Rails通過TCP/IP發送數據

> nc x.x.x.x PORT 

爲了與服務器通信,第一步是發送一個WAKEUP調用並獲得確認。服務器在喚醒呼叫中需要一個3字節的ID。文檔中提供了一個示例,其中顯示了使用軟件發送ID和接收確認的成功方案。即

客戶端發送:

<sy><sy><eq>111<et> 

而且服務器響應:

<sy><ak>A<et><cr> 

這裏是<sy>

在<>括號中的一些細節是不可打印ASCII字符(<sy> = ASCII 22或十六進制0x16)

我試圖複製完全相同的情況,但未能如願。服務器不響應我發送的數據,儘管數據是在那裏接收的。我不確定這些標籤<sy><sy><eq>等。如何正確發送ID(111)以及這些標籤<sy>

還試圖發送這個數據使用Rails框架和Bindata ruby​​寶石,但不知道如何表示上述格式。

回答

1

netcat可能是這個錯誤的工具。或者至少你會想用其他程序來爲它提供輸入。

如果我這樣做了,我會用python或C編寫一些東西,它們都會連接到服務器併爲它發送它所需的任何數據(並接收/解釋響應),完全廢除nc。網絡上有很多例子。

您可以使用語法b'\x16'對您的<sy>字符在Python中以字節字符串編碼控制字符。大多數其他語言具有相同的功能。

我不能確定這些字符究竟是什麼。看起來它們可能是標準的ASCII控制字符,但它們沒有使用標準縮寫(例如參見http://www.theasciicode.com.ar/)。所以大概你正在看的文檔有一個相應值的列表。假設爲了舉例,<eq>對應於ASCII EQ字符和<et>對應於ASCII EOT(並且假定您已經知道<sy>等同於ASCII SYN),則您所需的字符串<sy><sy><eq>111<et>可以用python字節字符串編碼:b'\x16\x16\x05111\x04'

(或等價b'\x16\x16\x05\x31\x31\x31\x04'如果你喜歡規律性:在1字符是簡單的ASCII數字,這樣你就可以用等值的二進制數b'\x31'替換每個1

要返回nc,試圖在鍵入控制字符到nc從終端輸入在大多數情況下,儘管可能會很困難且容易出錯。您需要知道等效的控制字符映射(例如,0x16是「Ctrl-V」),並且需要知道如何讓終端接受該文字字符(巧合的是,在Linux中,您必須在大多數控制字符之前用Ctrl-V輸入它們作爲輸入,並避免以通常的方式解釋它們:Ctrl-D == EOF,Ctrl-C == Interrupt,Ctrl-W == Delete-Previous-Word等)。

所以,如果你想進入上述數據爲nc的命令行輸入,你需要鍵入這些字符:

Ctrl-V Ctrl-V    <sy>/SYN 
Ctrl-V Ctrl-V    <sy>/SYN 
Ctrl-V Ctrl-E    <eq>/ENQ 
1 
1 
1 
Ctrl-V Ctrl-D    <et>/EOT 

不過還有一點需要注意的是,通常nc實際上不會發送任何東西,直到你輸入一個換行符(即按回車鍵)。然後這個換行符也會被髮送到服務器,這可能不是你想要的。

+0

我想使用Ruby on Rails框架和稱爲Bindata的gem來實現這個目標,但是還沒有成功。 – Arif