Bashスクリプトで2つの条件をリンクする方法は?

Bashスクリプトで2つの条件をリンクする方法は?

注: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にmacsアドレスが含まれている場合、ips.txtには「-」で区切られたipsアドレスまたは範囲が含まれます。

エラー:他のアプリケーションは現在xtablesロックを保持しています。 -wオプションを使用したいですか?

(これは "run_ips"関数によって生成されます)

この2つの部分をどのように統合できますか?

ベストアンサー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ロックが解除されるのを待ちます。

おすすめ記事