我的最终目标是在/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: unterminated
S' command`
我的字符串或我的sed命令出错了吗?此外,我知道其他人已经收到此错误,但他们的修复程序似乎都无法正常工作。
答案 0 :(得分:2)
在替换文本中的每个换行符之前放置一个文字反斜杠,从而告诉sed
它应该被视为同一个表达式的一部分:
orig=$'\n'; replace=$'\\\n'
sed "s@COMMIT@${morerules//$orig/$replace}@g"
(将值放在变量中可以更容易地以跨多个版本的bash的方式实现它。)