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
?
이 두 가지 별도의 조건을 하나의 조건으로 결합하려면 어떻게 해야 합니까 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