如何在响应中返回某个字符后关闭netcat连接?

SCd*_*CdF 31 linux bash netcat

我们有一个非常简单的tcp消息传递脚本,它将一些文本捕获到服务器端口,该端口返回并显示响应.

我们关心的脚本部分看起来像这样:

cat someFile | netcat somehost 1234
Run Code Online (Sandbox Code Playgroud)

一旦我们得到某个字符代码(特别是&001C)返回,服务器返回的响应就是"完成" .

当我收到这个特殊字符时,如何关闭连接?

(注意:服务器不会为我关闭连接.虽然我现在只是CTRL + C脚本,但我可以告诉它已完成,我希望能够一个接一个地发送许多这些消息.)

(注意:netcat -w x不够好,因为我希望尽快推送这些消息)

caf*_*caf 15

创建一个名为client.sh的bash脚本:

#!/bin/bash

cat someFile

while read FOO; do
        echo $FOO >&3
        if [[ $FOO =~ `printf ".*\x00\x1c.*"` ]]; then
                break
        fi
done
Run Code Online (Sandbox Code Playgroud)

然后从主脚本调用netcat,如下所示:

3>&1 nc -c ./client.sh somehost 1234
Run Code Online (Sandbox Code Playgroud)

(你需要使用bash版本3进行正则表达式匹配).

这假设服务器正在以行的形式发送数据 - 如果不是,您将不得不调整client.sh,以便它一次读取和回显一个字符.


ani*_*ane 8

这个怎么样?

客户端:

awk -v RS=$'\x1c' 'NR==1;{exit 0;}'  < /dev/tcp/host-ip/port
Run Code Online (Sandbox Code Playgroud)

测试:

# 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.
Run Code Online (Sandbox Code Playgroud)

客户方产生:

    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
Run Code Online (Sandbox Code Playgroud)

出现'J'后,服务器端关闭并打印'关闭......',确保连接确实已关闭.

  • 如果最高投票的答案不是我的,并且没有接受的答案,我是如何得到赏金的? (2认同)

bdo*_*lan 7

尝试:

(cat somefile; sleep $timeout) | nc somehost 1234 | sed -e '{s/\x01.*//;T skip;q;:skip}'
Run Code Online (Sandbox Code Playgroud)

这需要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
}
Run Code Online (Sandbox Code Playgroud)

请注意,这假设在\ x01之后会有换行符 - 否则sed将不会看到它,因为sed逐行操作.