Voici la connexion:
[Server1] <---> [my desktop] <---> [Server2]
Server1 et server2 ne sont pas autorisés à parler directement entre eux (ne demandez pas). Mon bureau est cependant capable d'accéder aux deux serveurs via ssh.
J'ai besoin de copier des fichiers de server1 vers server2.
Traditionnellement, j'utilise un hack ssh + tar, en tant que tel:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
Et cela fonctionne très bien, mais je voudrais aller plus loin et faire fonctionner rsync entre les deux serveurs via mon bureau.
Maintenant, je sais que je pourrais démarrer un tunnel de transfert de port ssh dans un terminal, puis rsync sur ce tunnel dans une autre fenêtre, mais je ne veux pas discuter avec un deuxième terminal ou créer et casser un tunnel de transfert de port séparé. ce que je veux c'est:
- Une commande liner pour rsync des fichiers de Server1 à server2 VIA mon bureau
- le tout sur UNE seule ligne de commande, une seule fenêtre de terminal
- Je souhaite que le tunnel de transfert de port n'existe que pour la durée de vie de la commande rsync.
- Je ne veux pas scp, je veux rsync.
Quelqu'un at-il une astuce pour le faire?
EDIT: Voici la commande de travail! Excellent travail tout le monde: 1. Pour le chemin de clé rsa, ne peut pas utiliser de tildae, a dû utiliser "/ root /". 2. Voici la dernière ligne de commande:
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
Boom va la dynamite.
Réponses:
Si vous êtes heureux de conserver une copie des données sur la machine intermédiaire, vous pouvez simplement écrire un script qui a mis à jour la copie locale en utilisant le serveur1 comme référence, puis a mis à jour la sauvegarde sur le serveur2 en utilisant la copie locale comme référence:
L'utilisation d'un script simple signifie que vous avez souhaité une seule commande pour tout faire. Bien sûr, cela pourrait être un non-non de sécurité si les données sont sensibles (vous ou d'autres personnes de votre entreprise, ne voudrez peut-être pas qu'une copie flotte sur votre ordinateur portable). Si server1 est local pour vous, vous pouvez simplement supprimer la copie locale par la suite (car il sera rapide de reconstruire sur le LAN local la prochaine fois).
Construire un tunnel pour que les serveurs puissent communiquer efficacement entre eux plus directement devrait être possible comme ceci:
Sur le serveur 2, créez un script qui ne fait rien d'autre que de dormir en boucle pendant quelques secondes puis de faire écho à une petite quantité de texte, et utilisez-le maintenant la "copie" de sh:
(le
echo
n'est probablement pas nécessaire, car la session ne restera pas inactive assez longtemps pour expirer même si SSHd est configuré pour ignorer les paquets persistants du client ssh)Vous pouvez maintenant écrire un script sur votre ordinateur portable qui démarre votre tunnel inverse en arrière-plan, indique à server1 d'utiliser rsync pour effectuer l'opération de copie, puis tue le tunnel inverse en tuant le script de bouclage (qui fermera la session SSH):
La façon dont cela fonctionne:
Cela ne semble pas particulièrement propre, mais cela devrait fonctionner. Je n'ai pas testé ce qui précède, vous devrez peut-être le modifier. Faire de la commande rsync un script sur une seule ligne sur server1 peut aider en réduisant le besoin d'échapper des caractères comme le 'sur la commande ssh appelante.
BTW: vous dites "ne demandez pas" pourquoi les deux serveurs ne peuvent pas se voir directement, mais il y a souvent une bonne raison à cela. Mon serveur domestique et le serveur sur lequel ses sauvegardes en ligne sont conservées ne peuvent pas se connecter les uns aux autres (et ont des mots de passe + clés différents pour tous les utilisateurs) - cela signifie que si l'un des deux est piraté, il ne peut pas être utilisé comme un chemin facile pour pirater l'autre pour que mes sauvegardes en ligne soient plus sûres (quelqu'un malveillant supprimant mes données en direct ne peut pas utiliser sa capacité à mettre à jour les sauvegardes pour supprimer lesdites sauvegardes, car il n'a pas la capacité directe de toucher le site de sauvegarde principal). Les deux serveurs peuvent tous deux se connecter à un serveur intermédiaire ailleurs - le serveur en direct est configuré pour envoyer ses sauvegardes (via rsync) à la machine intermédiaire tôt le matin et le serveur de sauvegarde est défini (un peu plus tard pour permettre à la première étape de se terminer) de se connecter et collecter les mises à jour (à nouveau via rsyc suivi d'une étape d'instantané afin de maintenir plusieurs âges de sauvegarde). Cette technique peut également être utilisable dans votre cas, et si c'est le cas, je la recommanderais comme une façon beaucoup plus propre de faire les choses.
Edit: Fusionner mon hack avec Aaron pour éviter tout le bourdonnement avec des copies de / bin / sh et un script persistant séparé sur server2, ce script sur votre ordinateur portable devrait faire tout le travail:
Comme avec ce qui précède, rsync se connecte à localhost: 2222 qui transmet le tunnel vers l'hôte local de votre ordinateur portable: 2222 qui transmet à travers l'autre tunnel à l'hôte local de server2: 22.
Edit 2: Si cela ne vous dérange pas que server1 ait une clé qui lui permet de s'authentifier directement avec server2 (même s'il ne peut pas voir server2 sans tunnel), vous pouvez simplifier davantage avec:
où 123.123.123.123 est une adresse publique pour server2, qui pourrait être utilisée comme un + liner one-liner au lieu d'un script.
la source
ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
If you don't mind server1 having a key ...
. Pouvez-vous me dire s'il est vraiment possible d'éviter d'avoir la clé de server2 sur server1 s'il vous plaît?Voici quelques méthodes qui rendent la synchronisation simple, mais nécessitent un certain travail de configuration.
Mettre en place un tunnel ssh inverse de server1 à votre bureau (désolé, je ne peux pas vous dire l'
.ssh/config
incantation du haut de ma tête). Enchaînez-le avec une connexion de votre bureau au serveur2. Exécutez rsync à partir de server1.Configurez un proxy de chaussettes (ou un proxy http qui accepte CONNECT) sur votre bureau. Utilisez-le pour établir une connexion ssh de serveur1 à serveur2. Exécutez rsync à partir de server2.
Utilisez unisson au lieu de rsync. Mais le flux de travail est différent.
Montez les répertoires à partir d'un ou des deux serveurs de votre bureau à l'aide de sshfs .
la source
Pourquoi une ligne? Utilisez un petit script shell:
IIRC, vous pouvez régler le temps de sommeil plus bas; le premier
ssh
ne prendra pas fin tant que quelqu'un utilisera le canal.la source
sleep
ettrap
soit plus nette que la méthode "garder en vie et tuer" dans ma réponse .