Verificação condicional para IPTables

1

Estou tentando verificar se regras específicas no IPTables existem ou não.

#!/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

Estou verificando abaixo duas regras:

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

Como essas duas regras já existem e as condições executam o caso TRUE , o terminal também gera o resultado da grep na verificação condicional desnecessariamente. grep de alguma forma não produz saída para FALSE case.

Como posso evitar que o grep seja produzido por TRUE case?

E como posso combinar esses dois condicionais separados se forem condicionais em um único OR condicional?

BTW, meu IPTables é uma versão antiga e não pode usar o argumento -C .

    
por NecNecco 21.09.2015 / 13:24

1 resposta

1

A ação padrão de grep é imprimir a linha correspondente. Para suprimir isso, você pode usar 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

Você também pode simplificar seu script para isso:

#!/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

Ou, se você quiser ter várias ações, use um if / else da seguinte forma:

#!/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
    
por 21.09.2015 / 13:32