A --> B(手动启动,也可以通过 nodeA 上的 crontab 完成)

A --> B(手动启动,也可以通过 nodeA 上的 crontab 完成)

我有 3 台计算机/服务器,我们将它们称为计算机 A、计算机 B 和计算机 C。

  • ssh计算机 A 可以通过计算机 B访问。
  • ssh只有计算机 B 可以通过计算机 C访问。
  • 计算机 A 无法直接访问计算机 C。

因此,我想使用rsync计算机 B 将目录从计算机 A 传输到计算机 C(因为只有计算机 B 可以通过ssh计算机 C 访问)。我想rsync以一种简单的方式使用,如下所示:

rsync -options /path_to_local IpComputerC:/path_to_remote

我正在考虑建立ssh隧道,但我不知道是否必须进行本地端口转发或远程端口转发,或者是否必须建立两个隧道:一个从 A 到 B,另一个从 B 到 C?

有什么建议吗?我将不胜感激。

**更新:我做到了!!我创建了一个带有本地端口转发的 ssh 隧道,这意味着我使用机器 A 的本地端口通过机器 B 连接到机器 C 上的远程端口。该命令的语法是:

ssh -f -N -L local_port_machineA:ip_machineC:remoteport_machineC user_machineB@ip_machineB

就我而言,remoteport_machineC 应该是端口 22,因为我想通过 ssh 来 rsync 目录。

之后,我们可以从机器A执行rsync命令,方法如下:

rsync -avz -e "ssh -p local_port" /source_directory username_machineC@localhost:/target_directory

就这样。此外,您还可以在引号内的部分添加更多选项,例如密钥或文件等。**

答案1

比其他建议简单得多:使用rsync-e | --rsh选项:

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

请注意,我正在使用-A(代理转发),但如果您不使用密钥,它也应该适用于密码验证,当然,您可以在示例proxy中用Bdest用替换。C

如果您碰巧没有足够新的ssh版本(> = 5.3,IIRC),您可以使用netcat而不是-W选项来ssh

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

答案2

一个解决方案是在“跳转节点”(此场景中为计算机 B)上使用 crontab。

A --> B(手动启动,也可以通过 nodeA 上的 crontab 完成)

rsync -avzP --progress /path/to/transfer/ user@nodeB:/transfer/share/

B --> C(创建每 15 分钟运行一次的 crontab)

sudo crontab -e
*/15 * * * * rsync -avzP --progress /transfer/share/ user@nodeC:/destination/share/

您可能希望通过限制访问权限的“服务帐户”(又名:ProdID)锁定访问权限,从而进一步确保安全。或者,您可以使用 SSH 密钥绕过登录时的密码提示。

http://www.rackspace.com/knowledge_center/article/generating-rsa-keys-with-ssh-puttygen

补充信息

您是否考虑过远程 NFS 共享(由 nodeC 提供,远程安装在 nodeB 上,并由来自 nodeA 的 rsync 定位)?在这种情况下,远程 NFS 共享(来自 NodeC)将安装在 NodeB 上(从操作系统角度来看,它将显示为标准文件系统)。因此,它将在您描述的连接场景中可访问,而无需消耗 NodeB 上的 DISK。因此,您将能够调整上面的“rsync”语法以指向安装在 NodeB 上的远程 NFS 共享,最终“传递”到 NodeC。您可能还希望考虑安全问题。

答案3

NFS 解决方案

参考

http://www.tldp.org/HOWTO/NFS-HOWTO/server.html

执行

NodeC:启用 NFS,创建 NFS 共享,设置非 root 权限(本例中为 RHEL 5.x,其他发行版会略有不同)

sudo /sbin/chkconfig portmap on
sudo /sbin/chkconfig nfs on
sudo /sbin/service portmap start
sudo /sbin/service nfs start

sudo chown "nobody:users"   /final/destination/share
sudo chmod 775 /final/destination/share

sudo vi /etc/exports
    /final/destination/share    NodeC_IP(rw)    NodeB_IP(rw)    
sudo /usr/sbin/exportfs -ra

NodeB:自动挂载目标共享

sudo mkdir -p /transfer/share/name
sudo vi /etc/fstab
    NodeC_IP:/final/destination/share   /transfer/share/name    nfs defaults
sudo mount -a

NodeA:安排一个 rsync 作业(本例中频率为 15 分钟)

# manual method
/usr/bin/rsync -avzP --progress /transfer/share/local/ user@nodeB:/transfer/share/name/

# scheduled method
sudo crontab -e
    */15 * * * * /usr/bin/rsync -avzP --progress /transfer/share/local/ user@nodeB:/transfer/share/name/

答案4

您可以创建显式隧道并使用该端口。但我发现直接使用 rsync 更方便,如下所示:

rsync -avzhe "ssh -A user@B ssh" ./src user@C:/dst

相关内容