Rsync 远程到远程

Ali*_*iBZ 6 rsync virtual-machines

我正在寻找在 2 个远程服务器之间使用 rsync 的解决方案。这似乎是不可能的。有谁知道为什么它不可能?我这么问是因为我想如果我知道原因,也许我可以使用其他工具来使它成为可能。

更新:我的主站点上有一个虚拟机管理程序,运行着 n vm。我的辅助站点上有另一个管理程序,我想将其作为主服务器的备份服务器。为了保持文件在这两者之间同步,我发现的最好方法是使用 rsync。问题是我不想在 VM 上运行我的代码 (rsync),因为我希望我的产品少代理。在这种情况下,我需要添加第三台计算机来运行代码。现在,我需要在我坚持使用的主站点和辅助站点之间进行 rsync,因为 rsync 不适用于远程到远程服务器。

Mic*_*ton 8

ssh user@server1 "rsync /files user@server2:/directory"
Run Code Online (Sandbox Code Playgroud)

  • 当然,这假设 server1 可以直接访问 server2。如果两台服务器由于某种原因无法相互联系,这可能无济于事。 (6认同)
  • @AliBZ:即使您使 rsync remote.server:/source /local/target 您正在远程服务器上运行 rsync。Rsync 到/从远程服务器将调用服务器上的 rsync 命令(通过 ssh 或使用自己的协议)。因此,使用 ssh 显式连接到其中一台服务器并没有太大变化。 (2认同)

Phi*_*all 5

您可以使用 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,它将从密钥环中提取您的私钥,而不是提示您输入密码。

代理转发

AllowAgentForwarding yes在远程主机上的 /etc/ssh/sshd_config 中设置。这使得您可以从您已 SSH 连接到的机器 ssh 到另一台在 Authorized_keys 中有您的公钥的机器,并且不会提示您输入密码或密码,因为它将处理返回钥匙串的通信你的源机器。

ssh 命令

ssh 允许你在远程机器上发出命令而不给你一个 shell,如果你有上面的设置,你可以执行以下操作:

ssh user1@remote_host1 'hostname;id'
Run Code Online (Sandbox Code Playgroud)

这将在 remote_host1 上运行命令 hostname 和 id 并使用您的密钥而不提示您。它应该返回“remote_host1,user1”

您还可以演示代理转发

ssh user1@remote_host1 'ssh user2@remote_host2 "hostname;id"'
Run Code Online (Sandbox Code Playgroud)

这将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"
Run Code Online (Sandbox Code Playgroud)

这告诉 remote_host1 将 host_1 上的源与 host_2 上的目标 rsync,并且 rsync 已被告知使用 ssh,它将使用您的转发密钥。