2011-03-13 52 views
2

以下是iptable保存文件,我通過設置一些變量(如下所示)來修改該文件。與上面的保存文件使用帶變量的外部文件

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

我也有被定義這個變量,應該叫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 <the content of iptables save file> 

在bash腳本,不知怎麼插入頂部到這個腳本的文本文件,這樣的變量將被初始化。有沒有辦法做到這一點?

UPDATE:甚至試過這種

/sbin/iptables-restore -v <<-EOF; 

$(</etc/test.txt) 

EOF 
+0

轉貼[這裏](http://serverfault.com/questions/247013/how-to-read-data-from-file-containing-variables)。 – 2011-03-14 04:19:04

回答

2

事情是這樣的:

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

或更好格式化:

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

eval的字符串強制變量擴展的東西。

2

使用。 (點)字符,包括一個shell腳本到另一個:

 
    #!/bin/sh 
    . /path/to/another/script 
+0

你的例子的第一行很混亂。 – 2011-03-13 13:54:34

+1

這可能應該是'#!/ bin/sh' – user123444555621 2011-03-13 14:06:45

+0

腳本中的文本不是另一個腳本,而只是包含$變量的數據。 – Pablo 2011-03-13 15:06:52

1

在你的shell腳本:

. /path/to/variable-definitions 
/sbin/iptables-restore < $(eval echo "$(</path/to/template-file)") 

或可能

/sbin/iptables-restore < <(eval echo "$(</path/to/template-file)") 
+0

does not真的工作,它仍然在等待標準輸入的用戶輸入 – Pablo 2011-03-13 14:46:53

+0

@Michael:你可以編輯你的問題,更具體地顯示你想要做什麼,以及實現它的步驟是什麼?你的問題似乎有些缺失。 – 2011-03-13 15:03:59

+0

是的,在一秒鐘內。 – Pablo 2011-03-13 15:07:43