Git&GitHub 03 用 SSH 協議連結遠端儲存庫
注意事項與宣告
平臺: Windows 10
作者: JamesNULLiu
郵箱: [email protected]
部落格: https://www.cnblogs.com/jamesnulliu
學習筆記 轉載請註明出處 歡迎留言
0. 前言
本系列文章是 git & github 的入門教程.
本系列文章優勢:
- 零基礎
- 深入淺出
- 知識點涵蓋面廣
儘管如此, 想要真正學會 git & github 建議不要看任何教程, 直接看 git 的 官方文件.
1. 為什麼使用 SSH protocol
在主系列教程中, 我們使用 HTTPS 協議 連線遠端倉庫.
HTTPS 協議
https
開頭的 URL:
git remote -v
HTTPS 與 SSH 都是一種安全的網路連線協議:
- 使用 HTTPS 協議對遠端倉庫操作需要提供使用者的賬號和密碼 (沒有提示輸入是因為 git 儲存了你的賬號密碼);
- 使用 SSH 協議對遠端倉庫操作, 首先需要匹配儲存在電腦中的私鑰, 其次如果使用者對私鑰設定了密碼, 還需提供該密碼.
對於公開的專案, 用何種協議或許無關緊要;
但對於私有的 (或團隊管理) 的專案, 我們應該選擇一種更加安全的資訊保護措施.
相較 HTTP, HTTPS 已經足夠安全; 但由於 SSH 基於 非對稱加密技術
2. 刪除 SSH keys
在某些情況下, 如果繫結的金鑰出現問題, 我們需要需要刪除它.
後續節中, 如果發現金鑰出問題, 請回到這步刪除你的金鑰.
- 進入儲存了金鑰的資料夾 (預設在 C:/Users/你的使用者名稱/.ssh/ );
- 刪除出現問題的金鑰對(一個沒有後綴名的檔案(private key) 和 一個同名但字尾名為.pub的檔案(public key));
- 刪除 known_hosts 和 known_hosts.old (如果有);
- 如果有 config 檔案, 用記事本開啟, 刪除其中出現問題的金鑰配置;
- 登入 github 賬號, 在 Settings
3. 建立 SSH keys
在 git 中存在兩種演算法生成金鑰, 一種是 rsa
, 另一種是 ed25519
.ed25519
是一種 ECC 演算法, 比起傳統的 rsa
更加現代化和高效.
因此推薦使用 ed25519
演算法生成金鑰.
- 在任意位置右鍵開啟 git bash, 在終端輸入以下命令 (建議將引號內內容替換為自己的郵箱):
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/my_github_ed25519
-
ssh-keygen
表示生成ssh
金鑰; -
-t ed25519
表示使用ed25519
演算法; 如果使用rsa
演算法, 建議輸入-t rsa -b 4096
, 即生成 4096 bits 的金鑰; -
-C "comments"
是對該金鑰的說明, 引號內可以填寫郵箱或者任何文字; -
-f ~/.ssh/my_github_ed25519
指出了金鑰的生成路徑以及金鑰的檔名, 檔名可以依據自己的需求更改, 金鑰可在 C:/Users/你的使用者名稱/.ssh/ 資料夾內找到.
-
- 接著終端提示設定密碼, 當遠端的公鑰與電腦的私鑰匹配後, 使用者希望進一步操作則需要輸入密碼.
強烈建議設定密碼, 但請確保自己記得住該密碼.
在你輸入密碼時, 終端的介面上不會顯示出白色的密碼字元, 這是對周圍環境的防範. - 再次輸入與剛剛相同的密碼, 匹配成功後顯示金鑰成功生成, 並輸出了金鑰的指紋和隨機影象. 可以忽略這些內容;
- 進入 C:/Users/你的使用者名稱/.ssh/ 資料夾 (沒有就自己建立一個), 右鍵新建文字文件, 取名為 "config" (不要保留.txt字尾名);
右鍵選擇用記事本開啟, 在裡面輸入以下內容 (最後一行是金鑰路徑和檔名, 注意根據自己的情況更改):Host github.com Hostname github.com # ProxyCommand connect -S 127.0.0.1:7890 %h %p User git PreferredAuthentications publickey IdentityFile ~/.ssh/my_github_ed25519
-
關於 Host 和 Hostname
Host 是別名, Hostname 是域名;
例如命令ssh -T [email protected]
中github.com
是 Hostname;
如果將 Host 設定為github
, 那麼只需輸入ssh -T github
就行;
但此時輸入ssh -T [email protected]
會出錯,
因此務必統一將 Host & Hostname 設定為github.com
以避免莫名其妙的錯誤. -
關於 Proxy
上文給出的配置命令中用#
註釋掉了ProxyCommand
, 如果希望配置代理, 請刪除#
並按照以下規則改動命令和埠:
SOCKS代理:ProxyCommand connect -S localhost:1080 %h %p
HTTP代理:ProxyCommand connect -H localhost:1080 %h %p
注: 本文是基於windows平臺撰寫的, 上述代理方式使用了 Git for Windows 同捆的 connect.exe. 如果是 Linux 平臺, 需要額外安裝 connect-proxy. -
關於 127.0.0.1 和 7890
127.0.0.1 指本地ip地址, 7890 指代理的埠.
-
關於 Host 和 Hostname
4. 連線到 Remote Repository
- 進入儲存了金鑰的資料夾 (預設在 C:/Users/你的使用者名稱/.ssh/ ),
用記事本開啟剛剛建立的金鑰對的公鑰 (你取的檔名.pub),
複製裡面的所有內容. - 登入 github 賬號,
在 Settings 頁面左側欄中找到 SSH and GPG keys,
點選右側按鈕 New SSH key,
隨便取個 Title,
在 Key 的輸入框中貼上剛剛複製的公鑰. - 在任意位置右鍵開啟 git bash, 在終端輸入以下命令:
終端提示輸入密碼, 如果是新的金鑰, 成功後會提示該沒要還沒被授權, 提問是否授權;ssh -T [email protected]
輸入yes
, 成功後會有類似於:Hi jamesnulliu! You've successfully authenticated, but GitHub does not provide shell access.
的提示;
如果終端提示:[email protected]: Permission denied (publickey).
, 那請檢查 第3節第4步 中的 config 檔案 是否配置正確, 如果還是不行就回到 第2節 刪除 ssh key 重新來過. - 再次輸入以下命令:
輸入密碼後終端給出類似於ssh -T [email protected]
Hi jamesnulliu! You've successfully authenticated, but GitHub does not provide shell access.
的提示, 說明金鑰連線成功.
5. 用 SSH protocol 進行專案管理
5.1. New Repository
和 HTTPS 協議唯一不同的地方在於, 在 github 上覆制專案連結的時候選擇 HTTPS 旁邊的 SSH, 點小方塊複製連線.
在外部資料夾使用以下命令 clone 儲存庫 (更換為你的儲存庫連結):
git clone [email protected]:jamesnulliu/test.git
clone 完成後將工作區切換到 clone 下來的資料夾 (本地儲存庫) 內, 在終端輸入以下命令:
git remote -v
可以看到現在 origin 指向的已經是 ssh 協議的連結了.
5.2. 更改已有 Local Repository 的連線方式
用 git remote -v
檢視本地儲存庫連結方式;
如果本地儲存庫已經用 https 協議連結, 請遵輸入以下命令更改 origin 指向的 URL (xxx 替換成 ssh 連線地址).
git remote set-url origin xxxxxxx
參考:
[email protected]: Permission denied (publickey)
Git SSH金鑰刪除與建立
HTTPS vs SSH in git
使用 Ed25519 演算法生成你的 SSH 金鑰
詳解:為GitHub、Gitlab賬號同時新增、管理多個SSH-Key
How to set SSH on GitHub using Ed25519 algorithm in Colab?