Transférer des fichiers entre deux serveurs SSH distants

21

Existe-t-il un moyen simple de transférer des fichiers entre deux serveurs SSH / SFTP? La solution parfaite serait FileZilla, mais elle vous permet uniquement de créer une connexion entre local et distant, mais pas entre distant et distant.

Théoriquement , je pourrais ouvrir deux fenêtres Nautilus et se connecter à certains ssh://server1/path/to/folderet ssh://server2/path/to/folderpuis il suffit de tirer les fichiers de l' un à l'autre côté. D'après mon expérience, c'est très instable. La transmission de fichiers d'une taille de 10 Mo par exemple n'est pas un problème, mais le transfert de 10 Go, par exemple, a souvent amené Nautilus à se suspendre et à y rester ps -e | grep nautilus-> kill -9 <pid>. J'ai également testé la même chose avec Nemo et Caja. Bien que Nemo ait tendance à être plus stable que les deux autres, il n'est toujours pas parfait et se casse également de temps en temps. FileZilla est extrêmement stable, n'a jamais vraiment réussi à le casser, mais il n'est pas très flexible en raison du fait qu'il ne peut se connecter qu'à un seul serveur SSH.

Bien sûr, je pourrais également monter un dossier avec sshfs, mais c'est une sorte de solution gênante. Trop de travail préalable à effectuer pour exécuter un transfert simple.

Existe-t-il une application capable de gérer les transferts entre deux serveurs SSH sans interruption? Parfait serait quelque chose comme FileZilla, qui reprendra le travail si la connexion était interrompue.

Socrate
la source
Pas une réponse car ce n'est pas un site de recommandation de logiciels, mais j'utilise le (commercial) Beyond Compare ( scootersoftware.com ) depuis des années, et c'est tout simplement génial pour ce genre de tâche. Il offre deux fenêtres, qui peuvent toutes deux montrer un chemin local ou une URL sftp: //, montreront les différences entre les dossiers, et sa capacité à copier uniquement les différences fait un excellent mécanisme de reprise s'il se casse, ce qui arrive très rarement dans mon expérience. (Pas affilié avec eux sauf être un client satisfait).
Guntram Blohm soutient Monica le

Réponses:

36

Si vous utilisez une version Ubuntu qui est toujours prise en charge, votre scpcommande fournira le -3commutateur qui permet de copier des fichiers de remote1 vers remote2 via localhost :

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

Vous pouvez également omettre le -3commutateur, mais vous aurez alors besoin de la clé publique ( id_rsa.pub) de user1@remote1dans le fichier authorized_keysde user2@remote2:

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

scppuis sous le capot fait une ssh user1@remote1première et à partir de là scp /path/to/file1 user2@remote2:/path/to/file2. C'est pourquoi les informations d'identification doivent être distribuées différemment de la -3solution.

En d'autres termes:

  • scp -3 remote1:file1 remote2:file2transfère le fichier de remote1 vers localhost , puis de nouveau vers remote2 . Les données voyagent à distance1 → localhost → remote2 . L' hôte local est donc le 3ème parti dans ce scénario -3. Pour que cela fonctionne, vous aurez besoin des informations d'identification de localhost sur remote1 et remote2 car localhost se connecte aux deux.

  • scp remote1:file1 remote2:file2copie le fichier directement de remote1 vers remote2 à la vitesse avec laquelle ils sont connectés les uns aux autres. localhost n'est pas impliqué ici (en plus d'émettre la commande). Les données voyagent à distance1 → à distance2 . Pour que cela fonctionne, vous aurez besoin des informations d'identification de localhost uniquement sur remote1, mais vous aurez également besoin des informations d'identification de remote1 sur remote2 car localhost se connecte à remote1 uniquement, puis remote1 se connecte à remote2 .

Si possible, je choisirais la deuxième approche. Comme certains commentaires le disent déjà: généralement, le câble réseau entre remote1 et remote2 est beaucoup plus épais que le câble entre eux et localhost .

PerlDuck
la source
2
C'est tout simplement magnifique. ssh est le couteau suisse du logiciel. Merci, j'ai appris quelque chose.
Marbre organique
4
Notez que cette approche, comme l'approche nautilus décrite dans la question, transférera le fichier d'abord sur la machine locale, puis sur le deuxième serveur. Cela entraînera un ralentissement important lorsque les deux serveurs distants auront une liaison plus rapide entre eux que la machine locale. (Par exemple, lorsque les serveurs distants sont dans des centres de données et que la machine locale dispose d'une connexion DSL.)
Stobor
1
@Stobor Bon point, merci. J'ai mis à jour ma réponse pour clarifier un peu comment les données voyagent avec et sans le -3.
PerlDuck
1
La deuxième méthode fonctionnerait-elle avec le transfert d'agent, sans avoir de clé ou de mot de passe sur remote1?
Eric Duminil
1
@EricDuminil J'ai bien peur de ne pas pouvoir le dire. Je n'ai aucune expérience réelle avec le transfert d'agent. Mais j'en doute car remote1 est censé refuser l'accès lorsque ni clé ni mot de passe ne sont fournis, n'est-ce pas?
PerlDuck
10

Dans la plupart des cas, deux serveurs ssh peuvent se rejoindre (ou au moins l'un peut atteindre l'autre), et encore une fois dans la plupart des cas, Internet du poste de travail est bien pire que l'un des serveurs.

Si c'est le cas, commander un serveur à transférer sur l'autre est la voie à suivre.

ssh server1 nohup scp somefile server2:somefile

Vérifiez nohup.outsur server1 les erreurs.

Si l'accessibilité du serveur est l'inverse, vous pouvez inverser la machine qui est le maître:

ssh server2 nohup scp server1:somefile somefile
Joshua
la source
7

Vous pouvez peut-être utiliser l'un des frontaux de l'interface graphique pour rsync:

Existe-t-il une application graphique pour la commande rsync?

Ou peut-être pourriez-vous utiliser rsync directement depuis la ligne de commande pour vous connecter aux deux serveurs distants:

"Comment synchroniser des fichiers entre deux télécommandes"

Je me connecte souvent à un serveur avec ssh, puis à partir de la ligne de commande de ce serveur, utilisez rsync pour pousser ou tirer des fichiers vers l'autre serveur distant - c'est généralement beaucoup plus rapide que d'essayer de transférer les fichiers via un troisième ordinateur.

Le rsync est assez intelligent pour faire du travail, puis si quelque chose se passe mal et interrompt le processus, il peut plus tard reprendre là où il s'était arrêté.

David Cary
la source
0

Vous devez utiliser le protocole SCP. scp file you want to transfer login@address_of_second_server:/path_where_you_want_to_save

Gravemind
la source
2
OP souhaite copier des fichiers entre deux ordinateurs distants, pas d'un ordinateur local vers un ordinateur distant. Il semble également être à la recherche d'une solution graphique.
user68186
@ user68186 ma réponse est valide.
Gravemind