在本地設置一個或者多個id_rsa 來鏈接 github 倉庫並實現 git push / git pull

場景一: 本地只須要一個 ssh id_rsa 來鏈接 GitHub倉庫

如今有一個本身的 github 倉庫 git@github.com:AAA/AAA.git, 須要將這個倉庫 clone 到本地修改代碼並提交。git

git clone git@github.com:AAA/AAA.git
複製代碼

再修改一些文件後提交代碼github

git add .
git push 
複製代碼

會出現報錯:ERROR: Permission to AAA.git bash

permission error

這是由於 本地倉庫沒有權限推送到遠端的 github 倉庫。ssh

解決方法

  1. 查看本地是否存在 ~/.ssh/id_rsa 文件。
# 查看是否存在 .ssh 目錄
ls ~ -a  # 列出全部文件,看是否含有 .ssh

# 若是存在 .ssh 目錄,查看是否存在 id_rsa、 id_rsa.pub 文件
ls ~/.ssh -a
複製代碼
  1. 若是沒有 .ssh 目錄 或者 沒有 id_rsa id_rsa.pub
mkdir .ssh # 若是沒有 .ssh 目錄
cd .ssh
# 若是沒有 id_rsa、 id_rsa.pub 文件,運行下面的命令, 並一路回車
ssh-keygen -t rsa -C "your_email@example.com" 
複製代碼
  1. 打開 本身的 githubsettings -> SSH and GPG keys -> New SSH key
  2. 將本地剛剛生成的 ~/.ssh/id_rsa.pub 裏面的內容拷貝到 New SSH keyKey裏面。
# 進入 .ssh 目錄
cd ~/.ssh/
cat id_rsa.pub
複製代碼

將顯示的內容拷貝到 New SSH keyKey裏面。 並添加一個 title, 點擊 Add SSH key測試

  1. 再次進入到剛開始 clone 的項目目錄, 執行 git push 就能成功了。

上面講到的解決方案,目的是爲了創建一個匹配本地和遠端git的鑰匙,這把鑰匙是一串密碼,本地使用這串要是隻能開一把某一個 github 用戶下的倉庫。ui

情景二: 若是咱們有兩個 github 的用戶 A 和 B, 當切換到另一個用戶 B,並在本地 clone 了這個用戶下的一個倉庫, 這時當 git push 的時候又會遇到 一樣的 權限問題: ERROR: Permission to XXX.git 或者 master -> master (Permission denied).

這是由於在本地中已經配置了一個 ssh的 公鑰(id_rsa.pub), 而這個公鑰是 匹配的是 github 用戶 A 的鎖, 當咱們切換到 github 用戶 B,的時候,這把公鑰沒有權限的。url

解決方案

  1. 生成一個新的 SSH KEY (id_rsa id_rsa.pub)
# 進入 .ssh 目錄
cd ~/.ssh/
# 新建另一個 ssh key
ssh-keygen -t rsa -C "your_BBB_email@example.com"
複製代碼

這裏不要一路回車, 這裏不要一路回車, 這裏不要一路回車 會有一個提醒 去填寫一個 key 的保存路徑, 填寫一個新的 id_rsa 的路徑. 好比: id_rsa_userBBB ,圖中我使用了 id_rsa_BBB 其餘的一路回車就能夠了。spa

  1. 查看新的 id_rsa_BBB, 並複製. 3d

  2. 打開BBB賬號的 githubsettings -> SSH and GPG keys -> New SSH key代理

  3. 將本地剛剛生成的 ~/.ssh/id_rsa_BBB.pub 裏面的內容拷貝到 New SSH keyKey裏面。

這時候雖然已經新建一把公鑰鏈接了新的github 用戶和本地,可是問題尚未解決,ssh 並不能區分兩把鑰匙,默認狀況下他只使用 A 的鑰匙,能夠在BBB帳戶倉庫的根目錄作一下測試:

ssh -T git@github.com
複製代碼

能夠看到在BBB賬號下的倉庫,使用的仍是AAA 用戶的 權限鑰匙

下面須要將本地的兩把鑰匙作一下區分,以便在使用 git push 的時候,讓 git 知道該使用那一把鑰匙

  1. 打開 ~/.ssh/config 文件 若是沒有就新建一個。
  2. 編輯 config 內容:
# default github setting 
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# another user rsa pub 
Host github-BBB
HostName github.com
User git
# ~/.ssh/id_rsa_BBB 文件爲剛生成的 rsa 文件
IdentityFile ~/.ssh/id_rsa_BBB
複製代碼
  1. 在BBB賬號倉庫下替換 git 倉庫的地址。
git remote -v # 查看倉庫地址
複製代碼

咱們須要將倉庫的地址中的 github.com/替換成 github-BBB:( github-BBB 字段是在 config 文件中添加的 Host 字段 )

git remote set-url origin github-BBB:BBB用戶/XXX倉庫.git
複製代碼

這樣每次 git pull / git push 的時候, 都會通過 Host 的匹配,來把鑰匙指向 ~/.ssh/id_rsa_BBB 文件,這樣本地就能分清楚哪個倉庫具體應該使用那一把鑰匙嘍。

多個 公鑰匹配不一樣的倉庫均可以使用這種方式解決。 使用命令: ssh -T git@Host 能夠查看Host 鑰匙和對應倉庫鎖的關係

Warning: Permanently added the RSA host key for IP address 'xxx.xx.xxx.xxx' to the list of known hosts.

這是由於系統默認的RSA 文件名是 id_rsa, 可是咱們如今建立了另一個 RSA 文件 id_rsa_BBB, 這個文件匹配到的 HostName地址 (config文件中設置的) 的 IP 並不存在於 RSA host 列表中,須要將這個 IP 的 host 永久地加入到 RSA host 列表中。

  1. 進入到 .ssh 目錄 新建一個 SSH 的代理,用來存放 RSA host 列表
eval "$(ssh-agent -s)"
複製代碼

2. 添加新建的密鑰文件到代理中:

ssh-add id_rsa_BBB
複製代碼

總結: 本地倉庫推送到遠端倉庫使用 ssh 鏈接, 這就須要使用到 ssh 的 id_rsa 做爲打開遠端倉庫的鑰匙。

  1. 當單個本地鑰匙鏈接遠端時,只用配置一個 id_rsa, 而後在 github 倉庫中新增一個ssh key, 將 id_rsa.pub 的內容設置爲這個 key 就能實現鏈接了。
  2. 當須要鏈接多個 github 倉庫時, 就須要在本地新建對應多的id_rsa, 並使用不一樣的文件進行區分, 而後使用 config 文件 來配置不一樣 id_rsa 對應的 host / hostName / IdentityFile,來實現鑰匙的區分。 再把不一樣的倉庫名稱使用 host 來從新設置遠端倉庫的地址。 最後對應的 id_rsa 的公鑰添加到 github 的 SSH key
相關文章
相關標籤/搜索