Cita o exercício - como fazer o ssh dentro do ssh enquanto executa o sql dentro do segundo ssh? [duplicado]

0

Eu quero rodar o sql sobre o ssh do php. Abaixo comando executa bem

ssh server1 "sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \"select * from edumate_settings\"'"

Agora eu preciso fazer o ssh de server1 para server2 e então executar "sudo -u db2inst1 ...." lá.

Existe alguma maneira fácil de lidar com cotações se eu adicionar servidor adicional a este cenário? Então vai começar como

ssh server1 "ssh server2 "the rest is as above"

Observe que preciso executar o código acima no php.

    
por Radek 07.11.2012 / 06:05

1 resposta

2

Você deseja passar de command_with_arguments para %código%. Você obtém command "escaped_command_with_arguments" verificando escaped_command_with_arguments da esquerda para a direita e substituindo cada command_with arguments por \ e cada \ por " .

como alternativa, você coloca \" em um editor e

  1. substitua todos os command_with_arguments por \
  2. substitua cada \ por "

nesta ordem. Então, passo a passo, você pode gerar a seguinte seqüência de expressões (eu usei o bloco de notas do Windows para criar a expressão)

select *
db2 "select *"
sudo "db2 \"select *\""
ssh "sudo \"db2 \\"select *\\"\""
ssh "ssh \"sudo \\"db2 \\\\"select *\\\\"\\"\""
ssh "ssh \"ssh \\"sudo \\\\"db2 \\\\\\\\"select *\\\\\\\\"\\\\"\\"\""
ssh "ssh \"ssh \\"ssh \\\\"sudo \\\\\\\\"db2 \\\\\\\\\\\\\\\\"select *\\\\\\\\\\\\\\\\"\\\\\\\\"\\\\"\\"\""

Se você contar os números de \" antes de cada \ na última expressão, você obtém o seguinte sequência:

0 1 3 7 15 31 31 15 7 3 1 0

ou

1-1 2-1 4-1 8-1 16-1 32-1 32-1 16-1 8-1 4-1 2-1 1-1

Portanto, é possível construir uma expressão aninhada em uma única etapa sem iteração, mas você deve cuidar de como as expressões são aninhadas.

Além disso, esses métodos podem ser estendidos para situações em que há outros caracteres de escape além de " e " .

Portanto, coloque seu comando em um editor, substitua \ por server1 , substitua server2 por \ e \ por " conforme descrito acima e adicione \" no início e ssh server1 " no final e você terá

ssh server1 "ssh server2 \"sudo -u db2inst1 sh -c '/opt/ibm/db2/V9.7/bin/db2 connect to RATIONAL; /opt/ibm/db2/V9.7/bin/db2 set schema Edumate; /opt/ibm/db2/V9.7/bin/db2 \\"select * from edumate_settings\\"'\""
    
por 07.11.2012 / 08:43