![如何在bash腳本中連接兩個條件?](https://rvso.com/image/89160/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E8%85%B3%E6%9C%AC%E4%B8%AD%E9%80%A3%E6%8E%A5%E5%85%A9%E5%80%8B%E6%A2%9D%E4%BB%B6%EF%BC%9F.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 鎖定釋放。