我正在寻找在两个远程服务器之间使用 rsync 的解决方案。这似乎是不可能的。有人知道为什么这是不可能的吗?我问这个问题是因为我想如果我知道原因,也许我可以使用另一个工具来实现它。
更新:我的主站点上有一个虚拟机管理程序,上面运行着 n 个虚拟机。我的辅助站点上还有另一个虚拟机管理程序,我想将其作为主服务器的备份服务器。为了保持这两个服务器之间的文件同步,我发现最好的方法是使用 rsync。问题是我不想在虚拟机上运行我的代码(rsync),因为我希望我的产品不需要代理。在这种情况下,我需要添加第三台计算机来运行代码。现在,我需要在主站点和辅助站点之间进行 rsync,但我只能这样做,因为 rsync 不适用于远程到远程服务器。
答案1
ssh user@server1 "rsync /files user@server2:/directory"
答案2
您可以使用 ssh 和 ssh 公钥/私钥通过 rsync 安全地执行此操作。
ssh 可以使用密码或公钥/私钥对进行身份验证。在本回答中,我将介绍如何设置 ssh 公钥/私钥对。描述 ssh-agent 转发,以及如何将它们与 rsync 一起使用来同步两台远程计算机。
SSH 公钥/私钥
您可以使用生成一个 ssh 密钥对ssh-keygen
,它会提示您输入密码,您需要在此处输入一些安全的信息。它还将生成两个文件 $HOME/.ssh/id_rsa(不要共享)和 $HOME/.ssh/id_rsa.pub。
公钥 (id_rsa.pub) 可以与任何人共享,无需担心您的帐户被他们泄露。如果有人掌握了您的私钥,那么他们就可以向任何设置为接受您的私钥的帐户/机器进行身份验证。
这就是密码的作用所在,如果有人获得了你的私钥,他们仍然需要知道密码。
授权密钥
登录期间,ssh 会在 $HOME/.ssh/authorized_keys 处查找文件。此文件是授权用于身份验证的公钥列表。在远程计算机上,您需要将 id_rsa.pub 附加到此文件。
在 ssh 尝试期间,您现在将提示您输入私钥的密码而不是密码。
ssh 代理
ssh-agent bash
您可以使用,然后使用 ,避免反复输入密码ssh-add
。这将首先运行带有“密钥环”的 bash,然后将您的密钥添加到密钥环。现在,在此 shell 中,如果调用 ssh,它将从密钥环中提取您的私钥,而不是提示您输入密码。
代理转发
在远程主机上的 /etc/ssh/sshd_config 中设置AllowAgentForwarding yes
。这样您就可以从一台您已 ssh 到的机器,到另一台在 authorized_keys 中拥有您的公钥的机器,并且不会提示您输入密码或密码短语,因为它将处理与源机器上的钥匙串的通信。
ssh 命令
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"'
这将user2@remote_host2 "hostname;id"
在 remote_host1 上运行 ssh,然后 ssh 到 remote_host2 并运行命令。由于代理转发已开启,它将身份验证请求返回到您的计算机并使用您的密钥而无需提示您。它应该返回“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 将 host_1 上的源与 host_2 上的目标进行 rsync,并且 rsync 已被告知使用 ssh,它将使用您的转发密钥。
答案3
如果 server1 和 server2 可以互相连接,则上述解决方案将起作用。否则,我没有 rsync 的解决方案,但一个老tar
办法会起作用。我现在正在这样做。
准备工作:创建一个没有密码的 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 系统管理书。我只是在中间插入了一个工作站,因为服务器 1 无法直接与服务器 2 通信。
答案4
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