
我試圖讓 OpenBSD netcat 監聽特定連接埠(3333)和介面(10.42.0.1)上的 UDP 連接並發送固定回應。為了實現這一目標,我這樣做:
echo "asd" | nc -k -u -l -p 3333 -s 10.42.0.1 -v
然後我透過執行以下操作發送訊息:
echo qwe | nc -u 10.42.0.1 3333 -v
輸出是
# Server side
Bound on h9ct3d3 3333
XXXXXqwe
# Client side
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
正如您所看到的,客戶端沒有收到asd
.但是,如果我刪除-k
,它確實會收到它:
##### Server side
echo "asd" | nc -u -l -p 3333 -s 10.42.0.1 -v
Bound on h9ct3d3 3333
# ...
# Wait for the client to execute
# ...
Connection received on h9ct3d3 51318
XXXXXqwe
##### Client side
echo qwe | nc -u 10.42.0.1 3333 -v
# ...
# Wait for the above 'X'to finish
# ...
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
asd
我嘗試使用不帶 的 while 循環-k
,但nc
從未返回:
#!/bin/bash
while true
do
echo "Host message" | nc -q 0 -u -l -p 3333 -s 10.42.0.1 -v
echo "restarting..."
done
我怎樣才能做到這一點?
我的 netcat 版本是:
OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)
PD。為什麼nc
伺服器會「發送」那些奇怪的X
字元?客戶從不閱讀它們,只是等待它們完成。它們似乎每 1 秒顯示一次。
答案1
伺服器沒有發送 X;客戶端在前兩個之後每隔 1 秒發送它們,伺服器顯示他們(理應如此)。如果您-v
脫下客戶,X 不會發送或顯示,資料會立即發送並顯示(不是在 3 秒後)。我沒有任何線索為什麼 -v
意思是「緩慢發送 5 X 個字元」!
手冊頁-k
說
當與-u選項一起使用時,伺服器套接字不連接,並且可以接收來自多個主機的UDP資料封包。
與此一致,伺服器在使用時-v
記錄日誌,但在使用時不記錄日誌。我Connection from {host} {port} received!
-ul
-ulk
懷疑發送「回應」資料的程式碼依賴正在連接的套接字,因此不連接它會阻止回應,但我還沒有挖掘原始程式碼來驗證。
-q 0
不會起作用,因為 UDP 中沒有可檢測的“連接結束”,而 TCP(FIN 交換)中有。如果你的客戶端資料有一些可識別的東西——例如head -1
它總是一行——從邏輯上講,應該可以編寫一些東西來識別該資料並殺死nc
允許循環迭代的進程,但我還沒有這樣做能夠找到一種乾淨的方法來獲取nc
此類識別器/殺手可用的 pid。製作 CW 以防其他人可以在這裡提供真正的解決方案。