我在私有子网中有一台服务器,我想通过面向 Internet 的机器连接到该服务器。有一些教程。我用过这个:https ://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
它的问题是它假设我可以编辑~/.ssh/config
文件。但是,如果我在 CI 上运行代码,我宁愿使用存储库中附带的配置文件并使用-F
switch。在这种情况下,上述策略停止工作,因为ssh
使用的命令 asProxyCommand
不加载相同的配置文件并且不知道别名。我所做的是:
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
?
根据此 SuperUser entry,从版本 7.3p1 开始,有一个
Include
指令,因此您可以创建一个配置文件,其中包含您的“常规”配置,但包含所有ProxyCommand
条目。这样,如果您指定该文件,代理连接将起作用,如果您省略-F
开关,将读取默认配置,如下所示:~/.ssh/config
:~/.ssh/proxyconfig
:如果您有上述配置,则可以使用
到达“应用程序”服务器。
如果您无法将上述版本安装到您的客户端计算机,您可以
ProxyCommand
在命令行中指定,而不需要单独的配置文件,如下所示:由于每次都编写整个命令有点不舒服,您可能希望为命令创建一个别名,或者 - 如果您想通过代理访问更多计算机 - 一个函数,如下所示:
并像使用它一样
对于您不再需要的代理主机
ProxyCommand
。有一个新选项ProxyJump
,它可以做同样的事情,而不需要另一个ssh
配置。它将在内部发出相同的命令,但如果提供了参数,它也会传递-F
:此功能从OpenSSH 7.3开始可用。
~/.ssh/config
您可以通过使用ProxyCommand
作为参数来执行此操作而无需进行编辑。从OpenSSH 5.4 (2010-03-08) 开始出现“netcat 模式”:
因此可以:
对于历史版本,您可以使用 external
nc
(来自 Vivek Gite 的SSH ProxyCommand 文章):在哪里
firewall
是面向 Internet 的服务器。10.0.2.40
是本地网络上的服务器。nc
) 用于在本地网络上的服务器之间设置和建立 TCP 管道。