代码之家  ›  专栏  ›  技术社区  ›  SCdF

在响应中返回特定字符后,如何关闭netcat连接?

  •  33
  • SCdF  · 技术社区  · 17 年前

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

    cat someFile | netcat somehost 1234
    

    &001C )返回。

    请为我关闭连接。虽然我目前只需按住CTRL+C键即可完成脚本,但我希望能够一个接一个地发送许多这样的消息。)

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

    5 回复  |  直到 17 年前
        1
  •  16
  •   caf    17 年前

    #!/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,使其一次读取并返回一个字符。

        2
  •  10
  •   anishsane    11 年前

    这个怎么样?

    客户端:

    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
    

        3
  •  7
  •   bdonlan    17 年前

    尝试:

    (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
    }
    

        4
  •  4
  •   jjay jjay    17 年前

    也许也可以看看Ncat:

    “Ncat是各种Netcat版本(如Netcat 1.x、Netcat6、SOcat、Cryptcat、GNU Netcat等)的许多关键功能的巅峰之作。Ncat具有许多新功能,如“连接代理”、TCP/UDP重定向、SOCKS4客户端和服务器支持、“链接”Ncat进程的能力、HTTP CONNECT代理(和代理链接)、SSL连接/监听支持、IP地址/连接过滤等等。"

    http://nmap-ncat.sourceforge.net

        5
  •  3
  •   Gabriel Le Roux    11 年前

    这对我来说效果最好。只需使用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)
    
    推荐文章