Ok, finalmente descobri graças ao @Gilles que me apontou na direção certa.
O snippet iptables / mac está dentro de uma função. No meu script, eu faço iterações em um determinado conjunto de arquivos e os analiso, e invoco a função iptables (para cada arquivo).
Como acontece, estou alterando o IFS
na parte superior do script (para simplificar a análise do arquivo) e deixe que ele seja alterado para o restante do script.
Mas se eu começar salvando o antigo valor de IFS
e então configurá-lo de volta para este (valor antigo) antes de cada invocação, tudo funciona como esperado!
Portanto, este não funciona:
#!/bin/bash
function allow()
{
[variable defs]
if [ -n "$ALLOWED_MAC" ] ; then
MAC_STRING="-m mac --mac-source $ALLOWED_MAC"
fi
iptables -A INPUT -p $PROTOCOL --dport $PORT $MAC_STRING -m state --state NEW,ESTABLISHED -j ACCEPT
}
#Set the Internal Field Separator to the token used in the files.
IFS=";"
[variable defs]
#Iterate over all the port files.
for file in $FILES
do
#Read the first (and only) line from the current file and split the tokens into an array.
LINE="$(cat $file)"
set -- "$LINE"
declare -a Tokens=($*)
[parse tokens]
#Call 'allow' for each port definition.
allow $PROTOCOL $PORT $DIRECTION $ALLOWED_MAC
done
Mas isso funciona perfeitamente:
#!/bin/bash
function allow()
{
[variable defs]
if [ -n "$ALLOWED_MAC" ] ; then
MAC_STRING="-m mac --mac-source $ALLOWED_MAC"
fi
iptables -A INPUT -p $PROTOCOL --dport $PORT $MAC_STRING -m state --state NEW,ESTABLISHED -j ACCEPT
}
#Save the "original" IFS
OLD_IFS=$IFS
[variable defs]
#Iterate over all the port files.
for file in $FILES
do
#Set the Internal Field Separator to the token used in the files.
IFS=";"
#Read the first (and only) line from the current file and split the tokens into an array.
LINE="$(cat $file)"
set -- "$LINE"
declare -a Tokens=($*)
[parse tokens]
#Reset IFS before invoking the function.
IFS=$OLD_IFS
#Call 'allow' for each port definition.
allow $PROTOCOL $PORT $DIRECTION $ALLOWED_MAC
done
Eu poderia ter perdido alguma coisa durante copiar / colar aqui, mas espero que o essencial esteja lá.
Obrigado pela sua ajuda!
// Anders