ssh indireto, conexão fechada após um único comando

1

Eu estava tentando executar vários comandos por meio de vários ssh, basicamente:

ssh -t host1 ssh -t host2 ssh -t host3 'cmd1; cmd2; cmd3 '

Eu quero executar todos os comandos no host final (host3). Mas o que acontece se eu usar a linha acima é que a conexão ao host3 e ao host2 fechou imediatamente após "cmd1;"

Como exemplo, se eu usar o nome do host para cmd1, cmd2 e cmd3, a saída será

host3
Conexão ao host3 fechada.
Conexão ao host2 fechada.
host1
host1
Conexão ao host1 fechada.

Se eu usar aspas duplas da seguinte maneira

ssh -t host1 "ssh -t host2 ssh -t host3 'cmd1; cmd2; cmd3'"
ou
ssh -t host1 ssh -t host2 "ssh -t host3 'cmd1; cmd2; cmd3'"

Eu recebo a saída:

host3
Conexão ao host3 fechada.
host2
host2
Conexão ao host2 fechada.
Conexão ao host1 fechada.

Alguém poderia me explicar isso? e como posso obter todos os comandos executados no host3

    
por Coder Fan 17.12.2014 / 23:59

1 resposta

4

Tudo o que precisamos é de muitas citações:

ssh -t host1 'ssh -t host2 "ssh -t host3 '"'"'cmd1; cmd2; cmd3'"'"'"'

O que eu fiz aqui foi apenas pegar o último comando e adicionar ' em torno dele. No entanto, algo mais precisa ser ajustado de acordo. Qualquer ' existente anteriormente dentro da peça, que eu coloquei em torno de ' precisaria ser substituído por '"'"'

O motivo que substitui ' por '"'"' funciona é isto:

  • O primeiro ' termina a string entre aspas.
  • O primeiro " inicia uma nova string citada com "
  • O meio ' não é interpretado pelo shell, ele é tratado apenas como um literal.
  • O último " termina a string citada por "
  • O último ' inicia uma nova string entre aspas.
  • As três cadeias são automaticamente concatenadas pelo shell.
por 18.12.2014 / 00:18

Tags