塑形
要在单独的 github/bitbucket/whatever 帐户下管理 git repo,您只需生成一个新的 SSH 密钥。
但在我们开始使用您的第二个身份推送/拉取 repos 之前,我们必须让您适应 - 假设您的系统设置有典型的 id_rsa 和 id_rsa.pub 密钥对。现在你的tree ~/.ssh 看起来像这样
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── id_rsa
└── id_rsa.pub
首先,为该密钥对命名 - 添加一个描述性名称将帮助您记住哪个密钥用于哪个用户/远程
# change to your ~/.ssh directory
$ cd ~/.ssh
# rename the private key
$ mv id_rsa github-mainuser
# rename the public key
$ mv id_rsa.pub github-mainuser.pub
接下来,让我们 generate a new key pair - 这里我将新密钥命名为 github-otheruser
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser
现在,当我们查看 tree ~/.ssh 时,我们看到了
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── github-mainuser
├── github-mainuser.pub
├── github-otheruser
└── github-otheruser.pub
接下来,我们需要设置一个~/.ssh/config 文件来定义我们的关键配置。我们将使用proper owner-read/write-only permissions 来创建它
$ (umask 077; touch ~/.ssh/config)
用你喜欢的编辑器打开它,然后添加以下内容
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
大概,您将拥有一些与您的主要 github 身份相关联的现有存储库。因此,“默认”github.com Host 设置为使用您的 mainuser 密钥。如果您不想偏爱一个帐户而不是另一个帐户,我将向您展示如何更新系统上的现有存储库以使用更新的 ssh 配置。
将新的 SSH 密钥添加到 github
前往github.com/settings/keys 添加您的新公共密钥
您可以使用以下方式获取公钥内容:将其复制/粘贴到 github
$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...
现在您的新用户身份已全部设置完毕 - 下面我们将向您展示如何使用它。
完成任务:克隆存储库
那么这如何与 git 和 github 结合使用呢?好吧,因为你不能有没有鸡蛋的鸡,我们将看看克隆现有的回购。如果您的工作场所有一个新的 github 帐户并且您被添加到公司项目中,则这种情况可能适用于您。
假设github.com/someorg/somerepo 已经存在并且您已被添加到其中 - 克隆很简单
$ git clone <b>github.com-otheruser</b>:someorg/somerepo.git
粗体部分必须与我们在您的~/.ssh/config 文件中设置的Host 名称匹配。这将 git 正确连接到相应的 IdentityFile 并正确使用 github 对您进行身份验证
完成工作:创建新的存储库
好吧,因为你不能没有鸡蛋,所以我们会考虑在你的辅助帐户上发布一个新的回购。这种情况适用于使用辅助 github 帐户创建新内容的用户。
假设您已经在本地完成了一些工作,现在您可以推送到 github。如果你愿意,可以跟我一起来
$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init
现在配置这个 repo 使用你的identity
$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"
现在进行你的第一次提交
$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"
使用git log检查提交以查看您的新身份是否被使用
$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>
好的,是时候推送到 github 了!由于 github 还不知道我们的新仓库,请先转到 github.com/new 并创建您的新仓库 - 将其命名为 somerepo
现在,要将您的 repo 配置为使用正确的身份/凭据与 github “对话”,我们添加了一个远程。假设您的新帐户的 github 用户名是 someuser ...
$ git remote add origin <b>github.com-otheruser</b>:someuser/somerepo.git
粗体部分绝对关键,它必须与我们在您的~/.ssh/config文件中定义的Host相匹配
最后推送repo
$ git push origin master
更新现有存储库以使用新的 SSH 配置
假设您已经克隆了一些 repo,但现在您想使用新的 SSH 配置。在上面的示例中,我们通过将您以前的 id_rsa/id_rsa.pub 密钥对分配给您的 SSH 配置文件中的 Host github.com 来保持现有存储库的完整性。这没有什么问题,但我现在至少有 5 个 github 配置,我不喜欢将其中一个视为“默认”配置——我宁愿对每一个都明确。
在我们有这个之前
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
所以我们现在将其更新为(bold 中的更改)
Host github.com-mainuser
HostName github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
但是现在任何带有github.com 远程的现有仓库都不能使用这个身份文件。不过别担心,这很简单。
要更新任何现有存储库以使用新的 SSH 配置,请使用 set-url 更新存储库的远程源字段 -
$ cd existingrepo
$ git remote set-url origin github.com-mainuser:someuser/existingrepo.git
就是这样。现在你可以push/pull尽情享受
SSH 密钥文件权限
如果您的公钥无法正常工作,SSH 对您的file permissions 目录和相应的密钥文件允许的file permissions 非常严格
根据经验,任何目录都应该是700,任何文件都应该是600 - 这意味着它们是所有者只读/只写的——没有其他组/用户可以读/写它们
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub
我如何管理我的 SSH 密钥
我为我连接的每台主机管理单独的 SSH 密钥,这样如果任何一个密钥被泄露,我就不必在我使用过该密钥的所有其他地方更新密钥。这就像当您从 Adobe 收到通知说他们的 1.5 亿用户信息被盗时 - 现在您必须取消该信用卡并更新依赖它的所有服务 - 多么令人讨厌。
这是我的~/.ssh 目录的样子:我为每个用户都有一个.pem 密钥,位于我连接到的每个域的文件夹中。我使用.pem 键,所以每个键只需要 一个 文件。
$ tree ~/.ssh
/Users/myuser/.ssh
├── another.site
│ ├── myuser.pem
├── config
├── github.com
│ ├── myuser.pem
│ ├── someusername.pem
├── known_hosts
├── somedomain.com
│ ├── someuser.pem
└── someotherdomain.org
└── root.pem
这是我对应的 /.ssh/config 文件——显然 github 的内容与回答这个关于 github 的问题相关,但这个答案旨在让您掌握在任意数量的服务/机器上管理您的 ssh 身份的知识。
Host another.site
User muyuser
IdentityFile ~/.ssh/another.site/muyuser.pem
Host github.com-myuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/myuser.pem
Host github.com-someuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/someusername.pem
Host somedomain.com
HostName 162.10.20.30
User someuser
IdentityFile ~/.ssh/somedomain.com/someuser.pem
Host someotherdomain.org
User someuser
IdentityFile ~/.ssh/someotherdomain.org/root.pem
从 PEM 密钥获取 SSH 公钥
您注意到我只有 一个 文件用于每个键。当我需要提供公钥时,我只需根据需要生成它。
所以当 github 询问你的 ssh 公钥时,运行这个命令将公钥输出到 stdout——在需要的地方复制/粘贴
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...
注意,这也是我将密钥添加到任何远程计算机时使用的相同过程。 ssh-rsa AAAA... 值被复制到远程的~/.ssh/authorized_keys 文件中
将您的 id_rsa/id_rsa.pub 密钥对转换为 PEM 格式
所以你想驯服你的关键文件并减少一些文件系统的麻烦吗?将您的密钥对转换为 单个 PEM 很容易
$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem
或者,按照上面的示例,我们将id_rsa -> github-mainuser 和id_rsa.pub -> github-mainuser.pub 重命名——所以
$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem
现在只是为了确保我们已经正确转换了这个,您需要验证生成的公钥是否与您的旧公钥匹配
# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
现在您有了github-mainuser.pem 文件,您可以安全地删除旧的github-mainuser 和github-mainuser.pub 文件——只需要PEM 文件;只需在需要时生成公钥^_^
从头开始创建 PEM 密钥
您无需创建私钥/公钥对并然后转换为单个 PEM 密钥。您可以直接创建 PEM 密钥。
让我们创建一个newuser.pem
$ openssl genrsa -out ~/.ssh/newuser.pem 4096
获取SSH公钥是一样的
$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==