1

このスタックオーバーフローの質問へのスピンオフとして、いくつかの調整を除いて同じものをアーカイブしたいと思います。

ホストに接続し、バイナリ ファイルを 1 行ずつ送信し、各行の間に数秒の遅延を設定したいのですが、同じ接続である必要があります。送信したい文字列はほとんどがテキストベースですが、行に印刷できない文字がいくつかあります。

これは、送信したい文字列/行の例です (ファイルごとに数千行):

<null>e<null><null>00326513,6598,no,8,,2z<null>

<null>値は HEX 値です0x00

最初のエントリから質問を書き直しましたが、@mzetは私の質問がテキストのみだったので元の質問に答えましたが、後で文字列0x00に最初は見えなかったこれらの文字が含まれていることを発見しました。ほとんど機能すると思うので、彼の答えをベースとして使用したいと思いますが、微調整が必​​要な場合があるため、これは私のものではなく彼の貢献です。

3 行のファイルがある場合:

<null>e<null><null>00370513,6598,no,8,,2z<null>
<null>f<null><null>00891548,6598,yes,8,,3z<null>
<null>f<null><null>00129525,6598,yes,8,,2z<null>

次に、@mzetの回答を微調整<null>し、ファイル内の値を次のコマンドに置き換えて\x00設定できると考えました。-eecho

[root@srv]# mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 &
[root@srv]# cat myfile | while read line; do echo -ne $line; sleep 2; done > /tmp/fifoIn

これを行うと、サーバー側で次のように表示x00されます。

[root@srv]# nc -l 2222
x00ex00x0000370513,6598,no,8,,2zx00
x00fx0000891548,6598,yes,8,,3zx00
x00fx00x0000129525,6598,yes,8,,2zx00

バイナリ (テキスト?) ファイルを任意に送信することはできますか? また、ファイルを 1 行ずつ送信できない場合、1 つの文字列を数千回送信することは可能ですか? 同じ文字列を繰り返すことで管理できるため、一意である必要はなく、ファイル内にある必要もありません。

編集#1

スクリプトがサーバーに 1 行しか送信しないのはなぜですか (4 行が予想されます)、その後、一時停止 (?) するだけです。クライアント (またはサーバー) は接続を閉じますが、エラーは発生しません。

rm -f /tmp/fifofile
mkfifo /tmp/fifofile
cat /tmp/fifofile | nc 192.168.20.6 5000 &
sleep 1

i="0"

while [ $i -lt 4 ]
do
  echo "$i"
  echo -ne "\x00e\x00\x00001212dsfdsfdsfsdfsdfsdfdsf\x00" | tee /tmp/fifofile
  sleep 1
  i=$[$i+1]
done
4

2 に答える 2

4

次の 2 つの手順で実現できます。

1) 名前付きパイプ (fifo) を入力として nc を開始する必要があります。

mkfifo /tmp/fifoIn; cat /tmp/fifoIn | nc localhost 2222 &

2) ファイル input.txt から 2 秒の遅延で 1 行ずつデータを送信します。

cat input.txt | while read line; do echo $line; sleep 2; done > /tmp/fifoIn

この「サーバー」でテストしました(openbsd netcat構文を使用しています):

nc -l localhost 2222
于 2013-10-09T11:57:34.153 に答える
3

NCat はコマンドを実行できるため、Netcat の代わりにNCatを使用できることに気付きました。

ポート上のソケット サーバーへの NCat との接続を開始し5000、スクリプトを実行します./sendlines.sh

ncat --exec "./sendlines.sh" 192.168.1.10 5000

./sendlines.sh各行間で 2 秒の遅延で 4 行を送信します。

#!/bin/bash
#
# sendlines.sh, v1.00, initial release
#
i="0"
while [ $i -lt 4 ]
do
  echo -ne "\x00e\x00\x0000370513,6598,no,8,,2z\x00"
  sleep 2
  i=$[$i+1]
done

バイナリ ファイルを 1 行ずつ送信する方法はわかりませんが、同じ文字列を何度も送信することで管理できるため、これは厳密には必要ありません。

バイナリ ファイルを 1 行ずつ送信する方法を知っていれば、それが私にとって最良の解決策になるので、それは素晴らしいことです。

于 2013-10-10T18:41:56.027 に答える