Bash

IPTables 的條件檢查

  • September 21, 2015

我正在嘗試檢查 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

引用自:https://unix.stackexchange.com/questions/231027