Я не могу заставить это работать в 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/