如何在 sed 和 ssh 中使用引號?

如何在 sed 和 ssh 中使用引號?

我無法讓它在 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/

相關內容