git/ssh捋不清的幾個問題


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

本文地址:http://www.cnblogs.com/hustskyking/p/problems-in-git-when-ssh.html,轉載請注明源地址。

一、概念的解釋

1. rsa 與 rsa.pub

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

ssh-keygen -t rsa -C "something"

可以生成兩個文件,這兩個文件的命名默認是 id_rsa 和 id_rsa.pub,如果你在鍵入上述命令回車之后,重新輸入了命名,那此時生成的兩個文件就是 [命名][命名].pub,這個好理解。

主要是解釋下生成了兩個什么東西。id_rsa 可以稱之為私有密鑰,id_rsa.pub 可以稱之為公有密鑰。我們會把公有密鑰交給服務端,當需要從服務端請求內容的時候,要帶上私有密鑰。此時,服務器會通過一定的算法計算私有密鑰,並判斷計算的結果是否與公有密鑰一樣,如果不一樣則響應請求失敗。

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

rsa.pub 里面是個什么東西,其實很簡單:

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

而 rsa 中是:

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

2. 驗證程序

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

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/ 目錄下看到這個文件。但如果我們創建了這個文件,會發現里面的內容會隨着我們的驗證慢慢增加。

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

二、常見問題

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 密鑰匹配出錯。

三、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/ 目錄中!

四、小結

這東西我糾結了一個下午,花了將近三個多小時才解決問題,真心快吐血了!說到底就是一個 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 這個地方報錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM