配置多個git帳號的ssh密鑰

背景

咱們在工做中會以 ssh 的方式配置公司的 git 帳號,可是平時也會使用 github 管理本身的項目。出於各類緣由,本身的 github 項目沒法使用公司的 git 帳號,因而咱們能夠爲本身的 github 建立一個新的 git 帳號,這就須要生成新的 ssh 密鑰。 下面總結了建立多個互相獨立的 ssh 密鑰的步驟(以公司的和本身 github 的爲例)。linux

步驟(以mac爲例)

  1. 在文件夾 ~/.ssh/ 下建立兩個文件夾,分別爲 company/github/,前者存放公司的 ssh密鑰,後者存本身github 的 ssh 密鑰。下面的步驟以建立 github 密鑰爲例:git

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

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

  4. 而後出現 Enter passphrase (empty for no passphrase),直接回車便可。緩存

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

    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 公鑰。ssh

  8. 建立公司 ssh 密鑰 的過程相似,再也不贅述。ide

  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。能夠參見文章加以瞭解。
相關文章
相關標籤/搜索