GitHub 配置 SSH 连接

协议

Git 可以使用的 4 种协议

  1. HTTP 协议
  2. SSH
  3. 本地协议
  4. Git 协议

普遍使用的则是 HTTP 和 SSH,说一说这两种方式的优缺点。

HTTP

优点

  • 相同 URL(同一个 URL,仓库地址、clone 和 push 都是相同地址 例如: GitHub 上的仓库)
  • 使用简单(只在需要授权时提示输入用户名/密码)
  • 既可以设置无授权匿名服务,也可以传输时授权和加密

缺点

  • 架设 HTTP/S 协议会比 SSH 麻烦一些
  • 授权比较麻烦(需要频繁输入账号密码,当然 Git 也提供有缓存功能)

SSH

优点

  • 普遍(大多数服务器已支持 SSH 访问,即使没有也很容易架设)
  • 安全(数据传输要经过授权和加密)
  • 高效(传输尽量压缩数据)

缺点

  • 不能匿名访问,不利于开源项目(即便只要读取数据,也要有通过 SSH 访问主机的权限)

使用 SSH

SSH 密钥可以让用户无需输入密码即可登录到 SSH 服务器中。SSH 密钥总是成对出现(公钥和私钥)

使用流程

  1. 生成密钥对
  2. 将生成的公钥添加到服务器
  3. 测试连接

SSH 连接的时候,远程服务器向用户发送一段随机字符串,用户使用对应的私钥加密后,再发送到远程主机。
远程主机使用公钥进行解密,如果成功证明用户是可信的。这一过程不需要用户手动操作。

生成密钥对

1
$ ssh-keygen

选项

  • -t 可选 指定加密算法,默认 RSA
  • -b 可选 生成密钥长度
  • -C 可选 添加密钥对的说明(你可以随便输入内容)
  • -f 可选 指定生成私钥文件名,不使用 -f 会在创建过程中会提示用户输入
  • -P 可选 指定 passphrase 使用私钥时的密码 passphrase 至少 5 个字符
  • -p 可选 修改 passphrase

私钥默认名称为 id_ + 算法名称
私钥对应的公钥名称为 私钥文件名 + .pub

ssh-keygen 不添加任何选项生成过程中
第一次提示用户输入是保存密钥的文件名,直接回车使用默认值。
第二次提示用户输入 passphrase ,passphrase 是一个密码(使用私钥时的密码,使用后会在每次 pull、push 等操作中验证 passphrase)不使用可直接回车。
第三次提示用书再次输入 passphrase。
完成后 ~/.ssh 目录下会多出两个文件 id_rsaid_rsa.pub

将生成的公钥添加到服务器

GitHub: Settings > SSH and GPG keys > New SSH key
将上一步生成的 .pub 的公钥内容复制到 Key 中,Title 随便填,添加即可。

测试连接

公钥添加到 GitHub,可以使用 SSH 测试 GItHub 连接,没有问题会输出欢迎语句。

1
2
$ ssh -T git@github.com
Hi jingchaocheng! You've successfully authenticated, but GitHub does not provide shell access.

如果出现了下面的问题 (了解更多

1
2
$ ssh -T git@github.com
ssh: connect to host github.com port 22: Connection timed out
1
2
3
4
5
6
7
$ git clone git@github.com:jingchaocheng/git.git
Cloning into 'git'...
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解决方法
~/.ssh/ 目录下 config(如果没有新建一个)文件中添加下面内容后,再次测试链接。

1
2
3
Host github.com
Hostname ssh.github.com
Port 443

同一设备多个 Git 托管服务

场景:公司内工作开发使用 GitLab,自己瞎折腾用的 GitHub、Gitee(即便每个平台注册的邮箱号不同也可以)。

使用方法:将之前生成的公钥添加到各个 Git 托管服务中即可。

需注意各个平台上的用户名和邮箱是否和本地的 git config 中的内容一致,如需修改参考下面的配置用户信息。

同一设备两个 GitHub 账号

场景:有两个不同的 GitHub 账号,想在同一台电脑上使用。(同理可解决 两个 GitLab 账号、两个 Gitee 账号问题在同一设备使用的问题)。

公钥在同一个托管平台上具有唯一性,所以同一平台的多个账号不能使用同一公钥,这种情况需要生成多个密钥使用,每个账号对应一个密钥对。

在同一个平台上多个账号添加同一个公钥的错误提示

GitHub

Gitee

再次生成一对密钥

1
ssh-keygen -f 996

这个时候 ssh 目录下应该有两对密钥 4 个文件
新建 config 文件,添加以下内容

1
2
3
4
5
6
7
8
9
# 使用 id_rsa 密钥的
Host github.com
Hostname ssh.github.com
IdentityFile ~/.ssh/id_rsa

# 使用 996 密钥的
Host 996
Hostname sss.github.com
IdentityFile ~/.ssh/996

每个配置区段使用 Host 来区分, IdentityFile 指定私钥文件路径

将两个公钥的内容分别添加到两个账号的 SSH keys

使用 config 文件中第一个 Host 配置时和之前一样。

1
git clone git@github.com:jingchaocheng/git.git

使用 config 文件中使用第二个 Host 配置

1
2
3
4
git clone git@996:996-vip/git.git
# 并非原来的 git@github.com:996-vip/git.git
# 需要将 github.com 修改成 第二个 host 配置的 996(可以自定义这个名字,一致就行)
# 996-vip 为 GitHub 用户名

这样就完成了在同一设备同时使用两个 GitHub 账号的设置,记得配置 clone 仓库的用户信息。两个账号的用户信息必定不相同。

配置用户信息

Git 配置文件存储在三个不同位置,有相同配置时下级覆盖上级。

示例

1
2
3
4
5
6
7
# 当前用户
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"

# 当前仓库
git config --local user.name "你的用户名"
git config --local user.email "你的邮箱"

每一次 Git 的提交都会使用这些信息,并写入到每一次提交中。提交记录中的 Author 就是取的配置文件中的 user.nameuesr.email。所以都修改成当前仓库的 git config 的用户名和邮箱与目标托管平台中的用户名和邮箱一致即可。

参考链接 🔗