【发布时间】:2018-02-01 07:12:30
【问题描述】:
我的最终目标是在 /etc/ufw/before.rules 中的 COMMIT 行上方获取一堆文本。我正在尝试用以下内容替换 COMMIT:
TEXT I WANT\nCOMMIT
我认为这是一个简单的 sed 命令:echo COMMIT | sed "s@COMMIT@${morerules}@g"
我已将变量morerules 设置为这样的字符串:
morerules="""
### Start HTTP ###
# Enter rule
-A ufw-before-input -p tcp --dport 80 -j ufw-http
-A ufw-before-input -p tcp --dport 443 -j ufw-http
# Limit connections per Class C
-A ufw-http -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 24 -j ufw-http-logdrop
# Limit connections per IP
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --set
-A ufw-http -m state --state NEW -m recent --name conn_per_ip --update --seconds 10 --hitcount 20 -j ufw-http-logdrop
# Limit packets per IP
-A ufw-http -m recent --name pack_per_ip --set
-A ufw-http -m recent --name pack_per_ip --update --seconds 1 --hitcount 20 -j ufw-http-logdrop
# Finally accept
-A ufw-http -j ACCEPT
# Log
-A ufw-http-logdrop -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix \"[UFW HTTP DROP]\"
-A ufw-http-logdrop -j DROP
### End HTTP ##
"""
如您所见,我在引号中添加了反斜杠。设置变量成功。当我从上面echo COMMIT | sed "s@COMMIT@${morerules}@g" 运行命令时,输出如下:
sed: -e expression #1, char 9: unterminateds' 命令`
错误是我的字符串还是我的 sed 命令?另外,我知道其他人也遇到了这个错误,但他们的修复似乎都不起作用。
【问题讨论】:
-
您可能会发现insert multiple lines into a file after specified pattern using shell script 适用。实际上,
sed -e参数中的每一行都作为单独的表达式传递,因此您会收到错误,因为第一行没有关闭@。 -
你也可以找到BashFAQ #21适用;
sed并不总是适合这项工作的工具。