我正在尝试运行服务器列表并运行下一个命令:
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