以下是我的情况:
- 主机 C 无法从 A 访问。
- 主机 B 可从 A 访问。
- 可以从 B 访问主机 C。
- B 和 C 都有
~/.ssh/id_rsa.pub
(来自 A)authorized_keys
- B 没有私钥(
~/.ssh/id_rsa
),因为这会存在安全风险(密钥属于个人)。 - 由于 B 没有私钥,因此无法通过 B 登录到 C
我如何使用主机 A 中的密钥登录主机 C?这可能吗?恐怕不可能。
(类似但不同于这个问题)
编辑
我需要的是一种方法来动态地(stdin 或类似方式)向 B 中的 ssh 跳跃提供私钥,而无需它接触 B 中的文件系统。这可能吗?
答案1
如果您正在使用最新版本的 OpenSSH,您只需输入:
ssh -J B C
如果您使用的是稍旧一些的版本而不受支持,-J
则可以使用稍微更复杂的语法:
ssh -o ProxyCommand='ssh -W %h:%p B' C
如果每次从 A 到 C 进行 ssh 时都需要这个,那么在文件中添加如下条目会很有用.ssh/config
(在较新的版本中):
Host C
ProxyJump B
或者像这样(稍微旧一点的版本):
Host C
ProxyCommand ssh -W %h:%p B
使用上述任何一种方式,您只需键入即可ssh C
打开连接。当您ssh
通过众多用于ssh
传输的工具之一间接使用时,这尤其有用。并非所有这些工具都提供了将命令行标志传递给ssh
命令的直接方法。
答案2
这相当简单。只需使用代理转发(ssh 上的 -A 选项)。
样本:
#On machine A use
ssh -A user@<machine_B>
#Then on machine B use
ssh -A user@<machine_C>
无需到处复制私钥。-A 仅将任何 SSH 代理请求转发到链中的第一个机器,因此只要您不在中间机器上切换用户,就可以使用机器 A 上的私钥。
如果您在机器 B 上更改用户(例如使用 su foo 更改为用户 foo),则代理转发不再起作用,因为下一个连接是以用户 foo 使用它自己的密钥完成的。
答案3
我在寻找同样的东西时偶然发现了这个问题。这里的解决方案如下:
ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host
不过,我不能居功,因为这个解决方案来自另一个问题,但我已经验证过这种方法是有效的。