我无法让它在 bash/rhel 7 中工作:
ssh host "sed -i -e \"s/dnl MASQUERADE_AS.*\$/MASQUERADE_AS(\`domain.com\')dnl/\" /etc/mail/sendmail.mc"
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
我本质上想要这个 sed ,它可以在常规命令行上运行,但会在 ssh 中中断:
sed -i -e "s/dnl MASQUERADE_AS.*$/MASQUERADE_AS(\`domain.com\')dnl/" /etc/mail/sendmail.mc
有人有主意吗?非常感激。
答案1
使用杰夫的想法对脚本本身使用此处文档sed
(好吧,他提到了“此处字符串”,但我认为您在引用那里也会遇到问题):
ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END
如果sed
远程主机上的 可以sed
使用 从标准输入读取脚本-f -
,那么这可能会起作用(否则,例如在某些 BSD 系统上,尝试-f /dev/stdin
)。
该命令调用sed
远程主机并sed
在标准输入上传递编辑脚本。sed
由于 中的引号,该脚本是单引号的'SED_END'
,因此 shell 不会尝试扩展其文本中的内容。
我还删除了正则表达式中的尾随,$
因为不需要它(.*
无论如何都会匹配到行尾)。
一个稍微短一点的sed
脚本(只是避免提及MASQUERADE_AS
两次):
s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/