我有一个~/.ssh/config
运行良好的文件。它的格式如下:
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 5000
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
(它有更多域,但现在我们先忽略它们)
它运行完美,即使手册上说更具体的主机模式应该放在最上面,它总是这样运行良好。我总是 ssh 到这两个域,并且正确的身份密钥被很好地拾取。我从来没有遇到过将空密钥尝试到这两个域的问题。而且我用了好几年。总是得到正确的用户和密钥。我在 debian、fedora 和 osx 上都使用了相同的配置文件。
今天,在 osx 10.10 (OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011) 上,之前可以正常工作,我尝试在顶部添加User unkown
规则*
。突然间,现在每次我尝试 ssh 时,ssh 都会发送 user=unkown 和identityfile=id_null,导致无法登录任何地方。这让我去阅读 ssh_config 的手册页,并严格按照书上说的做... 但仍然无法正常工作。我还尝试删除条目,User
但*
问题没有解决。
我当前的.ssh/config
文件是
Host exact.hostname.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 50
当 i 时,它仍会尝试使用 id_null 作为身份文件ssh exact.hostname.domain.com
。我还尝试使用多个模式,而不是Host *.domain.com exact.hostname.domain.com
重复。没有任何效果。有什么想法吗?
我如何才能在每个域的基础上设置默认值并覆盖它们User
?IdentityFile
编辑 1:我Host exact.hostname.domain.com
在之前和之后都添加了*
。并ssh -vvv
显示:
debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
debug1: /Users/.../.ssh/config line 19: Applying options for *
debug1: /Users/.../.ssh/config line 37: Applying options for exact.hostname.domain.com
但我最终还是得到了no such identity: .ssh/id_null: No such file or directory
编辑2:我看到的一些其他奇怪的东西ssh -vvv
它总是尝试使用我拥有的所有密钥。因此,我认为它可能有一些硬编码的默认值.ssh/id_rsa*
,因此我将我的所有私钥移至以.ssh/keys/
隐藏该默认值,并更新了特定Host
条目...结果,它正在尝试所有主机条目中的密钥!即使是没有匹配的!
回顾一下,我在文件的顶部和底部有一个特定的主机匹配(只是为了安全),然后是不匹配的主机和一个*
。
但 ssh -vvv 显示:
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /Users/x/.ssh/keys/id_rsa_git (0x7f954b700530),
debug2: key: /Users/x/.ssh/keys/id_rsa (0x7f954b415700), explicit
debug2: key: /Users/x/.ssh/id_null (0x0), explicit
.ssh/keys/id_rsa_git
如果这是IdentityFile
下面唯一提到的,那么它究竟为什么要添加Host github.com
?为什么它最终会尝试发送,id_null
即使它Host exact.hostname.domain.com
与调试输出中所说的显式匹配debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
?
编辑3:
在我将所有密钥移至.ssh/keys/*
并仅为其中的每个主机指定密钥后ssh_config
,现在我在每个ssh
实例上都能看到:
/Users/me/.ssh/id_*[^p][^u][^b]: No such file or directory
但即便如此,仍然从以下位置加载 IdentityFiles其他连接时在 ssh_config 中检查主机。为什么?!
答案1
man ssh-config
说:
由于使用了每个参数的第一个获得的值,因此应在文件开头附近给出更多特定于主机的声明,并在末尾给出一般默认值。
因此,请确保您想要的配置位于第一个匹配的Host
条目中,如匹配的行所示ssh -vv
:Applying options for
。
在一般情况下,这意味着Host *
应该最后的。