我正在尝试检查 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
参数。
答案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