配置多個git賬號的ssh金鑰

xiaoxi666發表於2018-11-17

背景

我們在工作中會以 ssh 的方式配置公司的 git 賬號,但是平時也會使用 github 管理自己的專案。出於各種原因,自己的 github 專案無法使用公司的 git 賬號,於是我們可以為自己的 github 建立一個新的 git 賬號,這就需要生成新的 ssh 金鑰。 下面總結了建立多個互相獨立的 ssh 金鑰的步驟(以公司的和自己 github 的為例)。

步驟(以mac為例)

  1. 在資料夾 ~/.ssh/ 下建立兩個資料夾,分別為 company/github/,前者存放公司的 ssh金鑰,後者存自己github 的 ssh 金鑰。下面的步驟以建立 github 金鑰為例:

  2. 在終端執行命令:ssh-keygen -t rsa -C "your_github_email@example.com"

  3. 然後會提示 Enter file in which to save the key,輸入檔案路徑 ~/.ssh/github/id_rsa_github,最後就會在該路徑下生成 id_rsa_githubid_rsa_github.pub 兩個檔案(若直接回車的話,會儲存在~/.ssh/資料夾中)。

  4. 然後出現 Enter passphrase (empty for no passphrase),直接回車即可。

  5. 最後會出現建立成功的提示:

    Your identification has been saved in .ssh_github/id_rsa_github.
    Your public key has been saved in .ssh_github/id_rsa_github.pub.
    複製程式碼
  6. 檔案id_rsa_github.pub中儲存的就是 ssh 公鑰。可以利用命令 pbcopy 將其複製到剪貼簿,比如我的命令就是 pbcopy < ~/.ssh/github/id_rsa_github.pub。當然你也可以找到該檔案手動複製。

  7. 在 github 網站中新增該 ssh 公鑰。

  8. 建立公司 ssh 金鑰 的過程類似,不再贅述。

  9. 兩個 ssh 金鑰建立完畢後,在~/.ssh/資料夾中建立檔案config,新增如下內容:

    # The git info for company
    Host git.XXX.com				# git別名,寫公司的git名字即可
    HostName git.XXX.com				# git名字,同樣寫公司的git名字
    User git					# 寫 git 即可
    IdentityFile ~/.ssh/company/id_rsa	        #私鑰路徑,若寫錯會連線失敗
    
    # The git info for github			
    Host github.com					# git別名,寫github的git名字即可
    HostName github.com			        # git名字,同樣寫github的git名字
    User git					# 寫 git 即可
    IdentityFile ~/.ssh/github/id_rsa_github	#私鑰路徑,若寫錯會連線失敗
    複製程式碼

    注:配置檔案中各引數含義請參見擴充套件部分

  10. 網上很多文章說要執行命令 ssh-add 將 IdentityFile 新增到 ssh-agent中,具體到本文中就是執行 ssh-add ~/.ssh/company/id_rsassh-add ~/.ssh/github/id_rsa_github其實這個操作只是把專用金鑰新增到 ssh-agent 的快取記憶體中,因此略過該步驟也不會有影響。

  11. 這一步用於驗證是否配置成功,以 github 為例,輸入 ssh -T git@github.com,若出現

    Hi xiaoxi666! You've successfully authenticated, but GitHub does not provide shell access.
    複製程式碼

    這樣的欄位,即說明配置成功。公司的同理。

總結

本文描述了單機配置兩個 git 平臺ssh金鑰的方法,多個賬號同理。推薦在 ~/.ssh/ 資料夾下為不同的平臺建立不同的資料夾,方便管理。根據上述配置,我的 ~/.ssh/ 資料夾下是這樣子的:

├── company
│   ├── id_rsa
│   └── id_rsa.pub
├── config
├── github
│   ├── id_rsa_github
│   └── id_rsa_github.pub
複製程式碼

擴充套件

關於配置檔案 config

  1. 配置檔案的位置:上面我們在 ~/.ssh/ 資料夾下建立配置檔案,其實也可以指定位置,具體可查閱 ssh幫助手冊(man 1 ssh)。

    -F configfile
         Specifies an alternative per-user configuration file.  If a configuration file is given on the command line, the system-wide configuration file (/etc/ssh/ssh_config) will be ignored.  The default for the per-user configuration file is ~/.ssh/config.
    複製程式碼
  2. Host 別名:可以隨意指定,比如你把 github 的 Host 別名設定為 banana,那你在測試的時候也可以輸入ssh -T banana,以後 clone 專案時也可以用 banana 代替 github.com

  3. User: 注意它和 git 中的 user.name 不是一個概念。

    • 配置檔案中的 User 是登入提供 git 服務的平臺(如這裡的 github)的伺服器主機時指定的使用者名稱,比如 github 中 clone 專案時選擇 ssh,連結均以 git@github.com開頭,@ 前面的 git 就是 github 對應伺服器主機中的一個使用者名稱,即上面設定的 User,@ 後面的 github.com 就是 HostName);

    • git 中的 user.name 是用來追蹤程式碼的,提交程式碼時顯示的作者名字就是它,比如在 github 中,我的 user.name 就是 xiaoxi666。這裡引出了另外一個問題:**我在本機中配置了多個 git 賬號,如何在不同的專案中自動切換不同的作者名字?**比如我在公司的程式碼庫裡提交程式碼時,用的就是另外一個名字而非 xiaoxi666。這部分內容涉及到了 git 的配置(可以在終端輸入 git config --help 檢視官方說明),你一定有過下面這種配置的經歷:

      git config --global user.name "user_name"
      git config --global user.email "user_name@example.com"
      複製程式碼

      實際上,git 有三種配置選項,分別對應於 --system 、--global、--local,上面就是 --global選項。三種配置選項分別對應於三個配置檔案:

      --system  ->   /usr/local/git/etc/gitconfig
      --global  ->   ~/.gitconfig
      --local   ->   你的專案倉庫路徑/.git/config        
      複製程式碼

      這三種配置檔案的優先順序由低到高為:--system、--global、--local,優先順序高的配置會覆蓋優先順序低的配置。一般情況下,我們不會去設定 --system 選項,主要用的是 --global 和 --local。正如網上滿天飛的教程中,我們一般會設定 --global,這樣就不用在每個專案中設定一遍了;但是如果配置了多個 git 賬號,需要在一些專案中使用不同的作者名字,就需要單獨為該專案設定 --local。需要注意的是, --local 選項只能 cd 到當前專案路徑下中執行,否則會報錯 fatal: --local can only be used inside a git repository。

      注一:如果 --system、--global、--local 都沒有設定 user.email,將無法提交程式碼,因為無法識別程式碼作者。在設定了 user.email 的前提下,如果 --system、--global、--local 都沒有設定 user.name,則會使用計算機登入使用者名稱作為程式碼提交的作者名字。 注二:設定 --local 時記得同時設定 user.name 和 user.email,如果只設定 user.name,提交名字雖然正確了,但 user.email 還是用的 --global 中的 user.email,這會導致 github 倉庫中顯示的提交者卻不會連結到你的賬號:頭像是灰色的八爪魚,名字也沒有連結。

  4. 配置檔案可指定的引數還有很多,如埠等,這裡我們直接使用預設埠 22,因此沒有再去指定。

其他

  1. pbcopypbpaste 是兩個非常好用的命令,可查閱相關資料瞭解。
  2. 文章 man.linuxde.net/ssh-add 描述了 linux 的 ssh-add 命令,講得不錯。
  3. mac 分別有使用者名稱、主機名(HostName),以及計算機名。其中計算機名可以在 "System Preference" -> "sharing" 中設定,是分享時展示的名字;我們開啟終端時,會以使用者名稱@主機名 當前路徑 $主機名:當前路徑 使用者名稱$ 的格式顯示,其中主機名可以用命令 scutil –-set HostName new_hostname 設定。
  4. 有時我們需要新增或改變遠端倉庫的地址,新增命令為:git remote add origin 專案地址 ,改變命令為 git remote set-url origin 專案地址。其中專案地址的格式為 ssh 或 https。可以參見文章加以瞭解。

相關文章