我正在寻找一种从本地计算机A通过代理B到目标主机C进行SSH的简单方法。与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
中存在C:~/.ssh/authorized_keys
的ssh公钥在
~/.ssh/config
上的A
中,添加Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
如果您的ssh私钥B上的B处于非标准位置,请在
ssh-add
之后添加其路径。您现在应该能够从
C
访问A
:A$ ssh C
C$
评论
从openssh v.7.3开始,您可以仅使用ProxyJumpB。来源:Wikibooks
–基思
16年11月12日在20:35
可以这样定义吗:主机user1 @ c ProxyCommand ssh -o'ForwardAgent yes'user2 @ B'ssh-add && nc%h%p'
–拉文德拉纳特·阿基拉(Ravindranath Akila)
17年1月27日在1:37
如果机器B没有nc,解决方案将如何更改?
– mjalajel
17年3月18日在13:30
如果仅在B上存在C的私钥,则@DrewVS ProxyJump B似乎无法正常工作。是否有某种方法可以做到这一点?
–地狱
17年7月18日在13:36
@DrewVS好的,需要在ProxyJump命令之前添加ForwardAgent yes。
–地狱
17年7月18日在13:38
#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上执行。评论
此方法有效,但它不会从B拾取IdentityFile。它仍然在A上查找。
–牧马人
2011年12月6日在18:05
@DrewVS我已经更新了答案。请检查它是否对您有用。
– Sachin Divekar
2011年12月6日18:41
萨钦,非常聪明。那很好。非常感谢!
–牧马人
2011年12月7日19:06
@DrewVS很高兴听到它对您有用。所以请接受答案。
– Sachin Divekar
2011年12月7日19:10
但是,这似乎不适用于受密码保护的rsa密钥。密码输入是隐藏的,从而迫使用户必须将密钥添加到其ssh-key才能使此方法起作用。有任何想法吗?
–牧马人
2011-12-7 21:03
#3 楼
我现在已经解决了。这是解决方案,非常简单。我应该早点看一下它:〜/ .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
是您正在跳过的代理服务器。应该像通常配置对服务器的访问那样配置它。“ C”是目标主机。需要将其配置为在连接过程中使用“ B”。 “ C”中的身份文件是“ B”上ssh密钥的路径。 ProxyCommand使用Netcat打开从“ B”到“ C”的连接。 Netcat(或nc)将需要安装在“ B”上。
注释1:要正常工作,您需要将B的身份文件(通常是〜/ .ssh / rd_isa)复制到A。通常,我会更改其名称为rd_isa_B。
注2:此解决方案也适用于scp。
希望对其他人有帮助。
评论
我说得太早了。该解决方案似乎无效。密钥已加载到ssh-agent中,因此我认为它可以正常工作。在上面,C的密钥仍然需要在A而不是B上。
–牧马人
2011年12月6日17:36
这是太棒了。正是我想要的-能够使用本地密钥通过跳转框进行代理(以避免中间密钥扩散)
–重新
20年5月1日,0:26
#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
评论
我认为添加密钥可以被视为幂等,从而消除了获取密钥列表的需要。
– dmourati
15年6月26日在15:15
您应该接受serverfault.com/a/701884/127993,它完全可以满足您的要求。
– sjas
16-09-20在18:14
#5 楼
#!/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/
#6 楼
要执行的操作: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。
#7 楼
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
上,我们将密钥添加到A
的SSH密钥到ssh-add
; 之所以有效,是因为我们使用
-o 'ForwardAgent yes'
转发了SSH代理。 /> ssh-add -t 1
表示我只希望将密钥添加到对最终主机C进行身份验证所需的1秒钟; 最后,
nc %h %p
在端口netcat
处启动到最终主机%h
的%p
连接(两者都将根据~/.ssh/config
文件中的信息由SSH填写。)如果需要在
B
上指定要使用的自定义密钥,则可以通过修改ssh-add
部分来实现: br /> 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'
评论
如果主机B和C使用不同的密钥文件,是否可以通过将两个密钥文件都放置在本地系统(主机A)中来完成
–cibin
20/12/13在11:15
评论
您是说要从A交换到B,然后从SSH交换到C吗?还是代理是真正的直通情况?我想通过B从A切换到C。下面的答案适用于通过部分,但它仍然尝试在本地计算机上而不是在通过主机B上查找IdentityFile。 >