題 如何將命令傳遞給將保持活動狀態的netcat?


echo command | netcat host port

這導致命令被發送到遠程主機並且一些數據被回讀。但幾秒鐘後,連接關閉。 -w參數沒有改變任何東西。我在SuSE 10.1上使用netcat v1.10。


31
2018-03-24 17:06


起源


您確定不是遠程主機關閉連接嗎? - grawity
是。執行netcat然後手動鍵入命令會導致netcat無限期地保持活動狀態。 - Chris
為什麼它會活著?它只是打印echo參數然後死掉? - M'vy
我希望它保持活著,以便繼續接收來自遠程服務器的數據。 - Chris
這不是真的。 “netcat <host> <port>”打開雙向TCP套接字。 - Chris


答案:


這適用於 nc OS X上的命令(假設您要發送的命令在文件中):

cat file - | nc host port

(實質上, cat 在stdout上轉儲文件的內容,然後在stdin上等待你。

通過擴展,如果你想從shell本身發送命令,你可以這樣做:

cat <(echo command) - | nc host port

31
2018-04-10 05:20



這很好,因為它適用於非常簡單的骨骼嵌入式系統,其中netcat缺乏所有花哨的選項。 - SF.
{ echo command; cat;} 會做同樣的事情,可能會被認為更容易理解。 - G-Man
正如我所看到的那樣 netcat 命令將保持套接字打開,直到它看到輸入結束。所有這些例子都證明了這一點,但沒有真正說明 為什麼。我正在與之互動 SocketTest  服務器 運用 netcat 長期使用: cat - | nc localhost 8063。 SocketTest  是一個方便的工具,可以在任何TCP或UDP端口上偵聽或提供服務。 - will


nc 在Ubuntu上:

nc -q -1 host port

來自 Ubuntu的 nc 手冊頁

 -q seconds
         after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.

注意可用 nc 選項在發行版之間變化很大,因此這可能不適用於您的(OpenSUSE)。


14
2018-05-19 15:53





我找到了:

echo command | netcat host port -

我的同事知道這件事。我根本沒有在文檔中看到這一點。


11
2018-03-24 18:48





我不認為你會用netcat或socat來管理它。我剛剛對兩者進行了大量的修補,而socat看起來最有希望。

我設法將socat設置為連接到遠程TCP端口並偵聽本地unix域套接字(理論上所以鏈接可以一直保持)但是一旦本地進程從unix套接字中分離(另一個socat)將unix套接字鏈接到stdin / out)它關閉了TCP socat會話。

這裡的問題是通過netcat / socat的每個連接都會與服務器建立新的TCP流連接,並在本端斷開連接時關閉該TCP流會話。

我認為你可能不得不為此編寫一些自定義代理軟件,打開到遠程端的TCP連接,然後在socket / pipe / fifo或其他任何地方本地監聽,然後只是將數據發送到現有的TCP管道並返回結果。


3
2018-03-24 17:43



聽聽全能的馬特詹金斯:D - M'vy


Georges的方法在交互式shell中運行良好,但對於腳本編寫無效,例如將您的腳本稱為 nohup ./script &

我發現用虛擬fifo替換stdin會有所幫助。

 mkfifo dummy
 cat command.txt dummy | nc host port

由於在輸出文件後沒有任何內容寫入fifo, cat 無限期地掛在上面。


1
2017-11-03 15:58





可能是插座另一端的連接關閉了嗎?

默認情況下, nc 完成後關閉連接,如果你沒有明確地告訴他繼續聽(用 -k 選項):

 -k    Forces nc to stay listening for another connection after its current
       connection is completed.  It is an error to use this option without the
       -l option.

看到 man nc.1


我在兩台機器之間成功傳輸數據,如下所示:

  • 發件人:

    while (true); do 
      echo -n "$RANDOM " | nc <host> <port>
    done
    
  • 接收器:

    nc -kl <port> 
    

1
2018-03-05 08:42





socatshut-none 選項應該有幫助:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

您可能還需要使用覆蓋默認超時時間段 -t <timeout>否則插座將在0.5秒後關閉。此選項會覆蓋默認行為,即:

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

所以,命令如:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

發送'blah'後,套接字將保持打開狀態10秒。


0
2018-06-07 13:14





如果遠程主機關閉連接(或無法訪問)或管道終止之前的命令(netcat仍然發送其餘的輸入隊列),則命令終止。


0
2018-06-07 13:20