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
引数を使用できません。
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