我遇到过需要使用两个不同的 SSH 密钥访问同一个 SSH 主机 (GitHub) 的情况。这没有问题,我可以通过别名主机名轻松设置它。当此配置与我的 SSH 多路复用配置结合使用时,问题就出现了。我似乎无法使用特定于主机的声明覆盖我的默认 ControlPath。
也许这就是它的工作方式?也许是一个错误?我做错了什么吗?
顺便说一下,我使用的是 Mac 10.7。
这是我的配置:
Host *
ControlMaster auto
ControlPath ~/.ssh/connections/ssh-%r@%h:%p
Host github.com-X
TCPKeepAlive yes
ServerAliveInterval 60
ControlPersist 1h
Hostname github.com
User git
IdentityFile ~/.ssh/id_rsa_X
IdentitiesOnly yes
ControlPath ~/.ssh/connections/ssh-%r@%h-X:%p
Host github.com
TCPKeepAlive yes
ServerAliveInterval 60
ControlPersist 1h
我进行了一些修改,但似乎我总是得到 Host * 声明中指定的 ControlPath。
ssh -T [email protected]
使用 id_rsa_X 以正确的用户身份登录,但它在此处创建域套接字:
~/.ssh/connections/[email protected]:22
而不是:
~/.ssh/connections/[email protected]:22
因此,稍后当我尝试使用 id_rsa 发出 SSH 命令时,由于连接多路复用,我获得了 id_rsa_X 用户。换句话说:
ssh -T [email protected]
向我发送密钥为 id_rsa_X 的用户问候消息。
有任何想法吗?
编辑:对 vgoff 的评论的回复——不,它似乎正在读取我的所有配置……
$ ssh -vT [email protected]
OpenSSH_5.6p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/<username>/.ssh/config
debug1: Applying options for *
debug1: Applying options for github.com-X
debug1: Reading configuration data /etc/ssh_config
debug1: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/<username>/.ssh/connections/[email protected]:22" does not exist
<snip>
您可以看到它读取了所有设置并尝试使用错误的 ControlPath。
答案1
您需要将不太具体的选项移到 中~/.ssh/config
。这些Host *
选项将首先应用,并且不会被后面的冲突选项覆盖,即使它们更具体。但是,未指定的新选项Host *
将被应用,我认为这就是您在日志中看到的内容。
来源:http://linux.die.net/man/5/ssh_config
ssh(1) 按以下顺序从以下来源获取配置数据:
- 命令行选项
- 用户的配置文件(~/.ssh/config)
- 系统范围的配置文件(/etc/ssh/ssh_config)
对于每个参数,将使用第一个获得的值。配置文件包含由“主机”规范分隔的部分,并且该部分仅适用于与规范中给出的模式之一匹配的主机。匹配的主机名是命令行中给出的主机名。
由于使用每个参数的第一个获得的值,应在文件开头附近给出更多特定于主机的声明,并在结尾处给出一般默认值。