web-dev-qa-db-ja.com

xargsを使用して、netcatと並行して同じサーバーにリクエストを送信します

単純なエコーサーバーにテキストを送信するためのワンライナーを考案しようとしていますが、複数の接続が並行しています。これは私が試していることです:

echo -e  A,B,C,D | xargs -d, -i -P 4 echo {} |  nc localhost 7000

ただし、それは完全には機能しません。サーバーは4つの接続を受信しますが、データを受信しません(「null」)。

ここで正しいxargsとnetcatコマンドは何ですか?

4
noahz

GNU Parallel :を使用したい場合、これはもう少し簡潔になります(そして私が言うには読みやすくなります)。

parallel 'echo {} | nc localhost 7000' ::: A B C D

あるいは:

parallel 'echo {} | nc localhost 7000' ::: {A..D}
2
Joshua Huber

答えは、sh -cを使用してxargsを起動することです。

echo 'A,B,C,D' | xargs -d, -i -P 4 sh -c 'echo "{}" | nc localhost 7000'

参照: https://stackoverflow.com/questions/845863/how-to-use-in-an-xargs-command

1
noahz

使用する echo -nまたは、4つではなく5つの接続を取得し、そのうちの1つにはデータがありません。サーバーでこれがチェックされていない場合は、問題が発生している可能性があります。

echo -n A,B,C,D | xargs -d, -I{} -P 4 -n 1 echo {} | nc localhost 7000

さらに、netcatをリスニングサーバーとして使用すると、正しく機能しているように見えます。

zhen@sydow:~$ nc -l 7000
A
D
B
C

また、それは平行しているように見えます、私は順不同のエコーを見ます。

0
Zhen

エコーを繰り返す必要はありません。これはxargsのデフォルトのアクションです。このワンライナーは、簡単な自己完結型のテストとして機能しますが、&の前に設定されたテストリスナーを削除できます。

nc -l 7001 & echo  A B C D | xargs -P4 -n1 | nc localhost 7001

結果:

amit@deimos:~$ nc -l 7001 & echo A B C D | xargs -P4 -n1 | nc localhost 7001
[6] 7115
D
B
C
A
[6]   Done                    nc -l 7001
0
Amit Naidu

Xargsの場合

xargs -i -P 1200 nc -zvn {} 22 < textfile-with-hosts.txt

並列の場合:

parallel -j200% -n1 -a textfile-with-hosts.txt nc -vz {} ::: 22
0
wuseman