如何在bash脚本中连接两个条件?

如何在bash脚本中连接两个条件?

注: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”生成的)

我怎样才能统一这两个部分?

答案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 锁释放。

相关内容