我们有一个非常简单的tcp消息传递脚本,它将一些文本捕获到服务器端口,该端口返回并显示响应。
我们关心的脚本部分看起来像这样:
cat someFile | netcat somehost 1234
一旦我们返回一个特定的字符代码(特别是&001C
),服务器返回的响应就是“完成”。
如何在收到此特殊字符时关闭连接?
(注意:服务器不会关闭我的连接。虽然我现在只是CTRL + C脚本,但我可以告诉它已完成,我希望能够发送许多这些消息,一个接一个。)
(注意:netcat -w x
不够好,因为我希望尽快推送这些消息)
答案 0 :(得分:15)
创建一个名为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,以便一次读取和回显一个字符。
答案 1 :(得分:7)
尝试:
(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逐行操作。
答案 2 :(得分:7)
这个怎么样?
客户方:
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'后,服务器端关闭&amp;打印'关闭......',确保连接确实已关闭。
答案 3 :(得分:4)
也许看看Ncat:
“Ncat是Netcat 1.x,Netcat6,SOcat,Cryptcat,GNU Netcat等各种Netcat版本的许多关键功能的高潮.Ncat具有许多新功能,如”连接代理“,TCP / UDP重定向,SOCKS4客户端和服务器支持,能够“链接”Ncat进程,HTTP CONNECT代理(和代理链接),SSL连接/侦听支持,IP地址/连接过滤,以及更多。“
答案 4 :(得分:3)
这对我来说效果最好。只需使用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)
答案 5 :(得分:-1)
这很有效:
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~]#