Questão scp entre dois hosts remotos do meu (terceiro) pc


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 user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

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


110


origem


Você está perguntando se pode transferir de um host remoto para um host remoto ou se está perguntando como fazer isso sem precisar fornecer uma senha? - glenn jackman
Enquanto o -P flag existe para especificar a porta a ser usada, no caso de transferência remota para remota, ssh como nenhum comportamento definido sobre como especificar a porta por host ... - mveroone
Posso perguntar por que você não aceitou minha resposta? - MariusMatutiae


Respostas:


No passado, a maneira pela qual scp trabalhado, quando chamado (ingenuamente) para copiar arquivos entre sistemas remotos, foi muito inconveniente: se você escreveu, por exemplo

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

scp primeiro abriria um ssh sessão no remote1 e, em seguida, seria executado scp de lá para o remote2. Para isso funcionar, você teria que configurar as credenciais de autorização para remote2 em remote1.

A maneira moderna de fazê-lo, em vez disso, ("moderno", porque foi implementado apenas alguns anos atrás, e talvez nem todos tenham um -3-capaz scp) requer dois passos. O primeiro passo necessário é usar ~/.ssh/config para configurar todas as opções para a conexão com 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

Desta forma, torna-se possível passar todas as opções necessárias para o comando sem ambiguidades: por exemplo, se tivéssemos dito no CLI use a porta 2222 sem a configuração acima, não ficaria claro se estávamos nos referindo a remote1 ou para remote2e, da mesma forma, para o arquivo contendo as chaves criptográficas. Desta forma, o CLI permanece limpo e simples.

Em segundo lugar, use o -3 opção, como segue:

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

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


177



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 será necessário o arquivo de configuração. Um argumento -i é suficiente para se conectar a ambos os hosts. - Artur Czajka
Também vale a pena notar que, para o Google Compute Engine, há suporte para adicionar ao seu ~/.ssh/config Arquivo: cloud.google.com/compute/docs/gcloud-compute mas eu não acho que a AWS tenha o mesmo suporte - modulitos


A última vez que tentei isso, 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"

5



my scp man page diz "Cópias entre dois hosts remotos também são permitidas". - glenn jackman
Obrigado, é bom ouvir. Para scp você pode dar um sinalizador -P (ele foi escrito por algumas pessoas do BSD, isso porque o tratamento de argumentos é muito trágico :-(), mas parece que você não pode especificar portas diferentes nos hosts remotos. mas eu acho, só esta solução alternativa (ou há muitas soluções mais complicadas, usando ssh mas evitando scp - por exemplo, sftpfs, mas elas não são as mais simples) .Eu estendi minha solução com as configurações de porta. - peterh


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

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

A solução é editar o /etc/ssh/ssh_config arquivo em server1 e adicione 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.


3