我正在寻找在两台远程服务器之间使用rsync的解决scheme。 这似乎是不可能的。 有谁知道为什么不可能? 我问,因为我认为,如果我知道原因,也许我可以使用另一个工具,使之成为可能。
更新:我有一个虚拟主机在我的主站点上运行n个虚拟机。 我的辅助站点上有另一个pipe理程序,我想成为主服务器的备份服务器。 为了保持这两个文件之间的同步,我发现最好的方法是使用rsync。 问题是我不想在虚拟机上运行我的代码(rsync),因为我希望我的产品less代理。 在这种情况下,我需要添加第三台计算机来运行代码。 现在,我需要在我的主站点和辅助站点之间进行rsync同步,因为rsync不适用于远程到远程服务器。
ssh user@server1 "rsync /files user@server2:/directory"
您可以使用ssh,使用ssh公钥/私钥在rsync中安全地执行此操作。
ssh可以通过密码或公钥/私钥进行身份validation。 在这个答案中,我将介绍如何设置一个SSH公钥/私钥对。 描述ssh-agent转发,以及如何使用rsync同步两台远程机器。
你可以使用ssh-keygen生成一个ssh密钥对,它会提示你input一个密码,你会想在这里input一些安全的东西。 它也会生成两个文件$ HOME / .ssh / id_rsa(不要共享这个文件)和$ HOME / .ssh / id_rsa.pub。
公共密钥(id_rsa.pub)可以与任何人共享,而不用担心您的帐户被他们入侵。 如果有人获得了你的私钥,那么他们可以validation任何设置为接受你的私钥的帐号/机器。
这是密码进入的地方,如果有人得到你的私钥,他们仍然需要知道密码。
在login期间,ssh在$ HOME / .ssh / authorized_keys中查找一个文件。 该文件是授权用于身份validation的公钥列表。 在你的远程机器上,你会想把你的id_rsa.pub附加到这个文件中。
在ssh尝试期间,您现在将被提示input您的密码而不是您的密码。
您可以通过使用ssh-agent bash ,然后使用ssh-add来避免必须反复input密码。 首先运行带有“钥匙环”的bash,然后将钥匙添加到钥匙圈中。 现在,在这个shell中,如果调用了ssh,它将从密钥环中取出你的私钥,而不是提示你input密码。
在远程主机上的/ etc / ssh / sshd_config中设置AllowAgentForwarding yes 。 这使得你可以从你已经连接到的机器上ssh,到另一个在authorized_keys中拥有你的公钥的机器,并且你不会被提示input密码或密码,因为它会处理返回到钥匙串你的源机器。
ssh可以让你在远程机器上发出一个命令而不给你一个shell,如果你有上面的设置你可以执行以下操作:
ssh user1@remote_host1 'hostname;id'
这将运行remote_host1上的命令hostname和id,并在不提示您的情况下使用您的密钥。 它应该返回“remote_host1,user1”
您也可以演示代理转发
ssh user1@remote_host1 'ssh user2@remote_host2 "hostname;id"'
这将运行ssh user2@remote_host2 "hostname;id"在remote_host1上,然后ssh到remote_host2并运行它们的命令。 当代理转发处于打开状态时,它会将身份validation请求交还给您的计算机,并且不会提示您使用您的密钥。 它应该返回“remote_host2,user2”
您现在可以执行以下操作。
ssh remote_host1_user@remote_host1 "rsync -ave ssh source_sync_dir remote_host2_user@remote_host2:target_sync_dir"
这告诉remote_host1 rsync host_1上的源和host_2上的目标,rsync已经被告知使用ssh,它将使用您的转发密钥。
如果server1和server2可以互相连接,上面的解决scheme将工作。 否则,我没有一个解决scheme的rsync,但旧的tar技巧将工作。 我现在正在做。
Prep:在没有密码的情况下创build一个ssh密钥,并将其安装到每台服务器的账户的authorized_keys文件中。 然后这样做:
$ ssh -i .ssh/my_key bob@server1 'tar -cf - -C sourcedir' | \ ssh -i .sh/my_key carol@server2 'tar -xvpf - -C targetdir'
请注意,您将在server2上结束targetdir / sourcedir。
信用:这个想法来自Oreilly系统pipe理书,封面上是犰狳。 我只是在中间插入一个工作站,因为server1不能直接与server2交谈。
我想同步从serverA到serverB的文件,但它们之间没有直接的连接,但是我有serverC可以访问serverA和serverB。 对我有效的是:
在serverC上:
ssh user@serverA 'rsync -avP -e "ssh -ax user@serverC ssh " /source/files user@serverB:/des/tination'
gw_en_2_segmentos# ssh cuenta@ip_origen 'cd /carpeta_origen;star \ -acl -artype=exustar -z \ -c -f=- *' | ssh cuenta@ip_destino \ 'cd /carpeta_destino;star \ -acl -artype=exustar -z -xv -f=-'
将给你一个远程到远程的副本,具有文件权限和POSIX ACL
假设你正在使用* nix:
添加一个执行同步到一个服务器的cronjob。
如果你想同步从/ home / user / sync_dir从一台计算机到另一台计算机的所有内容,并且不能为目录细节设置rsync本身,我宁愿通过ssh来做这件事。 (如果通过cron运行,您需要设置密钥来login而不是密码)。
rsync -ave“ssh”/ home / user / sync_dir / remote_user @ remote_host:/ home / user / remote_sync_dir /