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 잠금이 해제될 때까지 기다리게 됩니다.

관련 정보