Transferir arquivos entre dois servidores SSH remotos

21

Existe uma maneira fácil de transferir arquivos entre dois servidores SSH / SFTP? A solução perfeita seria o FileZilla, mas apenas permite criar uma conexão entre local e remoto, mas não entre remoto e remoto.

Teoricamente eu poderia abrir duas janelas do Nautilus e se conectar a alguns ssh://server1/path/to/foldere ssh://server2/path/to/folderem seguida, basta puxar os arquivos de um para o outro lado. Minha experiência é que isso é muito instável. A transmissão de arquivos com uma soma de tamanho de 10 MB, ou seja, não é problema, mas a transferência de 10 GB geralmente resultava no Nautilus desligando-se e permanecendo lá na necessidade de ps -e | grep nautilus-> kill -9 <pid>. Eu também testei a mesma coisa com Nemo e Caja. Enquanto Nemo tende a ser mais estável do que os outros dois, ainda não é perfeito e também quebra de tempos em tempos. O FileZilla é extremamente estável, nunca conseguiu quebrar, mas não é muito flexível devido ao fato mencionado de que ele pode se conectar apenas a um único servidor SSH.

É claro que eu também poderia montar uma pasta sshfs, mas essa é uma solução inconveniente. Muito trabalho prévio a fazer para obter uma transferência simples em execução.

Existe algum aplicativo que possa manipular transferências entre dois servidores SSH sem interromper? Perfeito seria algo como o FileZilla, que retoma o trabalho se a conexão for interrompida.

Sócrates
fonte
Não sou uma resposta, porque este não é um site de recomendação de software, mas eu uso o Beyond Compare ( scootersoftware.com ) há anos e é ótimo para esse tipo de tarefa. Ele oferece duas janelas, as quais podem mostrar um caminho local ou um sftp: // URL, mostrarão as diferenças entre as pastas, e sua capacidade de copiar apenas as diferenças cria um excelente mecanismo de retomada se quebrar, o que acontece muito raramente em minha experiência. (Não aflito com eles, exceto sendo um cliente satisfeito).
Guntram Blohm apoia Monica em

Respostas:

36

Se você estiver em uma versão do Ubuntu que ainda é suportada, seu scpcomando fornecerá a -3opção que permite copiar arquivos de remote1 para remote2 via localhost :

me@local:~> scp -3 user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

Você também pode omitir a -3opção, mas precisará da chave pública ( id_rsa.pub) de user1@remote1no arquivo authorized_keysde user2@remote2:

me@local:~> scp user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

scpentão sob o capô faz um ssh user1@remote1primeiro e de lá scp /path/to/file1 user2@remote2:/path/to/file2. É por isso que a credencial deve ser distribuída diferente da -3solução.

Em outras palavras:

  • scp -3 remote1:file1 remote2:file2transfere o arquivo de remote1 para localhost e depois volta para remote2 . Os dados trafegam como remoto1 → localhost → remoto2 . O host local é o terceiro neste cenário, portanto -3. Para que isso funcione, você precisará das credenciais do localhost em remote1 e remote2 porque o localhost se conecta a ambos.

  • scp remote1:file1 remote2:file2copia o arquivo diretamente de remote1 para remote2 na velocidade com a qual eles estão conectados um ao outro. localhost não está envolvido aqui (além de emitir o comando). Os dados trafegam remoto1 → remoto2 . Para que isso funcione, você precisará das credenciais do localhost apenas no remote1, mas adicionalmente precisará das credenciais do remote1 no remote2 porque o localhost se conecta apenas ao remote1 e depois o remote1 se conecta ao remote2 .

Se possível, eu escolheria a segunda abordagem. Como alguns comentários já dizem: geralmente, o cabo de rede entre remote1 e remote2 é muito mais grosso que o cabo entre eles e o host local .

PerlDuck
fonte
2
Isso é lindo. ssh é o canivete suíço de software. Obrigado, eu aprendi alguma coisa.
Organic Marble
4
Observe que essa abordagem, como a nautilus descrita na pergunta, transferirá o arquivo primeiro para a máquina local e depois para o segundo servidor. Isso causará uma desaceleração significativa quando os dois servidores remotos tiverem um link mais rápido entre eles do que a máquina local. (Por exemplo, quando os servidores remotos estão em datacenters e a máquina local possui uma conexão DSL.)
Stobor
1
@ Stobor Bom ponto, obrigado. Atualizei minha resposta para esclarecer um pouco como os dados viajam com e sem o -3.
PerlDuck
1
O segundo método funcionaria com o encaminhamento de agente, sem ter nenhuma chave ou senha no remote1?
Eric Duminil
1
@EricDuminil Acho que não sei dizer. Não tenho muita experiência com o encaminhamento de agentes. Mas duvido que o remote1 deva negar o acesso quando nenhuma chave nem senha são fornecidas, não é?
PerlDuck
10

Na maioria dos casos, dois servidores ssh podem alcançar um ao outro (ou pelo menos um pode alcançar o outro) e, novamente, na maioria dos casos, a Internet da estação de trabalho é muito pior do que qualquer um dos servidores.

Nesse caso, solicitar um servidor para transferir para o outro é o caminho a seguir.

ssh server1 nohup scp somefile server2:somefile

Verifique nohup.outno servidor1 se há erros.

Se a acessibilidade do servidor for inversa, você poderá reverter qual máquina é a principal:

ssh server2 nohup scp server1:somefile somefile
Joshua
fonte
7

Talvez você possa usar um dos vários front-ends da GUI para rsync:

Existe algum aplicativo GUI para o comando rsync?

Ou talvez você possa usar o rsync diretamente da linha de comando para se conectar aos dois servidores remotos:

"Como rsync arquivos entre dois controles remotos"

Costumo fazer logon em um servidor com ssh e, a partir da linha de comando do servidor, uso o rsync para enviar ou enviar arquivos para outro servidor remoto - isso geralmente é muito mais rápido do que tentar transferir os arquivos por outro terceiro computador.

O rsync é inteligente o suficiente para fazer algum trabalho; então, se algo der errado e interromper o processo, ele poderá continuar mais tarde exatamente de onde parou.

David Cary
fonte
0

Você precisa usar o protocolo SCP. scp file you want to transfer login@address_of_second_server:/path_where_you_want_to_save

Gravemind
fonte
2
O OP deseja copiar arquivos entre dois computadores remotos, não do computador local para o computador remoto. Ele também parece estar procurando uma solução GUI.
user68186 6/02
@ user68186 minha resposta é válida.
Gravemind