J'aimerais transférer des fichiers entre deux hôtes distants à l'aide d'un shell local, mais il semble que rsync ne supporte pas la synchronisation si deux télécommandes sont spécifiées comme suit:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Quelles autres solutions de contournement / commandes que je pourrais utiliser pour obtenir des résultats similaires?
sshfs
est quersync
les systèmes de fichiers source et de destination sont alors tous deux locaux, ce qui désactive son algorithme delta. À ce stade, vous pouvez presque aussi bien utilisercp -p
. Voir la réponse qui propose ceci et ses commentaires ultérieurs.Réponses:
Comme vous l'avez découvert, vous ne pouvez pas utiliser rsync avec une source et une destination distantes. En supposant que les deux serveurs ne peuvent pas se parler directement, il est possible d'utiliser ssh pour créer un tunnel via votre ordinateur local.
Au lieu de
tu peux utiliser ça
Si vous le souhaitez, l'
-R
option configure un canal inversé du port 50000 sur l'hôte1 qui mappe (via votre ordinateur local) sur le port 22 de l'hôte2. Il n'y a pas de connexion directe entre hôte1 et hôte2.la source
sshfs
monté les deux répertoires distants localement, puisrsync
sur les deux répertoires montés localement.-i
pour spécifier les clés nécessaires aux commandes ssh.-i key...
paramètre à l'intérieur des guillemets après lassh
commande. Si cela ne vous aide pas, n'hésitez pas à poser une nouvelle question, en vous référant au contextescp -3
.Vous n'avez pas expliqué pourquoi vous ne vouliez pas vous connecter à un hôte, puis en copier un sur l'autre. Je vais donc partager l'une de mes raisons et solutions.
Je ne pouvais pas me connecter à une machine puis à rsync à l'autre parce qu'aucun des deux hôtes ne disposait d'une clé SSH pouvant se connecter à l'autre. J'ai résolu ce problème en utilisant le transfert d'agent SSH pour permettre au premier hôte d'utiliser ma clé SSH lorsque j'étais connecté.
AVERTISSEMENT: le transfert SSH permet à l'hôte d'utiliser votre clé SSH pour la durée de votre connexion. Bien qu'ils ne puissent pas copier votre clé, ils peuvent se connecter à d'autres ordinateurs avec cette clé. Assurez-vous de bien comprendre les risques et n'utilisez pas le transfert d'agent pour des machines auxquelles vous ne faites pas confiance.
La commande suivante utilisera le transfert d’agent SSH pour ouvrir une connexion directe de
host1
àhost2
. Cela présente l'avantage que la machine exécutant la commande ne gêne pas le transfert.la source
-D
plutôt que-A
de contourner le réseau plutôt que les restrictions de clé); pour expliquer l'avantage; pour la commande étant courte; et cela fonctionne réellement. Notez que vous devrez peut-être spécifierusername@host1
s'il est différent du nom d'utilisateur local. De plus, rsync vérifie la clé de l'hôte lors de la connexion à l'hôte2. La clé de l'hôte1 doit donc déjà se trouver dans ~ / .ssh / known_hosts sur l'hôte2, sinon la commande échouera.ssh -A
, voir confluence. jetbrains.com/display/TCD10/SSH+Agent ).J'aime la réponse de Roaima, mais les chemins sont les mêmes dans les deux exemples, obscurcissant lequel est lequel. Nous avons établi que ce qui suit ne fonctionne pas:
Mais ceci fait (j'ai omis la bind_address explicite de localhost de l'
-R
option puisque c'est la valeur par défaut):Notez que vous devez configurer correctement les clés ssh entre les deux hôtes distants, avec la clé privée sur hôte1 et la clé publique sur hôte2.
Pour déboguer la connexion, divisez cela en deux parties et ajoutez le statut détaillé:
Si cela fonctionne, vous aurez un shell sur host1. Maintenant, essayez la commande rsync de host1. Je vous recommande de le faire dans une fenêtre différente pour éviter que les informations ssh détaillées ne soient mélangées avec les informations d'état rsync:
la source
rsync
est lancé sur hôte1 avec la cible sur hôte2. (Vous auriez pu demander des éclaircissements dans un commentaire.)Reformatage de la réponse de roaima dans la syntaxe de script bash (et ajout de caractères de continuation de ligne '\' pour plus de clarté) J'ai choisi le port 22000 au hasard ...
la source
La manière idéale serait d'exécuter le
rsync
sur l'un de ces serveurs. Mais si vous ne voulez pas exécuter un script sur le serveur distant. Vous pouvez exécuter un script sur votre système local, effectuer une opération ssh et y exécuter la commande rsync.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
En outre, comme vous le savez peut-être, rysnc effectue une synchronisation à sens unique. Si vous souhaitez une synchronisation bidirectionnelle, vous pouvez consulter osync ( https://github.com/deajan/osync ). Je l'utilise et l'ai trouvé utile.
la source
Juste comme une information supplémentaire:
Si vous utilisez un hôte de saut pour connecter les deux autres machines mais qu'elles ne peuvent pas se joindre directement, vous pouvez utiliser sshfs comme support entre ces deux machines comme ceci (sur l'hôte de saut):
SSHFS fournit les deux chemins sur l'hôte de saut et rsync gère la synchronisation des fichiers comme toujours (à la différence que cela se fait virtuellement localement).
la source
Vous pouvez exécuter un serveur rsyncd sur l’un des ordinateurs.
C’est cette approche que je suis en train de prendre, car je ne souhaite pas utiliser ssh pour permettre à la 'source' (en termes rsync) d’accéder à la 'destination' en tant que root sans mot de passe (comme requis pour utiliser le tunneling SSH avec rsync dans un script)
Dans mon cas, j’ai simplement configuré un serveur rsyncd sur l’ordinateur de destination avec un seul utilisateur autorisé à partir du PC source et utilisé par rsync du côté source.
Fonctionne très bien.
la source
Essayez d'utiliser ceci. Ça marche pour moi.
la source
Un script facile à utiliser
Au fil des ans, je l'ai fait plusieurs fois avec plus ou moins les mêmes astuces que dans toutes les autres réponses. Cependant, comme il est très facile de se tromper dans les détails et de passer beaucoup de temps à résoudre le problème, le script ci-dessous a été développé:
ssh -A
les données d'authentification ne parviennent pas à se propager (je ne sais pas pourquoi cela se produit parfois car la solution de contournement était plus facile que de rechercher la cause du problème)Comment utiliser le script
Comment ça fonctionne
Comme je l'ai dit, il utilise les mêmes astuces que dans toutes les autres réponses:
-R
option de ssh de ssh de localhost à host1 tout en configurant un transfert de port qui permet ensuite à host1 de se connecter via localhost à host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
Option de ssh permettant d'authentifier facilement le second ssh chanelMon c'est compliqué! Y a-t-il un moyen plus facile?
Lorsque vous copiez la totalité ou la plupart des octets de la source à la destination, son utilisation est beaucoup plus simple
tar
:Le scénario
la source
tar
C'est génial quand vous avez un seul transfert (non incrémental) et que votre transfert se termine en un seul passage. D'autre part,rsync
avec les poignées de transfert, les redémarrages et les transferts incrémentiels.Il est possible d'utiliser
tar
viassh
pour transférer les fichiers:Modifiez le
j
paramètre (fortar
) àz
deux endroits si vous souhaitez compresser l'archive avecgzip
, au lieu debzip2
. Généralement,bzip2
la compression est plus élevée quegzip
, mais elle est plus lente, changez-la en fonction de vos besoins (voir: bzip2 vs gzip ).Connexe: Comment copier entre deux hôtes distants à l'aide de tar transféré dans SSH à partir d'un serveur distant derrière un pare-feu?
Alternativement (pour sécuriser la bande passante, en raison de la compression transparente), il est possible
sshfs
de monter un système de fichiers distant en local et de l'utiliserrsync
normalement, par exemplela source