我正在尝试编写一个简单的脚本,将iptables规则从文件加载到iptables:
#!/bin/bash
set -euxo pipefail
test_file="test.conf"
while read line; do
echo $line
echo "-----"
iptables $line
done < $test_file
test.conf里面有一些规则:
-A INPUT -p tcp -m tcp --dport 123 -m comment --comment "test 1" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 112 -m comment --comment "test 2" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1231 -m comment --comment "test 3" -j ACCEPT
但是当我运行脚本时,它会返回错误:
+ test_file=rules.conf
+ read line
+ echo -A INPUT -p tcp -m tcp --dport 123 -m comment --comment '"test' '1"'
-j ACCEPT
-A INPUT -p tcp -m tcp --dport 123 -m comment --comment "test 1" -j ACCEPT
+ echo -----
-----
+ iptables -A INPUT -p tcp -m tcp --dport 123 -m comment --comment '"test'
'1"' -j ACCEPT
Bad argument `1"'
看起来每当文件运行时,如果字符串中有空格,它将有一个单独的引号来环绕空格。
有没有办法摆脱这种行为?
答案 0 :(得分:1)
最后一行是主要问题。 shell在变量扩展期间不解释引号。如果您将其更改为
eval iptables $line
你应该得到(大致)正确的结果。
您的阅读声明也可能存在问题,因为您没有先将IFS设置为换行符。这可能导致多个空格被折叠以及其他可能不合需要的行为。 我将从
开始IFS="
"
或类似。