git/ssh捋不清的幾個問題

本文同步自個人博客園:http://hustskyking.cnblogs.comlinux

主要是 windows 用戶會遇到不少糾結的問題,linux/unix 用戶屬於這方面的高端用戶,應該有能力處理此類問題,並且網絡上也有不少解決方案,本文的受衆是 windows 用戶。因爲今天配置了一下午,雖然說配置過程基本搞清楚,懶得從新配置一遍,因此文中皆以文字形式敘述,沒有截圖。git

1、概念的解釋

1. rsa 與 rsa.pub

網上很容易搜到的東西我就不說了,咱們知道,經過:github

ssh-keygen -t rsa -C "something"

能夠生成兩個文件,這兩個文件的命名默認是 id_rsa 和 id_rsa.pub,若是你在鍵入上述命令回車以後,從新輸入了命名,那此時生成的兩個文件就是 [命名][命名].pub,這個好理解。算法

主要是解釋下生成了兩個什麼東西。id_rsa 能夠稱之爲私有密鑰,id_rsa.pub 能夠稱之爲公有密鑰。咱們會把公有密鑰交給服務端,當須要從服務端請求內容的時候,要帶上私有密鑰。此時,服務器會經過必定的算法計算私有密鑰,並判斷計算的結果是否與公有密鑰同樣,若是不同則響應請求失敗。windows

+-----------+                           +-----------+
|           |                           |           |
|           |    enc(rsa) == rsa.pub    |           |
|  client   | ------------------------> |   server  |
|           |             ?             |           |
|           |                           |           |
+-----------+                           +-----------+

rsa.pub 裏面是個什麼東西,其實很簡單:瀏覽器

ssh-rsa base64(加密內容) "something"

而 rsa 中是:緩存

-----BEGIN RSA PRIVATE KEY-----
base64(私有密鑰的一些處理)
-----END RSA PRIVATE KEY-----

2. 驗證程序

在使用 git 命令與服務端進行交互以前,咱們能夠先驗證下服務器和客戶端是否握手成功了。bash

ssh -T git@xxx.com

若是是 github,就能夠直接寫 git@github.com, 若是是 aaa.bbb.com,就能夠寫 git@aaa.bbb.com。 若是成功,你會看到 success 之類的字眼。服務器

3. known_hosts 文件

這是個什麼文件呢?通常狀況下 windows 下不會產生這個文件,先說說他是幹什麼的。當咱們成功與服務端進行鏈接時,ssh 會記錄服務端的 Host、IP 以及 rsa 文件,當鏈接過程當中出現:網絡

Permanently added '10.0.0.0' (RSA) to the list of known hosts.

若是你選擇 Yes,那這個 known_hosts 文件中就會多出一條記錄。windows 是不會自動產生這個文件的,也多是程序產生了,可是沒權限寫入,因此咱們沒有在 .ssh/ 目錄下看到這個文件。但若是咱們建立了這個文件,會發現裏面的內容會隨着咱們的驗證慢慢增長。

搞清楚了這些概念,咱們再說說會遇到的問題。

2、常見問題

1. git@xxx.com 輸入密鑰

當你鍵入 ssh -T git@xxx.com 這條命令以後,程序提示要你輸入 git@xxx.com 的密碼,那不用想了,程序沒找到你的私有密鑰。在哪些狀況下會這樣呢?

咱們在生成這兩個密鑰的時候,程序可能沒有幫咱們在根目錄下(C:/Users/yourName)新建一個 .ssh/ 文件夾,而他在創建鏈接的時候會默認尋找 ~/.ssh/id_rsa,若是沒有新建一個這樣的文件夾很顯然是找不到的。你能夠在根目錄下經過命令行來新建一個文件夾

mkdir .ssh

之因此要用命令行是由於有時候瀏覽器不讓你在文件夾名第一位放點號。

固然也有多是由於你沒有把建立的兩個密鑰放到 .ssh/ 目錄下,而是直接扔在根目錄下。

2. Host key verification failed

"Host key verification failed." 相信你也撞到了這個問題,主機的密鑰驗證失敗,主機就是你的機器,密鑰驗證失敗有兩個緣由,一個是 RSA 作了更改,另外一個緣由是在 known_hosts 中存在一個緩存的記錄,若是確認了 RSA 沒有錯誤,那你就應該去 known_hosts 中刪掉對應的那個記錄(這個記錄能夠當作是緩存,是對驗證作了一次緩存,緩存的做用是減小驗證次數,不須要每次都驗證,讀取緩存就好了)。

固然,你也能夠直接刪除這個 known_hosts 文件。

3. Permission denied (publickey)

"Permission denied (publickey)." 這個問題其實和上面的 2 差很少,當你出現過 "Host key verification failed.",而後繼續執行程序,如執行 ssh -T git@xxx.com 的時候就會出現這個問題提醒。說到底就是沒有找到你的 rsa 私有密鑰,或者 rsa 密鑰匹配出錯。

3、windows 下讓人糾結的問題

1. 找不到根目錄

生成密鑰默認放在 "~/.ssh/" 下,可是在 cmd 下操做會找不到 "~/" 這個根目錄,由於這是 windows 不是 linux/unix,有些童鞋可能裝了 cygwin,在這個環境下操做能夠 "cd ~",git bash 下固然也是能夠的。

若是不知道有這個問題的存在,你會碰到上述問題一,程序直接讓你輸入密碼,但不過你輸入什麼密碼都是錯誤的。輸入三次以後狀態爲 Permission denied,這裏的緣由就是沒找到 ~/.ssh/id_rsa ,cmd 下她根本就不認識 "~/" 這個目錄。

2. 多個服務端的維護

很常見的問題。上面咱們說到了,程序會默認尋找 ~/.ssh/id_rsa 這個文件,同一目錄下顯然不能有兩個重名文件,也就是說當咱們去認證 github 和另一個 git 服務器的時候,咱們須要把兩個 rsa 私有密鑰的名字換來換去,想用誰就把誰改爲 id_rsa。特別麻煩,那腫麼辦?

以前在網上看到說是對 ssh_config 進行配置,配置內容是:

Host github.com
    User boy-a
    IdentifyFile ~/.ssh/github
Host xxx.com
    User boy-b
    IdentifyFile ~/.ssh/xxx

這裏的 "~/.ssh/github" 和 "~/.ssh/xxx" 都是 rsa 文件,文件的命令能夠直接改,也能夠在開始生成的時候設定,命名對內容沒有任何影響。項目的幾行代碼應該也是十分清晰的,針對不一樣的 git 服務器,使用不用的 IdentifyFile。

可是你會發現,你的設置毫無用處,由於你把文件名搞錯了!在 linux/unix 下多是使用 ssh_config 這個文件名,可是在 windows 下是使用 config 做爲文件名放在 ~/.ssh/ 目錄中!

4、小結

這東西我糾結了一個下午,花了將近三個多小時才解決問題,真心快吐血了!說到底就是一個 config 的配置問題,遇到這種問題最快捷的方式並非在網上瘋狂的搜索答案,而是靜下心來看看 rsa | git | ssh 的基礎知識,瞭解每一個參數及其用途,對症下藥!

相關文章
相關標籤/搜索