web-dev-qa-db-ja.com

特定の文字が応答で返された後、どうすればnetcat接続を閉じることができますか?

非常に単純なtcpメッセージングスクリプトを使用して、テキストをサーバーポートに送り、応答を返して表示します。

対象となるスクリプトの部分は次のようになります。

cat someFile | netcat somehost 1234

サーバーが返す応答は、特定の文字コード(具体的には&001C) 戻ってきた。

この特殊文字を受け取ったときに接続を閉じるにはどうすればよいですか?

(注:サーバーしない接続を閉じます。現在、CTRL + Cでスクリプトが完了したことがわかると、スクリプトが完了したことがわかります。これらのメッセージの多くを次々と送信できます。)

(注:netcat -w xは、これらのメッセージをできるだけ速くプッシュしたいので十分ではありません)

31
SCdF

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を調整して、一度に文字を読み取ってエコーする必要があります。

15
caf

これはどう?

クライアント側:

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」が表示された後、サーバー側が閉じて「closed ...」と出力し、接続が実際に閉じられていることを確認します。

8
anishsane

試してください:

(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はそれ以外の方法でそれを認識しません。

7
bdonlan

たぶんNcatも見てください:

「Ncatは、Netcat 1.x、Netcat6、SOcat、Cryptcat、GNU Netcatなど)など、さまざまなNetcatインカネーションからの多くの主要機能の集大成です。Ncatには、接続ブローキング」、TCP/UDPリダイレクション、SOCKS4クライアントおよびサーバーサポート、Ncatプロセスを「チェーン」する機能、HTTP CONNECTプロキシ(およびプロキシチェーン)、SSL接続/リッスンサポート、IPアドレス/接続フィルタリング、その他多数。」

http://nmap-ncat.sourceforge.net

4
jjay

これは私にとって最も効果的でした。 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)
3
Gabriel Le Roux