#!/usr/bin/bash
TARGETS=(
"81.176.235.2"
"81.176.70.2"
"78.41.109.7"
)
myIPs=(
"185.164.100.1"
"185.164.100.2"
"185.164.100.3"
"185.164.100.4"
"185.164.100.5"
)
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
TARGETS
このコードは各IPに対してechoコマンドで始まり、並列に実行したいと思います。また、スクリプトは同時に複数のアドレスにコマンドをエコーすることを意図していないmyIPs
のでwait
、これを内部ループに導入しました。 .NETの各ターゲットに対してペアecho
(ポートごとに1つ、それぞれ1つ)を並列に実行したいと思います80
。つまり、私はこれをしたいのですが(残念ながら動作しません)。443
TARGETS
for t in "${TARGETS[@]}"
do &
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
done
wait
ただし、負荷平均が大きくなりすぎるため、次のことは望ましくありません。
for t in "${TARGETS[@]}"
do
for a in "${myIPs[@]}"
do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
done
done
wait
私の目標をどのように達成できますか?
PS これは、より複雑なスクリプトの一部にすぎません。関連する問題を分離したかったので、代わりにecho
ネットワークコマンドの1つを使用しました。
答え1
ご質問がわかりにくいと思います。並列実行とシーケンシャル実行が欲しいようです。
あなたはこれをしたいですか?
for t in "${TARGETS[@]}"; do
(
for a in "${myIPs[@]}"; do
echo "${a} ${t} -p 80" >>log 2>&1 &
echo "${a} ${t} -p 443" >>log 2>&1 &
wait
done
) &
done
各ターゲットの for ループは、バックグラウンドのサブシェルで実行されます。
答え2
私が正しく理解したら、2つのループを逆にし、done
sの間に待ち時間を置く必要があります。良い
for a in "${myIPs[@]}"
do for t in "${TARGETS[@]}"
do echo "${a} ${t} -p 80" 2>&1 &
echo "${a} ${t} -p 443" 2>&1 &
done
wait
done
の各IPに対して、myIPs
2つのポートを含むパケットを3つのポートのそれぞれに送信し、6TARGETS
つのポートが完了するのを待ちます。