Pipe

netcat 不列印響應

  • January 27, 2022

我正在嘗試使用netcat和管道響應將命令發送到 tcp 埠,

當我執行netcat並鍵入命令時,它會正確列印響應,但是當我從管道傳遞命令時,它會正確發送命令但不列印響應

因此,這可以正常工作:

netcat  localhost 9009

雖然這只是發送命令但不列印響應:

echo 'my_command' | netcat  localhost 9009

為什麼?

如何netcat列印響應文本?

正如@Patrick 所說,這個問題通常是由於netcat在給出響應之前退出。您可以通過添加-q 2到命令行來解決這個問題,即netcat在標準輸入上檢測到 EOF 後告訴掛起 2 秒左右。顯然你也可以讓它等待一些其他的秒數。

用這個:

cat <(echo command) - | nc host port

問題是它nc會在標準輸入關閉後立即關閉連接,這對於簡單的my_command字元串來說非常快,因此永遠沒有機會收到響應。(如果您通過管道傳輸一個非常大的文件,您會看到它可能會在發送完文件之前得到響應)。

cat使用-作為第二個參數輸入:它cat在發送第一個參數的內容後,在標準輸入上偵聽更多內容以通過管道傳輸。第一個參數只是讓echo命令通過cat——它也可以是一個文件,其中包含你的命令 a la cat < file - | ...

或者這樣做:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

#這會在輸入的第二行發送無限的字元。使用#像遠端這樣的 bash 會忽略它作為評論。我在這裡選擇了一個 10 毫秒的小等待時間,所以它在連接結束時反應更快。YMMV。

不利的一面可能是那個catwhile循環並nc繼續執行,直到你擊中^C^D在外殼上。這真的取決於遠端端。

使用-w 1(OSX netcat)或-i 1(nmap’s ncat)添加超時使其關閉連接並nc在1秒後,但cat會繼續執行,直到您輸入一些字元並且管道中斷(我認為)。

但是,如果遠端端在接收並處理命令後會自動關閉連接,則它會起作用 - 這也將結束nc客戶端和程序管道進入它。

該答案基於this answer to an same superuser question

引用自:https://unix.stackexchange.com/questions/289364