日常的工作生活中,我们可能会遇到不止一个 github/gitlab 服务器。虽然 ssh key 可以避免每次和服务器交互的时候都要输入密码,但是如果我想区分工作和生活的 ssh key 又该怎么做呢?其实只需要一个简单的 config 文件就可以了。

1.检查是否已经存在 sshkey

cd ~/.ssh #进入到user家目录的.ssh目录下
ls #列出文件

如果可以看到类似 id_rsa.pub id_dsa.pub 文件,可以跳过第二步创建。

2.创建SSH Key

  • 执行命令:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • 代码参数含义:

    • -t 指定密钥类型,默认是 rsa ,可以省略。

    • -b 制定秘钥长度,一般 2048 就够了,这里设置为 4096 。

    • -C 设置注释文字,比如邮箱。

    • -f 指定密钥文件存储文件名。

      以上代码省略了 -f 参数,因此,运行上面那条命令后会让你输入一个文件名,用于保存刚才生成的 SSH key 代码,如:

      Generating public/private rsa key pair.
      # Enter file in which to save the key (/c/Users/you/.ssh/id_rsa):

      当然,你也可以不输入文件名,直接回车使用默认文件名,那么就会生成 id_rsaid_rsa.pub 两个秘钥文件。

3. 使用 config 管理多个 host 的 sshkey

如果你需要在多个git host工作,就需要多个ssh key去支持,就需要在上面手动输入密钥文件的文件名了。(比如 id_rsa_github) 然后使用config文件来实现管理。

  • 先创建一个config文件(目录:~/.ssh/config),里面的内容和格式参考下面的示例:

    host mygitlab # 用来区分不同的host,可以随意起
    Hostname mygitlab # 需要访问的 host 的域名或者IP地址
    User myusername # 这里是ssh登录使用的用户名
    IdentityFile ~/.ssh/id_rsa # 生成的密钥文件路径
    Host gitlab.com
    Hostname altssh.gitlab.com
    User git
    Port 443
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_gitlab
    host github
    HostName ssh.github.com
    User git
    Port 443 # ssh协议默认是22端口,但是可以使用443端口,走HTTPS更安全(需要服务器支持)。
    IdentityFile ~/.ssh/id_rsa_github
  • 接着又会提示你输入两次密码(该密码是你push文件的时候要输入的密码)

    当然,你也可以不输入密码,直接按回车。那么push的时候就不需要输入密码,直接提交。

    Enter passphrase (empty for no passphrase):
    # Enter same passphrase again:

4.添加到 gitlab/github 上去

  • 首先你需要拷贝 id_rsa.pub 文件的内容,你可以用编辑器打开文件复制,也可以用git命令复制该文件的内容,如:

    clip < ~/.ssh/id_rsa.pub
  • 进入到 gitlab/github 的用户设置页面。然后点击菜单栏的 SSH key 进入页面添加 SSH key。

  • 把你复制的 SSH key 代码粘贴到 key 所对应的输入框中,记得 SSH key 代码的前后不要留有空格或者回车。

5.测试

  • gitlab 上可以使用下面的命令测试:

    ssh -T git@mygitlab
    # 成功的话会有一句 `Welcome to GitLab, xxx!`
  • github 的host可以使用下面的命令测试:

    ssh -T git@github.com
    # 成功的话能看到 `Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.`

6. 确定 ssh-agent 在运行

  • 通过执行先的命令确定 ssh-agent 正在运行
# start the ssh-agent in the background
$ eval $(ssh-agent -s)
> Agent pid xxxx
  • 把新建的私钥加入到 ssh-agent
ssh-add ~/.ssh/id_rsa