scp entre dois servidores que não estão na mesma rede

13

Existem dois servidores que eu posso acessar com 2 conexões VPN diferentes. Eu consegui ter as duas VPN funcionando ao mesmo tempo na minha máquina (algumas regras de roteamento).

Quero fazer um scp <remote1>:some/file <remote2>:destination/folderno meu terminal de laptop. Mas quando eu tento isso, o scpcomando invocado no remote1 não consegue encontrar o remote2 porque eles não estão na mesma rede. É possível forçar o scpcomando a passar pelo meu laptop como roteador?

Se eu tentar com o Nautilus (conectar ao servidor, ambos os servidores e depois copiar e colar) ele funciona, mas eu gostaria de fazê-lo a partir de um terminal.

Danduk82
fonte
É sua máquina que entra em contato com remote1 e remote2 . Tem certeza de que o erro é que remote1 não pode acessar remote2 ?
Janeiro
Sim, o erro é ssh: Não foi possível resolver o nome do host <remote2>: Nome ou serviço não conhecido conexão perdida
Danduk82
E se eu tentar usar o endereço IP diretamente para <remote2>, a conexão falhará depois de um tempo (hangout).
Devuk82
Então eu acho que é a sua máquina que não pode se conectar ao remote2 . Talvez a conexão VPN atinja o tempo limite ou seja flakey ...
Jan
Não, funciona, até o DNS está funcionando. Eu realmente tenho a sensação de que o comando scp tenta executar a conexão entre remote1 e remote2 diretamente no remote1 .
Devuk82

Respostas:

34

As versões mais recentes do scp têm a opção -3

-3

Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts
Andy
fonte
ótimo! Exatamente o que eu precisava. Muito obrigado
Danduk82
1
Ótima descoberta, eu não sabia disso!
Janeiro
9

Se você precisar de mais flexibilidade do que scp -3, simples sshe tubos são divertidos.

Isso é equivalente a redirecionar o fluxo pela máquina local:

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

Você pode adicionar mais redirecionamentos de fluxo a qualquer momento, por exemplo, encadear várias máquinas intermediárias ou salvar uma cópia local do arquivo transferido à medida que ele é roteado.

Anko
fonte
2
Você obterá uma boa barra de progresso se a máquina de origem estiver pvinstalada e você substituir a primeira catpor ela.
liori 22/09/14
6

Expandindo a resposta da @ Anko, você pode usar tarpara vários arquivos:

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

A compactação é totalmente opcional - seus dados podem não ser muito compactáveis ​​ou grandes o suficiente para garantir a sobrecarga. Se a sua versão do tarnão suportar o -zswitch, passe por gzip -ce gzip -dcrespectivamente.

PS: Cuidado com as versões tarque não eliminam as principais barras na extração (por exemplo, escreva para nomes de caminho absolutos, se fornecidos).

Editar: -e none não é necessário com pipes, porque um pseudo-terminal não está alocado.

arielCo
fonte
1
sshpossui um -Csinalizador para ativar a compactação do fluxo. De acordo com a página man, ele usa o mesmo algoritmo como gzipse. A página do manual também esclarece quando usá-la: "A compactação é desejável em linhas de modem e outras conexões lentas, mas apenas atrasa as coisas em redes rápidas".
Anko
4
@ Anko, o problema de usar -Caqui é que a máquina local teria que descomprimir e recomprimir os dados. Dizendo tarpara fazer a compactação significa que os dados compactados são passados ​​diretamente pelo tubo sem qualquer processamento.
Cjm 23/09/14