O método 2 não funciona - produz uma invocação inválida de iptables
. O que quer que você tenha pensado que possa fazer, ele adiciona apenas uma regra iptables e você não pode corresponder a um conjunto arbitrário de interfaces em uma única regra. O método 1 é o caminho normal e praticamente o único caminho.
Não que a eficiência de definir regras do iptables seja uma preocupação. Você teria que trabalhar muito para fazer algo visivelmente não ideal. As preocupações aqui são acertar as regras, possivelmente a eficiência das próprias regras, e manter o script legível para que seja fácil de manter.
A gravação de $Ext_INTF
- uma substituição de variável fora de aspas duplas - divide o valor da variável em partes separadas por espaços em branco e, em seguida, expande cada parte como um nome de arquivo correspondente a um padrão curinga. Aqui a variável não contém nenhum caractere curinga ( \[*?
). Assim, for i in $Ext_INTF; …
faz um loop sobre as palavras no valor da variável. Em geral, você só deve usar substituições de variáveis dentro de aspas duplas , porque $Ext_INTF
significa “o valor de Ext_INTF
” somente dentro de aspas duplas, mas aqui você deseja que a divisão ocorra, e as partes não contêm nenhum caractere curinga de shell. / p>
Ext_INTF="eth0 usb0 tun0 tun1"
for i in $Ext_INTF; do
iptables -A FORWARD -i "$i" -j DROP
done
No bash e no ksh, mas não no sh simples, você pode usar uma matriz em vez de uma variável de string. (E em zsh você deve usar uma matriz ou solicitar explicitamente a divisão com $=Ext_INTF
.) Você precisa digitar mais alguns caracteres, mas isso torna a intenção mais clara e permite que os elementos contenham espaços em branco e curingas, se necessário.
Ext_INTF=(eth0 usb0 tun0 tun1)
for i in "${Ext_INTF[@]}"; do
iptables -A FORWARD -i "$i" -j DROP
done