我有 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
中用B
和dest
用替换。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