使用代理上的密钥通过 ssh 代理进行 rsync

使用代理上的密钥通过 ssh 代理进行 rsync

我正在尝试通过堡垒服务器 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的选项参数并添加更多内容来构建它将使用的命令。实际上,该命令将类似于:-esshuserX@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 可以正常工作hostCssh如果您指定命令,则不会在远程端自动分配 tty;否则会。在上面的命令中,外部ssh运行命令 ( ),如果您未使用 ,则ssh -i …不会在 上分配 tty 。内部看不到命令​​,因此它会在运行 shell 之前自动在 上分配 tty 。hostB-tsshhostC

交互式 shell 需要 tty。它与 不同rsync,它需要原始数据通道;tty 强加的更改和转换会破坏一切。这就是为什么你-t根本不能使用 。然后每个都ssh将看到一些指定的命令(如果是内部命令,ssh它将是 添加的命令rsync),因此不会在 上分配 tty hostB,也不会在 上分配 tty hostC

为什么-J没有解决方案在开头解释这个答案

答案2

经过进一步研究,这看起来是一个不安全的过程。相反,我认为正确的解决方案是将服务器 A 上的密钥作为授权密钥添加到服务器 B 和 C。之后,应该使用此解决方案:https://superuser.com/a/1115998/1621610

相关内容