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.


É 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

ó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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.