非常に単純なtcpメッセージングスクリプトを使用して、テキストをサーバーポートに送り、応答を返して表示します。
対象となるスクリプトの部分は次のようになります。
cat someFile | netcat somehost 1234
サーバーが返す応答は、特定の文字コード(具体的には&001C
) 戻ってきた。
この特殊文字を受け取ったときに接続を閉じるにはどうすればよいですか?
(注:サーバーしない接続を閉じます。現在、CTRL + Cでスクリプトが完了したことがわかると、スクリプトが完了したことがわかります。これらのメッセージの多くを次々と送信できます。)
(注:netcat -w x
は、これらのメッセージをできるだけ速くプッシュしたいので十分ではありません)
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」が表示された後、サーバー側が閉じて「closed ...」と出力し、接続が実際に閉じられていることを確認します。
試してください:
(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)