主要是 windows 使用者會遇到很多糾結的問題,linux/unix 使用者屬于這方面的高端使用者,應該有能力處理此類問題,而且網絡上也有很多解決方案,本文的授衆是 windows 使用者。由于今天配置了一下午,雖說配置過程基本搞清楚,懶得重新配置一遍,是以文中皆以文字形式叙述,沒有截圖。
網上很容易搜到的東西我就不說了,我們知道,通過:
可以生成兩個檔案,這兩個檔案的命名預設是 id_rsa 和 id_rsa.pub,如果你在鍵入上述指令回車之後,重新輸入了命名,那此時生成的兩個檔案就是 <code>[命名]</code> 和 <code>[命名].pub</code>,這個好了解。
主要是解釋下生成了兩個什麼東西。id_rsa 可以稱之為私有密鑰,id_rsa.pub 可以稱之為公有密鑰。我們會把公有密鑰交給服務端,當需要從服務端請求内容的時候,要帶上私有密鑰。此時,伺服器會通過一定的算法計算私有密鑰,并判斷計算的結果是否與公有密鑰一樣,如果不一樣則響應請求失敗。
rsa.pub 裡面是個什麼東西,其實很簡單:
而 rsa 中是:
在使用 git 指令與服務端進行互動之前,我們可以先驗證下伺服器和用戶端是否握手成功了。
如果是 github,就可以直接寫 [email protected], 如果是 aaa.bbb.com,就可以寫 [email protected]。 如果成功,你會看到 success 之類的字眼。
這是個什麼檔案呢?一般情況下 windows 下不會産生這個檔案,先說說他是幹什麼的。當我們成功與服務端進行連接配接時,ssh 會記錄服務端的 Host、IP 以及 rsa 檔案,當連接配接過程中出現:
如果你選擇 Yes,那這個 known_hosts 檔案中就會多出一條記錄。windows 是不會自動産生這個檔案的,也可能是程式産生了,但是沒權限寫入,是以我們沒有在 .ssh/ 目錄下看到這個檔案。但如果我們建立了這個檔案,會發現裡面的内容會随着我們的驗證慢慢增加。
搞清楚了這些概念,我們再說說會遇到的問題。
當你鍵入 <code>ssh -T [email protected]</code> 這條指令之後,程式提示要你輸入 [email protected] 的密碼,那不用想了,程式沒找到你的私有密鑰。在哪些情況下會這樣呢?
我們在生成這兩個密鑰的時候,程式可能沒有幫我們在根目錄下(C:/Users/yourName)建立一個 .ssh/ 檔案夾,而他在建立連接配接的時候會預設尋找 <code>~/.ssh/id_rsa</code>,如果沒有建立一個這樣的檔案夾很顯然是找不到的。你可以在根目錄下通過指令行來建立一個檔案夾
之是以要用指令行是因為有時候浏覽器不讓你在檔案夾名第一位放點号。
當然也有可能是因為你沒有把建立的兩個密鑰放到 .ssh/ 目錄下,而是直接扔在根目錄下。
"Host key verification failed." 相信你也撞到了這個問題,主機的密鑰驗證失敗,主機就是你的機器,密鑰驗證失敗有兩個原因,一個是 RSA 做了更改,另一個原因是在 known_hosts 中存在一個緩存的記錄,如果确認了 RSA 沒有錯誤,那你就應該去 known_hosts 中删掉對應的那個記錄(這個記錄可以當做是緩存,是對驗證做了一次緩存,緩存的作用是減少驗證次數,不需要每次都驗證,讀取緩存就行了)。
當然,你也可以直接删除這個 known_hosts 檔案。
"Permission denied (publickey)." 這個問題其實和上面的 2 差不多,當你出現過 "Host key verification failed.",然後繼續執行程式,如執行 <code>ssh -T [email protected]</code> 的時候就會出現這個問題提醒。說到底就是沒有找到你的 rsa 私有密鑰,或者 rsa 密鑰比對出錯。
生成密鑰預設放在 "~/.ssh/" 下,但是在 cmd 下操作會找不到 "~/" 這個根目錄,因為這是 windows 不是 linux/unix,有些童鞋可能裝了 cygwin,在這個環境下操作可以 "cd ~",git bash 下當然也是可以的。
如果不知道有這個問題的存在,你會碰到上述問題一,程式直接讓你輸入密碼,但不過你輸入什麼密碼都是錯誤的。輸入三次之後狀态為 <code>Permission denied</code>,這裡的原因就是沒找到 <code>~/.ssh/id_rsa</code> ,cmd 下她根本就不認識 "~/" 這個目錄。
很常見的問題。上面我們說到了,程式會預設尋找 <code>~/.ssh/id_rsa</code> 這個檔案,同一目錄下顯然不能有兩個重名檔案,也就是說當我們去認證 github 和另外一個 git 伺服器的時候,我們需要把兩個 rsa 私有密鑰的名字換來換去,想用誰就把誰改成 id_rsa。特别麻煩,那腫麼辦?
之前在網上看到說是對 ssh_config 進行配置,配置内容是:
這裡的 "~/.ssh/github" 和 "~/.ssh/xxx" 都是 rsa 檔案,檔案的指令可以直接改,也可以在開始生成的時候設定,命名對内容沒有任何影響。項目的幾行代碼應該也是十厘清晰的,針對不同的 git 伺服器,使用不用的 IdentifyFile。
但是你會發現,你的設定毫無用處,因為你把檔案名搞錯了!在 linux/unix 下可能是使用 ssh_config 這個檔案名,但是在 windows 下是使用 config 作為檔案名放在 ~/.ssh/ 目錄中!
這東西我糾結了一個下午,花了将近三個多小時才解決問題,真心快吐血了!說到底就是一個 config 的配置問題,遇到這種問題最快捷的方式并不是在網上瘋狂的搜尋答案,而是靜下心來看看 rsa | git | ssh 的基礎知識,了解每個參數及其用途,對症下藥!
補充:
1)“ssh-add -l” 報錯 “Could not open a connection to your authentication agent.”
操作:ssh-agent bash -login -i
2)“Are you sure you want to continue connecting (yes/no)?” 選擇 yes ,否則會報錯“fatal: Could not read from remote repository.”
3) config 檔案貌似沒啥用,IdentifyFile path/to/rsa 這個地方報錯。
本文轉自Barret Lee部落格園部落格,原文連結:http://www.cnblogs.com/hustskyking/p/problems-in-git-when-ssh.html,如需轉載請自行聯系原作者