使用别名和“-F”进行 SSH 跳转

使用别名和“-F”进行 SSH 跳转

我在私有子网中有一个服务器,我想通过一台面向互联网的机器连接到该服务器。有一些关于此的教程。我用的是这个:https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/

问题在于它假设我可以编辑~/.ssh/config文件。但是,如果我在 CI 上运行代码,我宁愿使用存储库中提供的配置文件并使用-Fswitch。在这种情况下,上述策略将停止工作,因为ssh使用的命令ProxyCommand不会加载相同的配置文件并且不知道别名。我所做的是:

Host ansible                                                                    
  User ubuntu                                                                   
  Hostname xxx.compute.amazonaws.com                  

Host app                                                                        
  User ubuntu                                                                   
  Hostname 10.0.2.40                                                            
  ProxyCommand ssh -F test-ssh.cfg -W %h:%p ansible

这可行,但有点麻烦,因为我需要将文件名放入文件本身,如果有人更改文件名,它就会中断。所以我的问题是:有没有更简洁的方法来创建带有别名的配置文件,并且可以与ProxyCommand一起使用-F

答案1

根据此超级用户条目从版本 7.3p1 开始,有一个Include指令,因此您可以创建一个包含“常规”配置但包含所有ProxyCommand条目的配置文件。这样,如果您指定该文件,代理连接将起作用,如果您省略开关-F,则将读取默认配置,如下所示:

~/.ssh/config

Host ansible
  User ubuntu
  Hostname xxx.compute.amazonaws.com

~/.ssh/proxyconfig

Include config

Host app
  User ubuntu
  Hostname 10.0.2.40
  ProxyCommand ssh -W %h:%p ansible

如果你有上述配置,你可以使用

ssh -F proxyconfig app

到达“应用程序”服务器。

如果您无法将上述版本安装到您​​的客户端计算机,您可以ProxyCommand在命令行中指定,而不需要单独的配置文件,如下所示:

ssh -o ProxyCommand='ssh -W %h:%p ansible' app

由于每次都编写整个命令有点不舒服,您可能需要为该命令创建一个别名,或者 - 如果您想通过代理访问更多计算机 - 请使用如下函数:

function proxyssh {
    # The first argument is the 'stepping stone',
    # the second is the target to ssh into
    ssh -o proxyCommand="ssh -W %h:%p $1" $2
}

并像使用它一样

proxyssh ansible app

答案2

对于代理主机,您不再需要ProxyCommand。有一个新的选项ProxyJump,它可以执行相同的操作,而无需另一个ssh配置。它将在内部发出相同的命令,但它也会-F如果有提供则传递参数

Host ansible                                                                    
  User ubuntu                                                                   
  Hostname xxx.compute.amazonaws.com                  

Host app                                                                        
  User ubuntu                                                                   
  Hostname 10.0.2.40                                                            
  ProxyJump ansible

此功能自以下日期起可用:OpenSSH 7.3

答案3

您可以~/.ssh/config使用ProxyCommand作为参数来执行此操作而无需进行编辑。

OpenSSH 5.4(2010-03-08) 出现了“netcat 模式”:

  • 为 ssh(1) 添加了“netcat 模式”:ssh -W host:port ...这将客户端上的 stdio 连接到服务器上的单个端口转发。例如,这允许使用 ssh 作为ProxyCommand通过中间服务器路由连接。bz#1618

因此可以:

ssh -o ProxyCommand="ssh -W %h:%p firewall" [email protected]

对于历史版本,您可以使用外部nc(来自SSH ProxyCommand 文章作者:Vivek Gite):

ssh -o ProxyCommand='ssh user@firewall nc 10.0.2.40 22' [email protected]

在哪里

  • firewall是面向互联网的服务器。
  • 10.0.2.40是本地网络上的服务器。
  • netcat ( nc) 用于在本地网络上的服务器之间设置和建立 TCP 管道。

相关内容