¿Cómo unir dos condiciones en un script bash?

¿Cómo unir dos condiciones en un script bash?

Nota: Actualización 28 de junio

Tengo un script.sh de iptables (interpretado por bash) con las reglas:

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

Donde macs.txt contiene direcciones macs e ips.txt contiene direcciones ips o rangos separados por "-"

Error: otra aplicación actualmente mantiene el bloqueo de xtables. ¿Quizás quieras utilizar la opción -w?

(esto es generado por la función "run_ips")

¿Cómo puedo unificar ambas partes?

Respuesta1

No veo la necesidad de una función aquí. Si necesita una función, sería mejor pasar la variable como parámetro, en lugar de intentar usarla como una variable global. Sin embargo, parece bastante sencillo simplemente anidar los bucles:

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

En cuanto al mensaje de error, parece que se está ejecutando un proceso al mismo tiempo que se procesan estas reglas. Quizás deberías simplemente agregar -wlíneas a tus iptables, como sugiere el error. Esta opción debería hacer que iptables espere a que se libere el bloqueo de xtables.

información relacionada