我正在寻找一种简单的方法,通过代理 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/config
上A
,添加
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