Wie verbindet man zwei Bedingungen in einem Bash-Skript?

Wie verbindet man zwei Bedingungen in einem Bash-Skript?

Hinweis: Update 28. Juni

Ich habe ein iptables script.sh (interpretiert von bash) mit den Regeln:

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

Wobei macs.txt Mac-Adressen und ips.txt IP-Adressen oder Bereiche enthält, getrennt durch "-"

Fehler: Eine andere App hält derzeit die Xtables-Sperre. Vielleicht möchten Sie die Option -w verwenden?

(dies wird von der Funktion „run_ips“ generiert)

Wie kann ich beide Teile vereinen?

Antwort1

Ich sehe hier keine Notwendigkeit für eine Funktion. Wenn Sie eine Funktion benötigen, ist es möglicherweise am besten, die Variable als Parameter zu übergeben, anstatt zu versuchen, sie als globale Variable zu verwenden. Es scheint jedoch ziemlich einfach zu sein, die Schleifen einfach zu verschachteln:

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

Was die Fehlermeldung betrifft, scheint es, als ob Sie einen Prozess laufen lassen, während diese Regeln gleichzeitig verarbeitet werden. Vielleicht sollten Sie einfach -wIhre iptables-Zeilen ergänzen, wie der Fehler vorschlägt. Diese Option sollte bewirken, dass iptables wartet, bis die xtables-Sperre freigegeben wird.

verwandte Informationen