Como ler dados do arquivo contendo variáveis

2

Eu tenho um script bash para inicializar o iptables.

#!/bin/sh

EXTIF="eth0"
INTIF="eth1"

INTIP="192.168.0.1/32"
EXTIP=$(/sbin/ip addr show dev "$EXTIF" | perl -lne 'if(/inet (\S+)/){print$1;last}');

UNIVERSE="0.0.0.0/0"
INTNET="192.168.0.1/24"

/sbin/iptables-restore -v < iptables.rules

Eu tenho o arquivo iptables.rules contendo algo assim:

-A OUTPUT -o $EXTIF -s $UNIVERSE -d $INTNET -j REJECT

Como posso passar essas variáveis do script bash para iptables.rules ou avaliá-las?

    
por Michael 14.03.2011 / 02:48

3 respostas

3

Algo parecido com isto:

while read line; do eval "echo ${line}"; done < iptables.rules | /sbin/iptables-restore -v

ou mais bem formatado:

while read line
  do eval "echo ${line}"
done < iptables.rules | /sbin/iptables-restore -v

Isso força o material de expansão da variável. Você definitivamente precisa ter certeza de que entende o que há nessas variáveis; Eu suspeito que, se alguém pudesse definir uma variável com um valor arbitrário, eles poderiam usá-la para executar código arbitrário.

    
por 14.03.2011 / 03:17
1

Eu não gostaria de confiar na execução geral sem um lote de testes de conteúdo, quando é mais fácil alimentá-lo através de um processador de macro em vez de tentar substituir variáveis de shell nele. Eu strongmente recomendo seguir esse caminho. Dito isso, algo assim deveria funcionar:

f="$(mktemp)" || exit 1
{echo '/sbin/iptables-restore <<__EOF'; cat iptables.rules; echo '__EOF'} >"$f"
. "$f"
rm "$f"
    
por 14.03.2011 / 03:10
0

Se iptables.rules contiver:

RULES="-A OUTPUT -o $EXTIF -s $UNIVERSE -d $INTNET -j REJECT"

E seu script origina esse arquivo, então as variáveis serão avaliadas.

#!/bin/sh

EXTIF="eth0"
INTIF="eth1"

INTIP="192.168.0.1/32"
EXTIP=$(/sbin/ip addr show dev "$EXTIF" | perl -lne 'if(/inet (\S+)/){print$1;last}');

UNIVERSE="0.0.0.0/0"
INTNET="192.168.0.1/24"
. iptables.rules

/sbin/iptables-restore -v < $RULES
    
por 14.03.2011 / 03:15

Tags