我的 SSH 配置文件设置为使用Host *
部分中的特定 IdentityFile 作为默认密钥。对于某个特定主机,我想提供不同的密钥(并且只提供该密钥,而不是默认密钥)。
我的 ~/.ssh/config 文件如下所示:
Host specialhost
HostName specialhostname.mydomain.com
IdentityFile %d/.ssh/special-key
LogLevel debug
IdentitiesOnly yes
Host *
IdentityFile %d/.ssh/regular-key
IdentitiesOnly yes
无论我做什么,或无论配置文件中各部分的顺序如何,我的 SSH 客户端(OS X OpenSSH_6.2p2)都会首先提供“常规密钥”(服务器接受,但这不是我想要的)。
ssh_config 手册页说明了以下内容IdentityFile
:
可以在配置文件中指定多个身份文件;所有这些身份将按顺序尝试。
它所指的“顺序”对我来说并不清楚,因为部分中列出的 IdentityFileHost *
总是首先提供,即使“specialhost”列在它之前(如上例所示)。IdentitiesOnly
建议的技巧这里似乎只与 ssh-agent 提供的密钥相关。少数其他相似的问题尚未得到任何答案。
我想将常规密钥保留在该Host *
部分中,因为我将该密钥与数十个其他主机一起使用,并且我不想IdentityFile
在每个主机条目中重复。
有没有办法强制 SSH 仅提供“特殊密钥”仅使用 SSH 配置(并且无需将我的 IdentityFile 指令复制到其他所有主机)?我可以看到如何通过从部分中取出密钥Host *
、将它们添加到代理,然后用于IdentitiesOnly yes
specialhost 来实现这一点,但除非没有其他办法,否则我真的宁愿避免使用 ssh-agent。
答案1
一行Host
可以有多个模式。文档中并没有真正说明这一点,但模式开头的“!”(感叹号)表示“将此部分应用于不匹配模式”。换句话说,你可以这样做:
Host * !special1 !special2
IdentityFile etc...
并且它应该匹配除“special1”和“special2”之外的任何主机。
我认为模式的顺序并不重要。被检查的主机名必须匹配一个非感叹号模式,并且必须不匹配任何感叹号模式。