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

13

Existem dois servidores que eu posso acessar com duas conexões VPN diferentes. Eu consegui ter ambos os VPN trabalhando ao mesmo tempo na minha máquina (um pouco de regras de roteamento).

Eu quero fazer um scp <remote1>:some/file <remote2>:destination/folder do meu terminal de laptop. Mas quando eu tento isso, o comando scp que é chamado em remote1 não pode encontrar remote2 porque eles não estão na mesma rede. É possível forçar o comando scp a passar pelo meu laptop como um roteador?

Se eu tentar com o Nautilus (conecte-se ao servidor, ambos os servidores, copie e cole) ele funciona, mas eu gostaria de fazê-lo de um terminal.

    
por Danduk82 22.09.2014 / 11:42

3 respostas

34

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
    
por 22.09.2014 / 11:54
9

Se você precisar de mais flexibilidade do que scp -3 ,% plainssh e pipes 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 cadeia de várias máquinas intermediárias, ou salvar uma cópia local do arquivo transferido como está sendo encaminhado.

    
por 22.09.2014 / 17:48
6

Expandindo a resposta de @ Anko, você pode usar tar para 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 de tar não suportar a opção -z , direcione os gzip -c e gzip -dc , respectivamente.

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

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

    
por 22.09.2014 / 19:14