我有一个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
我如何将这些variables从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
这迫使可变扩展的东西。 你一定要确定你明白这些variables是什么; 我怀疑如果有人可以设置一个variables为任意值,他们可以使用它来执行任意代码。
我不希望在没有大量内容testing的情况下相信这种通用执行方式,在这种情况下,通过macros处理器进行提交变得更加容易,而不是试图将shellvariablesreplace为它。 我强烈build议采取这种方式。 这就是说,这样的事情应该工作:
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"
而你的脚本文件来源,然后variables将被评估。
#!/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