通过 B 上的私钥从 A 到 C 进行 SSH

通过 B 上的私钥从 A 到 C 进行 SSH

我正在寻找一种简单的方法,通过代理 B 从本地计算机 A SSH 到目标主机 C。与 C 上的公钥配套的私钥在 B 上,我无法将该密钥放在本地计算机上。有什么建议吗?

另外,我希望能够使用 ~/.ssh/config 来执行此操作。

谢谢!

答案1

示意图:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key

先决条件:

  • A正在运行 ssh-agent;
  • A可以访问B
  • B可以访问C
  • A的 ssh 公钥存在于B:~/.ssh/authorized_keys
  • B的 ssh 公钥存在于C:~/.ssh/authorized_keys

~/.ssh/configA,添加

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'

如果你在B上的ssh私钥位于非标准位置,请在后面添加其路径ssh-add

您现在可以C从以下位置访问A

A$ ssh C
C$

答案2

检查以下操作是否有效。

ssh -t B ssh C

如果您想使用存储在 B 上的密钥,请使用以下命令。

ssh -t B ssh -i /path/to/identity_on_B C

这里我们指定ssh -i /path/to/identity_on_B C在 B 而不是登录 shell 上执行的命令。

答案3

我现在已经解决了这个问题。这是解决方案,相当简单。我应该早点看到它:

〜/.ssh /配置:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5

“B” 是您要跳转的代理服务器。应按照通常配置服务器访问的方式对其进行配置。

“C” 是目标主机。需要将其配置为在连接过程中使用“B”。“C”中的身份文件是“B”上 ssh 密钥的路径。ProxyCommand 使用 Netcat 从“B”打开到“C”的连接。需要在“B”上安装 Netcat 或 nc。

注1:为了使其工作,您需要将B的身份文件(通常是~/.ssh/rd_isa)复制到A。我通常将其名称更改为rd_isa_B。

注2:此解决方案也适用于scp。

希望这对其他人有帮助。

答案4

我编写了一个简单的脚本,基本上列出了远程实例上的 ssh 密钥,然后将我选择的密钥添加到本地 ssh 代理。这不是很简洁,但允许我将所有密钥保存在远程位置而不是本地。

如果有人感兴趣的话,这是脚本:

#!/usr/bin/ruby

require "rubygems"
require "fileutils"

# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/  /g' | sed     's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list

# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp

# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0

相关内容