配置多個git賬號的ssh密鑰

背景

我們在工作中會以 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 "[email protected]"
  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 [email protected],若出現 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,鏈接均以 [email protected]開頭,@ 前面的 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 "[email protected]" 實際上,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. 文章 http://man.linuxde.net/ssh-add 描述了 linux 的 ssh-add 命令,講得不錯。
  3. mac 分別有用戶名、主機名(HostName),以及計算機名。其中計算機名可以在 "System Preference" -> "sharing" 中設置,是分享時展示的名字;我們打開終端時,會以用戶名@主機名 當前路徑 $主機名:當前路徑 用戶名$ 的格式顯示,其中主機名可以用命令 scutil –-set HostName new_hostname 設置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章