scp entre dois hosts remotos do meu (terceiro) pc

112

Eu tenho dois hosts remotos.
host1- > 10.3.0.1
host2- > 10.3.0.2
Ambos executam um servidor ssh.

O servidor ssh escuta na porta 22 no host1 e na porta 6969 no host2. Agora, usando minha máquina local, eu preciso copiar algo do host1 para o host2 sem efetuar login no host1 ou host2 via ssh. Algo como,

scp [email protected]:/path/to/file [email protected]/path/to/file

Como posso fazer isso, observe que os dois hosts usam portas diferentes para o ssh.

    
por uwais ibrahim 10.12.2013 / 14:49

3 respostas

185

No passado, a maneira em que scp funcionava, quando chamada ( ingenuamente ) para copiar arquivos entre sistemas remotos, era muito inconveniente: se você escrevesse, por exemplo

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scp primeiro abriria uma sessão ssh no controle remoto1 e, em seguida, executaria scp de lá para o remoto2. Para que isso funcione, você teria que configurar as credenciais de autorização para remote2 no remote1.

A maneira moderna de fazer isso, em vez disso ("moderna" porque foi implementada há apenas alguns anos, e talvez nem todos tenham -3 -capable scp ) requer duas etapas. A primeira etapa necessária é usar ~/.ssh/config para configurar todas as opções para a conexão com o remote1 e o remote2, da seguinte maneira:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

Desta forma, torna-se possível passar todas as opções necessárias para o comando sem ambigüidades : por exemplo, se dissemos no CLI usar a porta 2222 sem a configuração acima , não ficaria claro se estávamos nos referindo a remote1 ou remote2 , e também no arquivo contendo as chaves criptográficas. Desta forma, o CLI permanece limpo e simples.

Em segundo lugar, use a opção -3 , da seguinte forma:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

A opção -3 instrui scp a rotear o tráfego através do PC no qual o comando é emitido, mesmo que seja um terceiro da transferência. Desta forma, as credenciais de autorização devem residir apenas no PC emissor, o terceiro.

    
por 10.12.2013 / 19:32
5

Da última vez que tentei isso, o scp não conseguiu fazer isso. Sua linha de comando parece bem. Esta solução alternativa funcionará:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"
    
por 10.12.2013 / 15:17
4

No meu caso, eu estava fazendo uma cópia remota para remota, sem o argumento -3 . A porta dada com o parâmetro '-P' funciona com o primeiro servidor, mas a porta 22 é usada com o segundo.

ssh -P 1234 [email protected] [email protected]

A solução é editar o arquivo /etc/ssh/ssh_config em server1 e adicionar estas linhas:

Host *.otherdomain.com
   Port  1234

Desta forma, a porta 1234 é usada para ambos. Pode ser diferente também.

Esta solução tem melhor rendimento do que as soluções anteriores, porque a comunitação é direta.

    
por 26.01.2016 / 15:18