![sed と ssh で引用符を使用するにはどうすればいいですか?](https://rvso.com/image/164696/sed%20%E3%81%A8%20ssh%20%E3%81%A7%E5%BC%95%E7%94%A8%E7%AC%A6%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%81%84%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
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
基本的に、通常のコマンド ラインでは動作するが、ssh 内では機能しない次の sed が必要です。
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'
、シェルはテキスト内のものを展開しようとしません。
また、正規表現の末尾は$
必要ないので削除しました (.*
いずれにしても行末に一致するため)。
ほんの少しだけ短いsed
スクリプトです(重複した言及を避けるだけですMASQUERADE_AS
):
s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/