關於git的ssh-key:解決本地多個ssh-key的問題

柴華鬆 發表於 2021-07-24
Git

 在設定github的時候,官方的說明文件要求備份當前的id_rsa,然後生成一份新的私鑰用於github的登陸。如果真這樣做,那麼新的私鑰是無法再繼續登陸之前的機器的。這種方法有點暴力…
還好ssh可以讓我們通過不同的私鑰來登陸不同的域。

首先,在新增私鑰的時候,通過指定不同的檔名來生成不同的私鑰檔案

ssh-keygen -t rsa -f ~/.ssh/id_rsa.work -C "Key for Work"

ssh-keygen -t rsa -f ~/.ssh/id_rsa.github -C "Key for GitHub"
複製程式碼

新增ssh的配置檔案,並修改許可權

touch ~/.ssh/config

chmod 600 ~/.ssh/config
複製程式碼

修改config檔案的內容

Host *.workdomain.com

    IdentityFile ~/.ssh/id_rsa.work
    User lee
 
Host github.com
    IdentityFile ~/.ssh/id_rsa.github
    User git
複製程式碼

這樣在登陸的時候,ssh會根據登陸不同的域來讀取相應的私鑰檔案

ssh -T [email protected]
複製程式碼

如果想要使用同一臺電腦訪問github中兩個或多個倉庫,原理類似:

1.在終端中輸入以下命令,檢視金鑰。

ls ~/.ssh
複製程式碼

如果有 id_rsaid_rsa.pub,說明已存在一對金鑰/公鑰。

2.建立新的 金鑰/公鑰,並指定金鑰名稱,比如id_rsa_x(x為任意名稱)

ssh-keygen -t rsa -f ~/.ssh/id_rsa_x -C "[email protected]"
複製程式碼

操作完成後,該目錄會多出 id_rsa_xid_rsa_x.pub 兩個檔案。

3.在 ~/.ssh/ 資料夾下建立一個 config 檔案

$ touch config
$ vim config
複製程式碼

編輯config檔案,配置不同的倉庫指向不同的金鑰檔案。

# 第一個賬號,預設使用的賬號
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# 第二個賬號
Host second.github.com  # second為字首名,可以任意設定
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_x
複製程式碼

原理分析
1.ssh 客戶端是通過類似 [email protected]:githubUserName/repName.git ** 的地址來識別使用本地的哪個私鑰的,地址中的 User 是@前面的git, Host 是@後面的github.com
2.如果所有賬號的 User 和 Host 都為 git 和 github.com,那麼就只能使用一個私鑰。所以要對User 和 Host 進行配置,讓每個賬號使用自己的 Host,每個 Host 的域名做 CNAME 解析到 github.com,如上面配置中的Host second.github.com
3.配置了別名之後,新的地址就是
[email protected]:githubUserName/repName.git**(在新增遠端倉庫時使用)。
這樣 ssh 在連線時就可以區別不同的賬號了。

4.檢視SSH 金鑰的值,分別新增到對應的 GitHub 賬戶中

$ cat id_rsa.pub
$ cat id_rsa_x.pub
複製程式碼

把這兩個值分別 copy 到 GitHub 賬號中的 SSH keys 中儲存。

5.清空本地的 SSH 快取,新增新的 SSH 金鑰 到 SSH agent中

$ ssh-add -D
$ ssh-add id_rsa
$ ssh-add id_rsa_x
複製程式碼

最後確認一下新金鑰已經新增成功

$ ssh-add -l
複製程式碼

6.測試 ssh 連結

ssh -T [email protected]
ssh -T [email protected]
# xxx! You’ve successfully authenticated, but GitHub does not provide bash access.
# 出現上述提示,連線成功
複製程式碼

7.取消 git 全域性使用者名稱/郵箱的設定,設定獨立的 使用者名稱/郵箱

# 取消全域性 使用者名稱/郵箱 配置
$ git config --global --unset user.name
$ git config --global --unset user.email
# 進入專案資料夾,單獨設定每個repo 使用者名稱/郵箱
$ git config user.email "[email protected]"
$ git config user.name "xxxx"
複製程式碼

檢視git專案的配置

git config --list
複製程式碼

8.命令列進入專案目錄,重建 origin (whatever 為相應專案地址)

$ git remote rm origin
# 遠端倉庫地址,注意Host名稱
$ git remote add origin [email protected]:githubUserName/repName.git
$ git remote -v # 檢視遠端
複製程式碼

10.遠端 push 測試
首先在 GitHub 上新建一個名為 testProj 的遠端倉庫,然後再在本地建一個本地倉庫。

$ cd ~/documnts
$ mkdir testProj
複製程式碼

1.進入 testProj 資料夾,建立 REDME.md檔案
2.初始化此資料夾為git
3.新增並提交README.md到Git本地倉庫
4.新增遠端倉庫
5.把README.md推送到遠端倉庫

$ cd testProj
$ echo "# ludilala.github.io" >> README.md
$ git init
$ git add README.md
$ git commit -m "first commit"
# 如果前面已新增遠端連線,就無需再次新增
$ git remote add origin https://github.com/ludilalaa/ludilala.github.io.git
$ git push -u origin master
複製程式碼