как использовать кавычки в 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

С использованиемИдея Джеффаиспользования here-документа для sedсамого скрипта (ну, он упоминает «here-string», но, я думаю, у вас возникнут проблемы с кавычками и там):

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', поэтому оболочка не будет пытаться расширять что-либо в своем тексте.

Я также удалил завершающий символ $в регулярном выражении, так как он не нужен ( .*в любом случае он соответствовал бы концу строки).

Чуть более короткий sedсценарий (просто избегая повторения MASQUERADE_AS):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/

Связанный контент