非常に簡単に見える問題がありますが、満足のいく解決策が見つかりません。次のように、IPとポートを含む単純な入力ファイルがあります。
10.155.78.0 445
172.17.11.0 3389
nc -vvv <ip> <port>
ここでforループの各行を実行したいと思います。
私が考えることができるのは、cutを使用して線を2回分割することだけです。
for x in $(cat inputfile); do nc -vvv $(echo -n $x | cut -d" " -f1) $(echo -n $x | cut -d" " -f2)
または gawk を使用してサブシェルを起動します。
for x in $(cat dingens); do cmd=$(echo $x | gawk -F" " '{ print "nc -vvv -w 2 " $1 " " $2 }'); echo -n $cmd | bash; done
しかし、両方のソリューションは非常に複雑に見えます。より良い解決策はありませんか?
答え1
while IFS=" " read -r Ip Port Junk <&3; do
nc -vvv "${Ip}" "${Port}" 3<&-
done 3< inFile
の目的は、Junk
2番目のフィールド以降のすべてのフィールド(例:説明)を受信することです。inFile
stdinの代わりにfd 3で開きます。それ以外の場合、そのnc
ループを呼び出すと次の内容も読み取られます。inFile
答え2
たとえば、次のように使用できますxargs
。
xargs -n 2 nc -vvv < inputfile
からman xargs
:
-n max-args
、--max-args=max-args
コマンドラインごとに最大 max-args 個の引数を使用します。 [...]
xargs
各コマンドの出力をリダイレクトする場合は、このオプションを使用して複数のコマンドを並列に実行することもできます。たとえば、8コアCPUがあり、8つのジョブを並列に実行したい場合:nc
-P
nc
xargs -P 8 -n 2 sh -c 'nc -vvv "$1" "$2" > "$1-$2.log"' sh < inputfile
-P max-procs
、--max-procs=max-procs
max-procs
一度に実行できるプロセスの最大数は1です。 [...]