Como gravar remotamente em um arquivo usando SSH multip hop

0

Perguntas como Como gravar remotamente em um arquivo usando SSH são sobre um SSH direto.

Mas estou chegando ao fim de um túnel reverso que termina no servidor intermediário. Ou seja, estou mudando de uma máquina para outra. E eu quero gravar em um arquivo na máquina distante. O seguinte falha; acaba escrevendo no servidor intermediário!

ssh -A -t  intermediateserver ssh -A -t -p 666 localhost  "echo 30 > tmp"

O fato de haver um túnel ssh reverso lá provavelmente não torna as coisas mais complicadas; portanto, em geral, estou sentado em um servidor doméstico e passando por servidor intermediário para servidor distante.

(No meu caso aqui, o servidor distante parece intermediar internamente o servidor em sua porta 666, devido a um túnel reverso preexistente).

CPBL
fonte
Se você está sshpassando de "servidor intermediário" para localhost, ainda está no "servidor intermediário". Onde você está se conectando a uma máquina distante? Você diz que o túnel termina em "servidor intermediário", então qual máquina está mais distante que o fim da linha?
Scott
Eu editei para maior clareza. Minha situação é provavelmente um pouco mais complexa do que relevante para a questão.
CPBL #

Respostas:

2

Para cada salto, você precisará de uma camada de cotação. Essencialmente, ssh server some command foo baracaba rodando $SHELLcom os argumentos -c e some command foo bar, portanto:

  1. A primeira camada de aspas é removida pelo shell local, onde você executou o comando ssh, e
  2. Cada salto subsequente invoca um shell que retira outra camada de cotação.

Isso, por sua vez, significa que operações de shell como expansão variável, redirecionamento e expansão de curingas precisam de citações extras para impedir que shells intermediários atuem neles.

Por exemplo, se eu tivesse os arquivos foo-ae foo-?no meu diretório pessoal:

$ touch foo-a foo-\?
$ echo foo-*
foo-? foo-a
$ ssh Server1 echo foo-*
foo-? foo-a foo-a # foo-* expanded locally to foo-? foo-a, foo-? expanded again remotely
$ ssh Server1 'echo foo-*'
foo-? foo-a       # foo-* expanded remotely to foo-? foo-a
$ ssh Server2 ssh Server1 'echo foo-*'
foo-? foo-a foo-a # foo-* expanded remotely to foo-? foo-a, foo-? expanded again remotely in the next hop
$ ssh Server2 "ssh Server1 'echo foo-*'"
foo-? foo-a       # foo-* expanded in the last hop

Seria mais simples se você usasse um ProxyCommandou ProxyHost. Isso estabelecerá um túnel entre os dois sistemas, em vez de criar um baklava de shells executando comandos:

~ ssh -o ProxyCommand='ssh Server2 nc %h %p' Server1 'echo foo-*'
foo-? foo-a

~ ssh -J Server2 Server1 'echo foo-*'
foo-? foo-a
muru
fonte
Eu só conheço duas opções para citar as coisas: 'e ". Posso reutilizá-las, de maneira alternada, para outras camadas? sua melhor abordagem)
CPBL
muru: Nosso código de conduta diz "seja gentil", não "seja gentil". O que a baklava tem a ver com isso? :-) ⁠
Scott
@CPBL infelizmente, não. "l1 'l2 "l3 'l4' 3" 2' 1"é visto pela primeira shell como três cordas: l1 'l2 l3, l4, 3 2' 1. Pode ser possível obter até três camadas de citações usando barras invertidas também, mas dessa maneira leva à loucura.
muru 2/11/19
@ Scott me fez lembrar de algo que eu vi no blog de Jeff Atwood um tempo atrás: Veja como 14 em blog.codinghorror.com/new-programming-jargon
Muru
Alguma chance de você fornecer o exemplo ProxyCommand usando minha situação em que o destino é uma porta no intermediário? Eu ainda estou preso interpretando estes bits enigmáticas
CPBL