我在 Unfuddle 上有一个个人帐户和一个公司帐户。在 Unfuddle 上,SSH 密钥只能在一个帐户上使用,因此我需要在笔记本电脑上为这两个帐户创建单独的 SSH 密钥。我运行ssh-keygen -t rsa
生成了两个具有不同名称的密钥(个人是默认名称,公司是 {company}_rsa)。现在的问题是,似乎我的默认密钥到处都在使用,我找不到如何在 Git 中为单个存储库指定密钥。
所以我的问题是:如何指定在 repo-to-repo 基础上使用的 SSH 密钥?
我设置了我的 ssh_config (~/.ssh/config),但它似乎仍然不起作用。
配置:
Host {personalaccount}.unfuddle.com
HostName {personalaccount}.unfuddle.com
User git
IdentityFile /Users/dave/.ssh/id_rsa
Host {companyaccount}.unfuddle.com
HostName {companyaccount}.unfuddle.com
User git
IdentityFile /Users/dave/.ssh/cage_rsa
我公司 unfuddle 帐户上的 repo 的 Git repo 配置文件如下所示:
[remote "origin"]
url = git@{companyaccount}.unfuddle.com:{companyaccount}/overall.git
fetch = +refs/heads/*:refs/remotes/origin/*
所以我不确定我的 ssh 配置或 git 配置是否有问题。
答案1
如果你有一个活跃ssh 代理加载了你的id_rsa
密钥,那么问题很可能是远程控制首先提供该密钥。Unfuddle 可能会接受它进行身份验证(例如sshd),但拒绝授权访问公司存储库(例如,在他们用于授权的任何内部软件中,可能是类似于 Gitolite 的东西)。也许有一种方法可以将您的个人密钥添加到公司帐户(多个人不会共享相同的corp_rsa
公钥和私钥文件,是吗?)。
配置IdentitiesOnly
.ssh/config
关键字可用于限制远程控制提供给远程sshd仅使用关键字指定的关键字IdentityFile
(即它将拒绝使用任何恰好加载到活动ssh 代理)。
尝试以下.ssh/config
部分:
Host {personalaccount}.unfuddle.com
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
Host {companyaccount}.unfuddle.com
IdentityFile ~/.ssh/{companyaccount}_rsa
IdentitiesOnly yes
然后,使用如下 Git URL:
git@{personalaccount}.unfuddle.com:{personalaccount}/my-stuff.git
git@{companyaccount}.unfuddle.com:{companyaccount}/their-stuff.git
如果您想充分利用该.ssh/config
机制,您可以提供自己的自定义主机名并更改默认用户名:
Host uf-mine
HostName {personalaccount}.unfuddle.com
User git
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
Host uf-comp
HostName {companyaccount}.unfuddle.com
User git
IdentityFile ~/.ssh/{companyaccount}_rsa
IdentitiesOnly yes
然后,使用如下 Git URL:
uf-mine:{personalaccount}/my-stuff.git
uf-comp:{companyaccount}/their-stuff.git
答案2
IdentityFile 和 IdentitiesOnly 运行良好。让我烦恼的是必须记住使用不同的主机名进行连接,而且转发的代理连接仍然保存所有密钥,这意味着如果远程主机受到攻击,他们可以在我登录时使用我的任何身份。
我最近开始使用:
https://github.com/ccontavalli/ssh-ident
它是 ssh 的包装器,它:
- 为您定义的每个身份保留一个完全独立的代理。
- 自动在登录会话之间共享代理,无需在 .bashrc 中进行任何操作。
- 第一次需要时按需加载代理和相应的密钥。
- 根据 ssh 命令行(主机名等)或当前工作目录确定使用哪个代理。这特别方便,因为我倾向于根据正在做的事情从不同的路径工作。
答案3
man ssh_config
就像是
Host personal_repo
User personal
IdentityFile .ssh/personal_rsa
Host company_repo
User company
IdentityFile .ssh/company_rsa
并personal_repo
在你的 git repo 中用作主机。
答案4
如果您想使用 ssh 代理,以下是正确的方法:
# Create public keys to make sure they exist
# this is a must if you use ssh agent forwarding
# or want to use ssh-agent at all
ssh-add -L | grep personal > ~/.ssh/personal_identity.pub
ssh-add -L | grep company > ~/.ssh/company_identity.pub
# Add to ~/.ssh/config
Host {personalaccount}.unfuddle.com
IdentityFile ~/.ssh/personal_identity.pub
Host {companyaccount}.unfuddle.com
IdentityFile ~/.ssh/company_identity.pub
解释:如果您的 ~/.ssh 目录中有私钥,则不会使用 ssh-agent。因此,我们用另一个名称创建公钥,这样 ssh 就被迫使用 ssh-agent。如果您无权访问私钥(例如 ssh 代理转发),这也会有所帮助