web-dev-qa-db-ja.com

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

私は以下の2つのルールをチェックしています:

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

これらの2つのルールはすでに存在し、条件はTRUEの場合を実行するため、端末は条件チェックでgrepの結果も不必要に出力します。 grepは、どういうわけかFALSEの場合は出力されません。

TRUEの場合にgrepが出力されないようにするにはどうすればよいですか?

そして、これらの別々の2つのif条件を1つのOR条件に組み合わせるにはどうすればよいですか?

ところで、私のIPTablesは古いバージョンであり、-C引数を使用できません。

1
NecNecco

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
1
terdon