一种使用的可能性~/.ssh/config
是使用Match
限制而不是Host
限制。特别是Match Exec
调用shell命令来决定是否应用声明。在bash中,您可以使用以下命令:
[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]
这使用bash [
命令来验证两个字符串是否相等。在这种情况下,它正在测试字符串是否git@git.company.com:gitolite-admin
与从$(git config --get remote.origin.url)''
命令获得的输出匹配。
您可以使用任何其他命令来标识外壳程序所在的存储库。对于这个工作是重要的有$SHELL
变量定义你的shell,在我的情况/bin/bash
。完整的示例如下~/.ssh/config
:
Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/gitolite-admin
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/yourOwnPrivateKey
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
在此示例中,我假定其中~/.ssh/yourOwnPrivateKey
包含您自己的私钥,并且~/.ssh/gitolite-admin
包含用户的私钥gitolite-admin
。我加入了IdentitiesOnly yes
声明,以确保只有Mark Longair提到的git服务器提供了一个密钥。其他声明只是git的标准ssh选项。
如果some_repo
要使用不同的键来使用多个配置,则可以添加此配置。如果您有多个存储库,git@git.company.com
并且大多数都使用,~/.ssh/yourOwnPrivateKey
则将此密钥作为主机的默认值包含会更有意义。在这种情况下,~/.ssh/config
将是:
Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
IdentityFile ~/.ssh/gitolite-admin
IdentitiesOnly yes
Host git.company.com
IdentityFile ~/.ssh/yourOwnPrivateKey
IdentitiesOnly yes
ForwardAgent no
ForwardX11 no
ForwardX11Trusted no
请注意,顺序很重要,并且Host git.company.com
限制应出现在Match Exec
一个或多个之后。