我正在寻找一种从本地计算机A通过代理B到目标主机C进行SSH的简单方法。与C上的公钥一起的私钥在B上,并且我无法将该密钥放在本地计算机上。有小费吗?

此外,我也希望能够使用〜/ .ssh / config来做到这一点。

谢谢!

评论

您是说要从A交换到B,然后从SSH交换到C吗?还是代理是真正的直通情况?

我想通过B从A切换到C。下面的答案适用于通过部分,但它仍然尝试在本地计算机上而不是在通过主机B上查找IdentityFile。 >

#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