Como juntar duas condições no script bash?

0

Nota: atualização em 28 de junho

Eu tenho um script iptables.sh (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 "-"

Error: Another app is currently holding the xtables lock. Perhaps you want to use the -w option?

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

Como posso unificar as duas partes?

    
por ajcg 22.06.2016 / 22:52

1 resposta

0

Não vejo necessidade de uma função aqui. Se você precisar de uma função, talvez seja melhor passar a variável como um parâmetro, em vez de tentar usá-la como uma variável global. No entanto, parece bastante simples simplesmente 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 em que essas regras estão sendo processadas. Talvez você deva apenas adicionar -w às suas linhas do iptables, como o erro sugere. Esta opção deve fazer com que o iptables aguarde o desbloqueio do xtables lock.

    
por 29.06.2016 / 16:36