Bash
IPTables 的條件檢查
我正在嘗試檢查 IPTables 中的特定規則是否存在。
#!/bin/bash if iptables -L -n | grep -- "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880"; then echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880 exists" else echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880 does not exist" fi if iptables -L -n | grep -- "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80"; then echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 exists" else echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 does not exist" fi
我正在檢查以下兩條規則:
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
因為這兩個規則已經存在並且條件執行
TRUE
,終端也grep
不必要地輸出了條件檢查的結果。grep
不知何故不輸出FALSE
大小寫。如何防止 grep 輸出
TRUE
大小寫?以及如何將這兩個單獨的 if 條件組合成一個
OR
條件?順便說一句,我的 IPTables 是舊版本,不能使用
-C
參數。
的預設操作
grep
是列印匹配的行。要抑制這種情況,您可以使用grep -q
:#!/bin/bash if iptables -L -n | grep -q -- "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880"; then echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880 exists" else echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880 does not exist" fi if iptables -L -n | grep -q -- "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80"; then echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 exists" else echo "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 does not exist" fi
您還可以將腳本簡化為:
#!/bin/bash rules=( "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880" "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80") for rule in "${rules[@]}" do iptables -L -n | grep -q "$rule" && echo "$rule exists" || echo "$rule does not exist" done
或者,如果您想執行多個操作,請使用 if/else,如下所示:
#!/bin/bash rules=( "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8880" "ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80") for rule in "${rules[@]}" do if iptables -L -n | grep -q "$rule" then echo "$rule exists" else echo "$rule does not exist" fi done