Назад | Перейти на главную страницу

Как читать данные из файла, содержащего переменные

У меня есть сценарий bash для инициализации 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

у меня есть iptables.rules файл, содержащий что-то вроде этого:

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

Как передать эти переменные из сценария bash в iptables.rules или оценить их?

Что-то вроде этого:

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

или более красиво отформатированный:

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

Это заставляет переменные расширения. Вы определенно должны быть уверены, что понимаете, что находится в этих переменных; Я подозреваю, что если бы кто-то мог установить произвольное значение переменной, он мог бы использовать его для выполнения произвольного кода.

Я бы не хотел доверять этому в общем исполнении без много тестов содержимого, после чего становится проще пропустить его через макропроцессор, вместо того, чтобы пытаться подставить в него переменные оболочки. я сильно рекомендую идти этим путем. Тем не менее, должно работать что-то вроде этого:

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

Если iptables.rules содержит:

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

И ваш скрипт создает этот файл, тогда переменные будут оцениваться.

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