scp entre dois hosts remotos do meu (terceiro) PC

136

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, preciso copiar algo do host1 para o host2 sem fazer 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.

uwais ibrahim
fonte
Você está perguntando se pode transferir de um host remoto para um host remoto ou está perguntando como fazer isso sem precisar fornecer uma senha?
glenn jackman
Enquanto a -Pbandeira existe para especificar a porta a utilizar, em caso de transferência remota-to-remoto, ssh como nenhum comportamento definido sobre como especificar a porta per-host ...
mveroone

Respostas:

216

No passado, a maneira como scpfuncionava, 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

scpprimeiro abriria uma sshsessão no remote1 e, em seguida, executaria a scppartir daí para o remote2. Para que isso funcione, você teria que configurar as credenciais de autorização para remote2 no remote1.

A maneira moderna de fazê-lo, em vez disso, ( "moderna" porque foi implementado apenas alguns anos atrás, e talvez nem todo mundo tem um -3-capable scp) requer duas etapas. A primeira etapa necessária é usar ~/.ssh/configpara configurar todas as opções para a conexão com o remote1 e 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

Dessa maneira, torna-se possível passar todas as opções necessárias para o comando sem ambiguidades : por exemplo, se disséssemos na CLI usar a porta 2222 sem a configuração acima, não seria claro se estávamos nos referindo a remote1 ou remote2 , e da mesma forma para o arquivo que contém as chaves criptográficas. Dessa forma, a CLI permanece organizada e simples.

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

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

A -3opção instrui scpa rotear o tráfego pelo PC no qual o comando foi emitido, mesmo que seja um terceiro participante da transferência. Dessa forma, as credenciais de autorização devem residir apenas no PC emissor, na terceira parte.

MariusMatutiae
fonte
6
Para referência futura: se você copiar um arquivo entre dois hosts que compartilham um arquivo de identidade (como uma instância do EC2), não precisará do arquivo de configuração. Um argumento -i é suficiente para conectar-se aos dois hosts.
Artur Czajka
1
Também vale ressaltar, para o Google Compute Engine, há suporte para adicionar ao seu ~/.ssh/configarquivo: cloud.google.com/compute/docs/gcloud-compute, mas não acho que a AWS tenha o mesmo suporte
modulitos
1
Como você não verá a saída normalmente, uma dica é ativar o modo detalhado com -v.
holmberd
6

A última vez que tentei isso, o scp não foi capaz de 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"
user259412
fonte
minha página de manual do scp diz "Cópias entre dois hosts remotos também são permitidas".
glenn jackman
1
Obrigado, é bom ouvir isso. Para scp, você pode dar um sinalizador -P (foi escrito por algumas pessoas do BSD, isso porque seu tratamento de argumentos é muito trágico :-(), mas parece que você não pode especificar portas diferentes nos hosts remotos. Sinto muito, mas eu acho, só que desta solução alternativa esquerdas (ou há uma série de soluções mais complicadas, usando ssh, mas evitando scp - por exemplo, sftpfs, mas eles não são os mais simples). Eu estendi minha solução com as configurações da porta.
user259412
4

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

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

A solução é editar o /etc/ssh/ssh_configarquivo server1e adicionar estas linhas:

Host *.otherdomain.com
   Port  1234

Dessa maneira, a porta 1234 é usada para os dois. Também poderia ser diferente.

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

david.perez
fonte
perez existe uma maneira de obter scp através de duas portas diferentes para as duas máquinas remotas diferentes da linha comman?
Red Bottle
4

A origem e o destino podem ser especificados como um URI no formato scp: // [user @] host [: port] [/ path]

para que você possa executar:

scp -3 scp://[email protected]:22/path/to/file scp://[email protected]:6969/path/to/file
molabib
fonte