web-dev-qa-db-fra.com

Fichiers Rsync via l'hôte intermédiaire

Je suis actuellement loin de mon réseau local et je dois faire une sauvegarde de mon ordinateur portable. J'ai une copie un peu récente de mon ordinateur portable sur mon serveur et je sauvegarde généralement l'ordinateur portable en utilisant rsync. Maintenant, je souhaite le faire, mais en dehors de mon réseau local.

En bref, je veux envoyer des données de A à C via B, où A est mon ordinateur portable, B mon routeur et C mon serveur.

J'ai trouvé cette commande: A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination, qui fonctionne bien pour transférer des fichiers via scp - mais comme j'ai déjà la plupart des données sur mon serveur, je souhaite utiliser rsync pour synchroniser uniquement le delta.

J'ai essayé: A$ rsync file -e 'ssh B ssh' C, et cela fonctionne dans la mesure où je suis invité à donner le mot de passe pour l'utilisateur: C. Cependant, lorsque je saisis le mot de passe, rien ne se passe. Le routeur exécute Tomato v1.28 et je ne peux pas le configurer pour utiliser un fichier de configuration ssh afin de lui permettre de se connecter à C sans mot de passe.

Des idées sur la façon de faire fonctionner cela?

17
GLaDER

Cette question a essentiellement une réponse ailleurs, y compris ici pour scp et ici pour rsync . Puisque ce dernier inclut ma réponse, mais qu'aucune réponse n'a été acceptée, je vais la répéter ici.

Comme vous l'avez noté, vous pouvez utiliser l'option -e | --rsh de rsync, mais cela va être un peu plus compliqué:

rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST -W %h:%p"' foo/ dest:./foo/

Ou, si votre version de ssh est suffisamment nouvelle (OpenSSH> = v7.3), vous pouvez utiliser l'option -J (ProxyJump)

rsync -azv -e 'ssh -A -J USER@PROXYHOST:PORT' foo/ dest:./foo/

Notez que j'utilise -A (transfert d'agent), mais cela devrait également fonctionner avec une authentification par mot de passe si vous n'utilisez pas de clés. Vous pouvez bien sûr remplacer proxy par B et dest par C dans votre exemple.

Si, par hasard, vous ne disposez pas d'une nouvelle version ssh suffisante (> = 5.3, IIRC), vous pouvez utiliser netcat au lieu de -W pour l'option ssh:

rsync -azv -e 'ssh -o "ProxyCommand ssh -A PROXYHOST nc %h %p"' foo/ dest:./foo/

Enfin, comme indiqué dans les commentaires déjà, vous pouvez insérer la variable ProxyCommand dans votre fichier $HOME/.ssh/config afin de ne pas avoir à utiliser une ligne de commande aussi complexe. Plus précisément, ajoutez quelque chose comme ceci:

Host C
  ProxyCommand ssh -A PROXYHOST -p 22 -W %h:%p

Ou, en utilisant ProxyJump pour OpenSSH> = v 7.3:

Host C
  ProxyJump PROXYHOST

Ensuite, vous devriez être capable de faire:

rsync -azv foo/ C:./foo/
25
crimson-egret