ssh_config 匹配规则

ssh_config 匹配规则

我正在尝试建立连接到[电子邮件保护]通过 powershell 终端(配置位于 .ssh\config)没有代理,但是,我希望能够继续使用我的管理员用户连接到所有其他 pp 服务器,并将 internal.pp.com 保留在代理后面

我的 ssh 配置如下:

Host pp-d1*
        User ubuntu
        Port 22
        IdentityFile ~\.ssh\mykey
        SendEnv LS_*
        SendEnv TERM=screen
        ForwardAgent yes

Host pp-*
        User admin
        Port 22
        IdentityFile ~\.ssh\mykey
        SendEnv LS_*
        SendEnv TERM=screen
        ForwardAgent yes

Host *old-kernel.com *internal.pp.com
        User ubuntu
        Port 22
        IdentityFile ~\.ssh\mykey
        SendEnv LS_*
        SendEnv TERM=screen
        ForwardAgent yes
        ProxyCommand ssh proxy.internal.pp.com nc %h %p 2> /dev/null

问题是,从技术上讲我应该在规则 1 上获得匹配,但由于某种原因,我在规则 1 和规则 3 上获得了匹配,并且规则 3 占优,所以它想通过代理推动我。

以下是 ssh 调试:

PS C:\Users\peter> ssh pp-d1-gritz.pp.internal.com -vvv
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data C:\\Users\\peter/.ssh/config
debug1: C:\\Users\\peter/.ssh/config line 3: Applying options for pp-d1*
debug1: C:\\Users\\peter/.ssh/config line 11: Applying options for pp-*
debug2: add_identity_file: ignoring duplicate key C:\\Users\\peter\\.ssh\\mykey
debug1: C:\\Users\\peter/.ssh/config line 19: Applying options for *pp.internal.com
debug2: add_identity_file: ignoring duplicate key C:\\Users\\peter\\.ssh\\mykey
debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2
debug1: Executing proxy command: exec ssh proxy.internal.pp.com nc pp-d1-gritz.pp.internal.com 22 2> /dev/null
debug3: spawning "ssh proxy.internal.pp.com nc pp-d1-gritz.pp.internal.com 22 2> /dev/null"
debug3: spawning ssh proxy.internal.pp.com nc pp-d1-gritz.pp.internal.com 22 2> /dev/null
debug3: w32_getpeername ERROR: not sock :2
debug3: Failed to open file:C:/Users/peter/.ssh/mykey.pub error:2
debug1: identity file C:\\Users\\peter\\.ssh\\mykey type -1
debug3: Failed to open file:C:/Users/peter/.ssh/mykey-cert error:2
debug3: Failed to open file:C:/Users/peter/.ssh/mykey-cert.pub error:2
debug1: identity file C:\\Users\\peter\\.ssh\\mykey-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.1
Enter one-time-scratch code:

代码是代理提示(我不想要它,因为应该应用规则 1)。我做错了什么?

干杯,皮特

答案1

这种行为是正常的;设置来自全部匹配的部分会合并在一起,第一个设置实例具有优先权。(一般来说,不要将Host/视为单独的“部分”,而应将其视为单个大型配置,其中一些设置Match已过滤

由于第一个设置获胜,一个可能的解决方案是将其明确设置为默认值(例如,在这种情况下为“无”):

Host pp-d1*
    # no changes needed

Host pp-*
    ProxyCommand none

不相关的改进:我建议将其缩短为:

Host pp-d1*
    # no changes needed, will be handled by the pp-* setting

Host pp-*
    ProxyJump none

Host *old-kernel.com *internal.pp.com
    ProxyJump proxy.internal.pp.com

此外,由于所有匹配的“部分”都适用,这意味着您不必重复SendEnvPort重复所有内容 - 您可以Host *在最后的部分中拥有全局变量。

Host pp-d1*
    User ubuntu

Host pp-*
    User admin
    ProxyJump none

Host proxy.internal.pp.com
    ProxyJump none

Host *old-kernel.com *internal.pp.com
    User ubuntu
    IdentityFile ~\.ssh\mykey
    ForwardAgent yes
    ProxyJump proxy.internal.pp.com
    SendEnv TERM=screen

Host *
    SendEnv LS_*

答案2

您的主机与第三条规则pp-d1-gritz.pp.internal.com相匹配*internal.pp.com。因此,您可能会想,为什么在尝试连接到“内部”主机时不想使用“内部代理”。

为了解决这个问题,你可以将pp-*第三条规则扩展为

Host *old-kernel.com !pp-*,*internal.pp.com

答案3

为了pp-d1-gritz.pp.internal.com 两个都 Host pp-d1*(“规则 1”) 和Host *old-kernel.com *internal.pp.com(“规则 3”) 匹配。

man 5 ssh_config状态:

除非另有说明,对于每个参数,将使用第一个获得的值。

在您的例子中,第一个(也是唯一的)值ProxyCommand来自“规则 3”。如果您希望它来自“规则 1”,则需要将其包括ProxyCommand在内。

相关片段手册[重点是我的]:

设置该命令将none完全禁用此选项。

因此您需要ProxyCommand none在 下Host pp-d1*。然后,如果某个主机同时匹配“规则 1”和“规则 3”,ProxyCommand none则将应用“规则 1”。

或者重建您的规则,因此只有一个Host规范匹配pp-d1-gritz.pp.internal.com

相关内容