Como executar um comando remoto através do ssh se os dados incluírem aspas duplas (“”)?

4

Estou tentando executar uma lista de servidores e executar o próximo comando:

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

Eu também tentei assim:

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

Ambas as tentativas me deram uma nova linha de prompt e, ao verificar o arquivo na máquina remota, nada mudou. É possível executar tal comando?

    
por Itai Ganot 24.08.2013 / 14:18

2 respostas

3

Eu não acho que o ssh esteja desempenhando um papel nesse problema. Você deve executar o ssh em cima dos sistemas e tentar executar o comando sed diretamente para que ele funcione primeiro e depois envolvê-lo em um ssh.

Eu acho que seu padrão de correspondência está incorreto, você precisa escapar dos caracteres [] e possivelmente outras coisas também.

    
por 24.08.2013 / 14:48
2

Em sua primeira tentativa, destaquei as partes que são strings com aspas duplas no shell local. Nenhuma aspa dupla é passada para o shell remoto, quanto mais para sed.

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

Na sua segunda tentativa, este é o comando shell remoto:

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

Você obteve o shell citando corretamente, mas [6] provavelmente não é o que você pretendia: corresponde apenas a VNCSERVERARGS6=… . Se você quiser combinar os colchetes literalmente, você precisa de uma barra invertida antes do colchete de abertura.

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

No shell remoto, as barras invertidas estão em uma sequência de aspas simples e, portanto, são interpretadas literalmente. No shell local, as barras invertidas estão em uma cadeia de aspas duplas; em geral, eles devem ser duplicados, embora \[ em uma sequência de aspas duplas seja interpretada como \[ de qualquer maneira.

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

Lembre-se que o ssh invoca um comando shell no lado remoto, então você precisa de dois níveis de citação: um para o shell local e outro para o shell remoto. Geralmente, é mais fácil colocar aspas simples em torno do comando remoto e organizar o comando sem aspas simples.

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

Como alternativa, monte os arquivos remotos com sshfs e trabalhe neles sem ter que se preocupar com o fato de eles serem remotos.

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
    
por 26.08.2013 / 01:09

Tags