~/.ssh/config 中的条件 ProxyCommand?

alt*_*alt 18 ssh

~/.ssh/config配置了各种主机,这些主机可以在我们公司的 VPN 上访问,也可以通过 SSH 代理服务器访问。

目前我只有

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server
Run Code Online (Sandbox Code Playgroud)

但是,如果我在内部网络中,我可以直接访问内部 ip,因此通过外部服务器进行代理只会增加连接延迟。

如果无法访问内部 ip,有没有办法可以临时代理,否则直接连接?

Zor*_*che 10

我通常设置这样的东西。它假定中间主机将能够解析名称。

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22
Run Code Online (Sandbox Code Playgroud)

所以我会连接到 like ssh blah%homeproxy

  • `%` 字符没有什么特别之处。你真的可以使用任何东西。使用百分比是因为它在主机名或用户名中无效。带有 ProxyCommand 的 `cut` 命令使用 `%` 作为分隔符来提取主机名。 (3认同)

小智 6

我使用 Match 使用不同的方法。就我而言,如果它正在运行,我想使用本地代理,如果没有,我想使用它。以下指令很好地完成了这一点:

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p
Run Code Online (Sandbox Code Playgroud)

它匹配每次 ssh 尝试,并执行快速检查nc以查看我的代理是否在 1086 上启动并运行(在这种情况下,nc退出时没有错误)。如果发生这种情况,它会设置 ProxyCommand。