Como juntar duas condições no script bash?

Como juntar duas condições no script bash?

Nota: atualização em 28 de junho

Eu tenho um script.sh iptables (interpretado pelo bash) com as regras:

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

Onde macs.txt contém endereços macs e ips.txt contém endereços ips ou intervalos separados por "-"

Erro: Outro aplicativo está mantendo o bloqueio do xtables. Talvez você queira usar a opção -w?

(isso é gerado pela função "run_ips")

Como posso unificar as duas partes?

Responder1

Não vejo necessidade de uma função aqui. Se você precisar de uma função, talvez seja melhor passar a variável como parâmetro, em vez de tentar usá-la como variável global. No entanto, parece bastante simples apenas aninhar os loops:

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

Quanto à mensagem de erro, parece que você tem um processo sendo executado ao mesmo tempo que essas regras estão sendo processadas. Talvez você deva apenas adicionar -wlinhas ao seu iptables, como o erro sugere. Esta opção deve fazer com que o iptables aguarde a liberação do bloqueio do xtables.

informação relacionada