[英]How can I close a netcat connection after a certain character is returned in the response?
我們有一個非常簡單的tcp消息傳遞腳本,它將一些文本捕獲到服務器端口,該端口返回並顯示響應。
我們關心的腳本部分看起來像這樣:
cat someFile | netcat somehost 1234
一旦我們得到返回的某個字符代碼(特別是&001C
),服務器返回的響應就是“完成”。
當我收到這個特殊字符時,如何關閉連接?
(注意:服務器不會為我關閉連接。雖然我現在只是CTRL + C腳本,但我可以告訴它已完成,我希望能夠一個接一個地發送許多這些消息。)
(注意: netcat -wx
不夠好,因為我希望盡快推送這些消息)
創建一個名為client.sh的bash腳本:
#!/bin/bash
cat someFile
while read FOO; do
echo $FOO >&3
if [[ $FOO =~ `printf ".*\x00\x1c.*"` ]]; then
break
fi
done
然后從主腳本調用netcat,如下所示:
3>&1 nc -c ./client.sh somehost 1234
(你需要使用bash版本3進行正則表達式匹配)。
這假定服務器正在以行的形式發送數據 - 如果不是,您將不得不調整client.sh,以便它一次讀取和回顯一個字符。
這個怎么樣?
客戶端:
awk -v RS=$'\x1c' 'NR==1;{exit 0;}' < /dev/tcp/host-ip/port
測試:
# server side test script
while true; do ascii -hd; done | { netcat -l 12345; echo closed...;}
# Generate 'some' data for testing & pipe to netcat.
# After netcat connection closes, echo will print 'closed...'
# Client side:
awk -v RS=J 'NR==1; {exit;}' < /dev/tcp/localhost/12345
# Changed end character to 'J' for testing.
# Didn't wish to write a server side script to generate 0x1C.
客戶方產生:
0 NUL 16 DLE 32 48 0 64 @ 80 P 96 ` 112 p
1 SOH 17 DC1 33 ! 49 1 65 A 81 Q 97 a 113 q
2 STX 18 DC2 34 " 50 2 66 B 82 R 98 b 114 r
3 ETX 19 DC3 35 # 51 3 67 C 83 S 99 c 115 s
4 EOT 20 DC4 36 $ 52 4 68 D 84 T 100 d 116 t
5 ENQ 21 NAK 37 % 53 5 69 E 85 U 101 e 117 u
6 ACK 22 SYN 38 & 54 6 70 F 86 V 102 f 118 v
7 BEL 23 ETB 39 ' 55 7 71 G 87 W 103 g 119 w
8 BS 24 CAN 40 ( 56 8 72 H 88 X 104 h 120 x
9 HT 25 EM 41 ) 57 9 73 I 89 Y 105 i 121 y
10 LF 26 SUB 42 * 58 : 74
出現'J'后,服務器端關閉並打印'關閉......',確保連接確實已關閉。
嘗試:
(cat somefile; sleep $timeout) | nc somehost 1234 | sed -e '{s/\x01.*//;T skip;q;:skip}'
這需要GNU sed。
這個怎么運作:
{
s/\x01.*//; # search for \x01, if we find it, kill it and the rest of the line
T skip; # goto label skip if the last s/// failed
q; # quit, printing current pattern buffer
:skip # label skip
}
請注意,這假設在\\ x01之后會有換行符 - 否則sed將看不到它,因為sed逐行操作。
也許看看Ncat:
“Ncat是Netcat 1.x,Netcat6,SOcat,Cryptcat,GNU Netcat等各種Netcat版本的許多關鍵特性的高潮.Ncat具有許多新功能,如”連接代理“,TCP / UDP重定向, SOCKS4客戶端和服務器支持,能夠“鏈接”Ncat進程,HTTP CONNECT代理(和代理鏈接),SSL連接/偵聽支持,IP地址/連接過濾,以及更多。“
這對我來說效果最好。 只需使用while循環讀取輸出,然后使用if語句檢查“0x1c”。
while read i; do
if [ "$i" = "0x1c" ] ; then # Read until "0x1c". Then exit
break
fi
echo $i;
done < <(cat someFile | netcat somehost 1234)
這非常有效:
echo ^C | nc -v 29.7.144.21 1364
見下面的輸出:
[root @ localhost~] #echo ^ C | nc -v 29.7.144.21 1364 Ncat:版本6.40( http://nmap.org/ncat )Ncat:連接到29.7.144.21:1364。 ^ C Ncat:發送3個字節,0.01秒內接收0個字節。
[root @ localhost~]#
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.