我正在尝试通过堡垒服务器 B 将文件rsync
从服务器 A 复制到服务器 C。
A -> B -> C
这通常可以通过使用以下选项来实现-e
,例如:rsync -e 'ssh user@host' ...
。但是,当服务器 B 拥有服务器 C 所期望的密钥时,我无法弄清楚或找到如何执行此操作的示例。所有搜索结果都假设服务器 A 拥有密钥,并且该密钥在 B 和 C 上。
我可以成功使用此 ssh 命令来使用远程密钥:
ssh -t user@hostB ssh -i /home/user/.ssh/private_key user@hostC
但我无法将其转换为有效rsynd -e '...'
命令。一个主要问题是,上面的命令使用 更改了 ssh 启动 shell -t
,我认为这不是正确的方法。我也尝试过使用 JumpHost ssh 选项:
rsync -e 'ssh -J user@hostB' ...
这也是不成功的。
虽然使用rsync
是首选,但如果不可能,那么使用的解决方案scp
也是可以接受的。
答案1
解决方案
当您使用 时rsync -e ssh local_path userX@serverX:remote_path
,会采用(此处)rsync
的选项参数并添加更多内容来构建它将使用的命令。实际上,该命令将类似于:-e
ssh
userX@serverX
ssh userX@serverX …
其中…
表示rsync
要在远程端运行的特定命令。
您希望命令如下:
ssh user@hostB ssh -i /home/user/.ssh/private_key user@hostC …
所以你的rsync
命令需要是:
rsync -e 'ssh user@hostB ssh -i /home/user/.ssh/private_key' local_path user@hostC:remote_path
其他说明
您不能使用ssh -t
。对您有用的命令:
ssh -t user@hostB ssh -i /home/user/.ssh/private_key user@hostC
hostB
生成一个交互式 shell,当在和 上分配了 tty 时,该 shell 可以正常工作hostC
。ssh
如果您指定命令,则不会在远程端自动分配 tty;否则会。在上面的命令中,外部ssh
运行命令 ( ),如果您未使用 ,则ssh -i …
不会在 上分配 tty 。内部看不到命令,因此它会在运行 shell 之前自动在 上分配 tty 。hostB
-t
ssh
hostC
交互式 shell 需要 tty。它与 不同rsync
,它需要原始数据通道;tty 强加的更改和转换会破坏一切。这就是为什么你-t
根本不能使用 。然后每个都ssh
将看到一些指定的命令(如果是内部命令,ssh
它将是 添加的命令rsync
),因此不会在 上分配 tty hostB
,也不会在 上分配 tty hostC
。
为什么-J
没有解决方案在开头解释这个答案。
答案2
经过进一步研究,这看起来是一个不安全的过程。相反,我认为正确的解决方案是将服务器 A 上的密钥作为授权密钥添加到服务器 B 和 C。之后,应该使用此解决方案:https://superuser.com/a/1115998/1621610