SSH経由でsedを実行するときにエスケープする方法

SSH経由でsedを実行するときにエスケープする方法

ファイルの行に文字列を追加するためにsedコマンドを実行しています。これは元の行です。

export JAVA_TOOL_OPTIONS="-Doption=Xyz"

次のように更新されます。

export JAVA_TOOL_OPTIONS="-Djava.net.useSystemProxies=false -Dhttp.nonProxyHosts=.abc.com|.abc1.com|localhost -Dhttps.proxyPort=443 -Doption=Xyz"

これはコマンドです:

sed -i '1 s/export JAVA_TOOL_OPTIONS="/export JAVA_TOOL_OPTIONS="-Djava.net.useSystemProxies=false -Dhttp.nonProxyHosts=.abc.com|.abc1.com|localhost -Dhttps.proxyPort=443 /1 ' startup.sh

サーバーのコマンドラインから実行すると、うまく機能します。ただし、SSHを介して完了すると、実行は失敗します。

ssh @hostname 'sed -i '1 s/export JAVA_TOOL_OPTIONS="/export JAVA_TOOL_OPTIONS="-Djava.net.useSystemProxies=false -Dhttp.nonProxyHosts=.abc.com|.abc1.com|localhost -Dhttps.proxyPort=443 /1 ' startup.sh'

私はこれが「|」に関連していると思います。私も3つの反動を試してみました。

ssh @hostname 'sed -i '1 s/export JAVA_TOOL_OPTIONS="/export JAVA_TOOL_OPTIONS="-Djava.net.useSystemProxies=false -Dhttp.nonProxyHosts=.abc.com\\\|.abc1.com\\\|localhost -Dhttps.proxyPort=443 /1 ' startup.sh'

私は|を3つのスペースに置き換えました。

ssh @hostname 'sed -i '1 s/export JAVA_TOOL_OPTIONS="/export JAVA_TOOL_OPTIONS="-Djava.net.useSystemProxies=false -Dhttp.nonProxyHosts=.abc.com\\\.abc1.com\\\localhost -Dhttps.proxyPort=443 /1 ' startup.sh'

しかし、まだ失敗しました。私が間違っていることを知っていますか?

ベストアンサー1

ssh @hostname "$(cat <<'EOT'

sed -i ... # your command, verbatim

EOT
)"

おすすめ記事