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
ケースは出力されません。
grep出力ケースを防ぐ方法は何ですかTRUE
?
これら2つの別々の条件を1つの条件に組み合わせるにはどうすればよいですかOR
?
しかし、私のIPTableは以前のバージョンなので、-C
パラメータは使用できません。
ベストアンサー1
基本的な作業は、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