我正在尝试建立连接到[电子邮件保护]通过 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
此外,由于所有匹配的“部分”都适用,这意味着您不必重复SendEnv
或Port
重复所有内容 - 您可以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”) 匹配。
除非另有说明,对于每个参数,将使用第一个获得的值。
在您的例子中,第一个(也是唯一的)值ProxyCommand
来自“规则 3”。如果您希望它来自“规则 1”,则需要将其包括ProxyCommand
在内。
相关片段手册[重点是我的]:
设置该命令将
none
完全禁用此选项。
因此您需要ProxyCommand none
在 下Host pp-d1*
。然后,如果某个主机同时匹配“规则 1”和“规则 3”,ProxyCommand none
则将应用“规则 1”。
或者重建您的规则,因此只有一个Host
规范匹配pp-d1-gritz.pp.internal.com
。