データに二重引用符("")が含まれている場合、SSHを介してリモートsedコマンドを実行する方法は?

データに二重引用符("")が含まれている場合、SSHを介してリモートsedコマンドを実行する方法は?

サーバーのリストを実行し、次のコマンドを実行しようとします。

itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"

私もこれを試しました:

itaig@itaig-lt:~$ ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]=\"-geometry 1920x1080\"/VNCSERVERARGS[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"
itaig@itaig-lt:~$

どちらの試みも新しいプロンプトラインを提供し、リモートシステムでファイルを確認したときに何も変更されませんでした。このようなコマンドを実行できますか?

答え1

私はsshがこの問題とは関係がないと思います。システムにsshで接続し、sedコマンドを直接実行して最初に動作させてから、sshでラップする必要があります。

あなたの一致パターンが正しくないようです。文字をエスケープする必要があり、[]おそらく他のものが必要になるかもしれません。

答え2

最初の試みでは、ローカルシェルで二重引用符で囲まれた文字列部分を強調表示しました。 sedはもちろん、二重引用符もリモートシェルに渡されません。

ssh root@$srvname "sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers"
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^                     ^^^^^^^^^^^^^^^^^^                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2番目の試みでは、リモートシェルコマンドは次のようになります。

sed -i 's/VNCSERVERARGS[6]="-geometry 1920x1080"/VNCSERVERARGS[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers

あなたのシェル参照は正確ですが、[6]おそらくあなたが望むものではありません。VNCSERVERARGS6=…ただ一致するだけです。括弧を文字通り一致させるには、左括弧の前にバックスラッシュを追加する必要があります。

sed -i 's/VNCSERVERARGS\[6]="-geometry 1920x1080"/VNCSERVERARGS\[6]="-geometry 1152x864"/g' /etc/sysconfig/vncservers

リモートシェルでは、バックスラッシュは一重引用符で囲まれた文字列内にあるため、文字通り解釈されます。デフォルトのシェルでは、バックスラッシュは二重引用符で囲まれた文字列にあります。一般的に言えば、\[二重引用符で囲まれた文字列は\[とにかく解釈されますが、2倍にする必要があります。

ssh root@$srvname "sed -i 's/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g' /etc/sysconfig/vncservers"

sshはリモート側でシェルコマンドを呼び出すので、2つのレベルの参照が必要です。 1つはローカルシェル用、もう1つはリモートシェル用です。リモートコマンドの周りに一重引用符を入れ、一重引用符なしでコマンドを作成する方が簡単です。

ssh root@$srvname 'sed -i "s/VNCSERVERARGS\\[6]=\"-geometry 1920x1080\"/VNCSERVERARGS\\[6]=\"-geometry 1152x864\"/g" /etc/sysconfig/vncservers'

または、次のコマンドを使用してリモートファイルをマウントします。sshfsこれにより、リモートにいることを心配することなく処理できます。

mkdir ~/net/srvname
sshfs root@srvname ~/net/srvname
sed -i 's/VNCSERVERARGS\[6]="-geometry 1920x1080"/VNCSERVERARGS\[6]="-geometry 1152x864"/g' ~/net/srvname/etc/sysconfig/vncservers

関連情報