![Bash 스크립트에서 두 조건을 결합하는 방법은 무엇입니까?](https://rvso.com/image/89160/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%91%90%20%EC%A1%B0%EA%B1%B4%EC%9D%84%20%EA%B2%B0%ED%95%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
참고: 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 잠금이 해제될 때까지 기다리게 됩니다.