我如何强制 SSH 忽略某个特定主机的“Host *”中列出的 IdentityFile?

我如何强制 SSH 忽略某个特定主机的“Host *”中列出的 IdentityFile?

我的 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 yesspecialhost 来实现这一点,但除非没有其他办法,否则我真的宁愿避免使用 ssh-agent。

答案1

一行Host可以有多个模式。文档中并没有真正说明这一点,但模式开头的“!”(感叹号)表示“将此部分应用于匹配模式”。换句话说,你可以这样做:

Host * !special1 !special2
IdentityFile etc...

并且它应该匹配除“special1”和“special2”之外的任何主机。

我认为模式的顺序并不重要。被检查的主机名必须匹配一个非感叹号模式,并且必须不匹配任何感叹号模式。

相关内容