![Как объединить два условия в скрипте bash?](https://rvso.com/image/89160/%D0%9A%D0%B0%D0%BA%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B2%D0%B0%20%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%20%D0%B2%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B5%20bash%3F.png)
Примечание: обновление 28 июня.
У меня есть скрипт iptables.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 содержит MAC-адреса, а ips.txt содержит IP-адреса или диапазоны, разделенные знаком «-».
Ошибка: Другое приложение в настоящее время удерживает блокировку 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.