SSH方式多賬號使用Github

Hardo發表於2018-04-03

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

註冊新域名後第一件事就是弄了這個部落格。註冊Github時發現一個SSH公鑰只能關聯一個Github賬號,使用https的話又要經常輸入密碼。所以只好Google搜尋一下解決方案。順便在這裡留下總結,以便日後檢視。

SSH 配置

首先看一下SSH的配置檔案 ~/.ssh/config 的格式:

Host  alias                 # 該配置的匹配模式
  HostName        hostname  # 遠端主機名
  Port            port      # 遠端主機埠
  User            user      # 連線遠端主機的使用者名稱
  IdentityFile    key       # 改配置使用的金鑰

真實的SSH配置檔案的屬性要比這個多得多,這裡只說幾個等下會用到的。更多的屬性可以參考 這裡

<!– more –>

其中:

  • Host 屬性用於確定何時使用該配置,可使用萬用字元,相當於一個別名
  • HostName 為該配置的真實主機名,如過是 Github 的話則為 github.com
  • Port 為遠端主機的埠,預設為 22
  • User 為連線遠端主機的使用者名稱,在 Github 中為 git
  • IdentityFile 為該配置使用的金鑰檔案

例如一個配置檔案如下:

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

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

如果在終端輸入

ssh world

則相當於在終端輸入了

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

如輸入

ssh bar

則相當於輸入

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關注書籤 三連←_←

相關文章