単純なエコーサーバーにテキストを送信するためのワンライナーを考案しようとしていますが、複数の接続が並行しています。これは私が試していることです:
echo -e A,B,C,D | xargs -d, -i -P 4 echo {} | nc localhost 7000
ただし、それは完全には機能しません。サーバーは4つの接続を受信しますが、データを受信しません(「null」)。
ここで正しいxargsとnetcatコマンドは何ですか?
GNU Parallel :を使用したい場合、これはもう少し簡潔になります(そして私が言うには読みやすくなります)。
parallel 'echo {} | nc localhost 7000' ::: A B C D
あるいは:
parallel 'echo {} | nc localhost 7000' ::: {A..D}
答えは、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
使用する 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
また、それは平行しているように見えます、私は順不同のエコーを見ます。
エコーを繰り返す必要はありません。これは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
xargs -i -P 1200 nc -zvn {} 22 < textfile-with-hosts.txt
parallel -j200% -n1 -a textfile-with-hosts.txt nc -vz {} ::: 22