如何从包含变量的文件中读取数据

如何从包含变量的文件中读取数据

我有一个用于初始化 iptables 的 bash 脚本。

#!/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或者评估它们?

答案1

像这样:

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

这会强制进行变量扩展。您绝对需要确保您了解这些变量中的内容;我怀疑如果有人可以将变量设置为任意值,他们就可以使用它来执行任意代码。

答案2

我不会相信这一点,除非很多内容测试,此时将其通过宏处理器而不是尝试将 shell 变量替换到其中变得更加容易。我强烈建议改用这种方式。也就是说,类似下面的方法应该有效:

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

答案3

如果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

相关内容