从 A 到 B 到 C 的 SSH,使用 A 上的私钥

blu*_*ast 7 linux firewall ssh bash proxy

这是我的场景:

  • 主机 C 无法从 A 访问。
  • 主机 B 可从 A 访问。
  • 主机 C 可从 B 访问。
  • B 和 C 都有~/.ssh/id_rsa.pub(来自 A)authorized_keys
  • B 没有私钥 ( ~/.ssh/id_rsa),因为它存在安全风险(密钥是个人的)。
  • 由于 B 没有私钥,因此无法从它登录到 C

如何使用主机 A 中的密钥登录主机 C?这可能吗?我怕不是。

(与此问题类似但不同)

编辑

我需要的是一种在不接触 B 中的文件系统的情况下,即时(stdin 或类似)向 B 中的 ssh 跃点提供私钥的方法。这可能吗?

kas*_*erd 9

如果您使用的是最新版本的 OpenSSH,您只需输入:

ssh -J B C
Run Code Online (Sandbox Code Playgroud)

如果您使用的是没有-J支持的稍旧版本,您可以使用更复杂的语法:

ssh -o ProxyCommand='ssh -W %h:%p B' C
Run Code Online (Sandbox Code Playgroud)

如果每次从 A ssh 到 C 时都需要这个,在.ssh/config文件中添加一个看起来像这样的条目会很有用(在最近的版本中):

Host C
   ProxyJump B
Run Code Online (Sandbox Code Playgroud)

或者像这样(在稍旧的版本中):

Host C
   ProxyCommand ssh -W %h:%p B
Run Code Online (Sandbox Code Playgroud)

使用上述任一方法,您只需键入ssh C即可打开连接。当您ssh通过ssh用于传输的众多工具之一间接使用时,这特别有用。并非所有这些工具都提供了将命令行标志传递给命令的直接方法ssh

  • 您还可以通过创建 ~/.ssh/config(在 A 上)并使用选项“ProxyJump B”(或适当的“ProxyCommand ssh -W %h:%p B”)为“主机 C”添加一个条目来自动执行此操作)。然后`ssh C` 会做正确的事情。 (3认同)

小智 0

这相当容易。只需使用代理转发(ssh 上的 -A 选项)。

样本:

#On machine A use
ssh -A user@<machine_B>
#Then on machine B use
ssh -A user@<machine_C>
Run Code Online (Sandbox Code Playgroud)

无需到处复制私钥。-A 仅将任何 SSH 代理请求转发到链中的第一台计算机,因此只要不在中间计算机上切换用户,就可以使用计算机 A 上的私钥。

如果您更改机器 B 上的用户(例如使用 su foo 更改为用户 foo),则代理转发将不再起作用,因为下一个连接将作为用户 foo 使用其自己的密钥完成。