![bash スクリプトで 2 つの条件を結合するにはどうすればよいですか?](https://rvso.com/image/89160/bash%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%202%20%E3%81%A4%E3%81%AE%E6%9D%A1%E4%BB%B6%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
注: 6月28日更新
次のルールを含む iptables script.sh (bash によって解釈される) があります:
function run_ips(){
for ip in $(sed '/#.*/d' ips.txt); do
if echo $ip | grep -q "-" >/dev/null; then
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -m iprange --dst-range "$ip" -j ACCEPT
else
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -d $ip -j ACCEPT
fi
done
}
for mac in $(awk -F";" '{print $2}' macs.txt); do
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $mac -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A INPUT -i eth1 -m mac --mac-source $mac -p tcp --dport 8080 -j ACCEPT
run_ips
done
macs.txt には MAC アドレスが含まれ、ips.txt には IP アドレスまたは範囲が含まれ、"-" で区切られます。
エラー: 現在、別のアプリが xtables ロックを保持しています。-w オプションを使用することをお勧めします。
(これは関数「run_ips」によって生成されます)
両方の部分を統合するにはどうすればよいでしょうか?
答え1
ここでは関数の必要性は見当たりません。関数が必要な場合は、変数をグローバル変数として使用しようとするのではなく、パラメータとして渡すのが最善かもしれません。ただし、ループをネストするだけでかなり簡単に思えます。
for mac in $(awk -F";" '{print $2}' macs.txt); do
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $mac -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A INPUT -i eth1 -m mac --mac-source $mac -p tcp --dport 8080 -j ACCEPT
for ip in $(sed '/#.*/d' ips.txt); do
if echo $ip | grep -q "-" >/dev/null; then
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -m iprange --dst-range "$ip" -j ACCEPT
else
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -d $ip -j ACCEPT
fi
done
done
エラー メッセージに関しては、これらのルールが処理されているのと同時にプロセスが実行されているようです。-w
エラーが示唆しているように、iptables 行に追加するだけでよいかもしれません。このオプションにより、iptables は xtables ロックが解放されるまで待機するはずです。