SSH方式多帳號使用Github

最近閒得無聊註冊了一個新域名,順便弄了一大堆新帳號(Github、Twitter等),準備來一次完全的改頭換面。html

註冊新域名後第一件事就是弄了這個博客。註冊Github時發現一個SSH公鑰只能關聯一個Github帳號,使用https的話又要常常輸入密碼。因此只好Google搜索一下解決方案。順便在這裏留下總結,以便往後查看。git

SSH 配置

首先看一下SSH的配置文件 ~/.ssh/config 的格式:github

Host  alias                 # 該配置的匹配模式
  HostName        hostname  # 遠程主機名
  Port            port      # 遠程主機端口
  User            user      # 鏈接遠程主機的用戶名
  IdentityFile    key       # 改配置使用的密鑰
真實的SSH配置文件的屬性要比這個多得多,這裏只說幾個等下會用到的。更多的屬性能夠參考 這裏

<!-- more -->bash

其中:hexo

  • Host 屬性用於肯定什麼時候使用該配置,可以使用通配符,至關於一個別名
  • HostName 爲該配置的真實主機名,如過是 Github 的話則爲 github.com
  • Port 爲遠程主機的端口,默認爲 22
  • User 爲鏈接遠程主機的用戶名,在 Github 中爲 git
  • IdentityFile 爲該配置使用的密鑰文件

例如一個配置文件以下:ssh

Host  world
  HostName        world.com
  Port            2222
  User            hello
  IdentityFile    ~/.ssh/world

Host  bar
  HostName        bar.com
  User            foo
  IdentityFile    ~/.ssh/bar

若是在終端輸入post

ssh world

則至關於在終端輸入了命令行

ssh -p 2222 -i '~/.ssh/world' hello@world.com

如輸入code

ssh bar

則至關於輸入htm

ssh -i '~/.ssh/bar' foo@bar.com
這裏須要多個密鑰,能夠經過 ssh-keygen 命令來來生成:
# 在 `~/.ssh/` 目錄下生成私鑰 `world` 和公鑰 `world.pub`
ssh-keygen -t rsa -C "hello@world.com" -f ~/.ssh/world
# 期間會提示輸入密碼,可爲空

# 在 `~/.ssh/` 目錄下生成私鑰 `bar` 和公鑰 `bar.pub`
ssh-keygen -t rsa -C "foo@bar.com" -f ~/.ssh/bar

這樣一來,只要寫入多個配置,就能夠實現經過不一樣的別名來使用不一樣的密鑰去訪問一個遠程主機。從而就可經過爲不一樣的Github帳戶配置不一樣的別名來達到經過SSH方式在一臺主機上使用多個Github帳號。

爲Github編寫SSH配置文件

先來看一下github的倉庫地址: git@github.com:hardo/blog.git

咱們發現github倉庫地址的用戶名均爲 git, 主機名均爲 github.com, 每一個用戶的倉庫放在同名目錄中。

假如如今有兩個Github帳號 hellohardo

先爲這兩個帳號生成密鑰:

# 在 `~/.ssh/` 目錄下生成私鑰 `hello` 和公鑰 `hello.pub`
ssh-keygen -t rsa -C "hello@world.com" -f ~/.ssh/hello

# 在 `~/.ssh/` 目錄下生成私鑰 `hardo` 和公鑰 `hardo.pub`
ssh-keygen -t rsa -C "i@hardo.me" -f ~/.ssh/hardo

而後將 hello.pub 文件裏的內容複製到 Github 帳號 hello 的設置裏,將 hardo.pub 文件裏的內容複製到 hardo 的設置裏。

~/.ssh/config 文件裏輸入以下配置信息:

Host  hello.github.com
  HostName        github.com
  User            git
  IdentityFile    ~/.ssh/world

Host  hardo.github.com
  HostName        github.com
  User            git
  IdentityFile    ~/.ssh/bar

配置完成後,即可以使用不一樣的別名來區分不一樣的用戶:

# 使用 hello 用戶克隆 hello 的 test 倉庫
git clone git@hello.github.com:hello/test.git
# 其中前面的 git 用戶名能夠省略,
# 但爲了便於識別這裏仍是加上

# 使用 hello 用戶克隆 hardo 的 blog 倉庫
git clone git@hello.github.com:hardo/blog.git
# 如過沒有權限的話,將不可推送到默認源

# 使用 hardo 用戶克隆 hardo 的 blog 倉庫
git clone git@hardo.github.com:hardo/blog.git
雖然遠程用戶是沒問題了,但這裏還有一個本地用戶的問題。
若是設置了全局用戶名和郵箱地址,則不論向哪一個用戶克隆的倉庫commit代碼都將是全局的用戶郵箱所爲對應的用戶。這看起來會很奇怪,看起來是兩個用戶,一看commit信息倒是一個用戶。
咱們要作的是刪除Git的全局用戶配置,爲每一個倉庫單獨配置用戶。
或者將全局用戶配置爲一個用戶,而後爲另外一個用戶的全部倉庫添加單獨的本地用戶信息。
# 取消全局的用戶配置
git config --global --unset user.name
git config --global --unset user.email

# 進入一個倉庫
git clone git@hardo.github.com:hardo/blog.git
cd blog

# 爲倉庫單獨配置用戶
git config user.name 'hardo'
git config user.email 'i@hardo.me'

在 Hexo 中配置部署信息

本博客是用 Hexo 生成的,Hexo 很方便的一項功能就是一條命令行就能夠部署到Github pages。在 Hexo 的全局配置文件 _config.yml 中能夠配置:

deploy:
  type: git
  repo: git@hardo.github.com:hardo/blog.git
  branch: gh-pages

輸入 hexo deploy ,一切正常。可是去看 gh-pages 分支的commit信息,發現推送者是本地配置的全局用戶。配置文件裏可不以改本地用戶博主也不清楚,也懶得去查(懶癌晚期)。不過讓我在 博客倉庫 的根目錄裏發現了 .deploy_git 目錄,猜測應該是生成後的倉庫。因而去這個目錄下改了本地用戶信息:

cd .deploy_git
git config user.name 'hardo'
git config user.email 'i@hardo.me'

改完以後再從新部署,發現果真成功了!

固然,若是你沒有配置全局用戶的話,第一次部署會失敗。雖然失敗了,但仍是會生成 .deploy_git 目錄,進入該目錄改下配置而後再從新部署就好了。

如喜歡,請 Follow關注書籤 三連←_←

相關文章
相關標籤/搜索