如果数据包含双引号(“”),如何通过 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

在您的第一次尝试中,我突出显示了本地 shell 中双引号字符串的部分。没有双引号被传递到远程 shell,更不用说 sed 了。

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

在您的第二次尝试中,这是远程 shell 命令:

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

在远程 shell 中,反斜杠位于单引号字符串中,因此按字面意思解释。在本地 shell 中,反斜杠位于双引号字符串中;一般来说,它们应该加倍,尽管\[在双引号字符串中\[无论如何都会被解释为。

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

请记住,ssh 在远程端调用 shell 命令,因此您需要两层引用:一层用于本地 shell,一层用于远程 shell。通常,在远程命令周围加上单引号并安排不带单引号编写该命令会更容易。

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

相关内容