Answers:
原理图:
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$
nc
?
ForwardAgent yes
前添加一个ProxyJump
。
检查以下是否有效。
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上执行。
我现在已经解决了。这是解决方案,非常简单。我应该早点看的:
〜/ .ssh / config:
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”的连接。Netcat或nc将需要安装在“ B”上。
希望这对其他人有帮助。
我写了一个简单的脚本,基本上在远程实例上列出了我的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
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant
bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780
scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/
去做:
ssh someuser@IP_D
这样
A -> B-> C -> D
A是您所在的主机,
像这样编辑本地〜/ .ssh / config:
Host IP_D
ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'
该答案基于所选答案。我必须弄清楚各种用户如何适应整个方案。
这对我有用。HTH。
Snowball的回答很有帮助。但是,我对该命令做了一些修改,并想解释它的工作原理。在这种情况下:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
修改~/.ssh/config
文件并添加B
要跳转的主机,就像通常配置主机一样:
Host B
User myusername
HostName b.mycompany.com
然后,添加C
要结束的主机:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
注意ProxyCommand
,其中:
ssh -T -q
指示它不应分配伪TTY(-T
)并保持安静(-q
);B
,我们添加了关键的SSH密钥A
通过ssh-add
;-o 'ForwardAgent yes'
。ssh-add -t 1
表示我只希望将密钥添加到对最终主机C进行身份验证所需的1秒钟;nc %h %p
启动netcat
到最终主机%h
的连接%p
(这两个端口都将根据~/.ssh/config
文件中的信息由SSH填充)。如果需要指定B
要使用的自定义键,则可以通过修改ssh-add
零件来实现:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'