SVN+SSH協議工作方式全解析,以Sourceforge為例講解如何在Windows下配置TortoiseSVN和Subclipse訪問SVN+SSH協議的Repository

來源:互聯網
上載者:User

簡單地說,SVN+SSH (SVN over SSH) 協議的工作方式就是在SVN用戶端與伺服器端先建立一個SSH串連,然後通過SSH串連推送命令和傳輸資料,從而藉助SSH實現更加安全的SVN通訊。使用SVN+SSH方式訪問Repository,與普通的http或https方式最大的不同,或者說僅有的不同就是通過SSH安全認證登入到遠程主機建立SSH連結,如果這一步完成了,剩下的就是純SVN操作了。在正式開始前,請選擇安裝本文討論和使用到的下列工具:

PuTTY : http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
TortoiseSVN:  http://tortoisesvn.tigris.org/
Subclipse: http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA

本文原文連結:http://blog.csdn.net/bluishglc/article/details/8705864 轉載請註明出處!

一、從SVN+SSH://地址談起

當我們試圖檢出一個使用svn+ssh協議的工程時,除了必需的帳號密碼(當然正常情況下你應該還有一個密鑰和密鑰的密碼短語passphrase,關於密鑰我們會在後面討論 ) 我們唯一得到的就是一個svn+ssh://開頭的Repository地址了。理論上,使用這個地址和我們掌握的密碼就可以訪問遠程主機的Repository了。那我們來看一下SVN+SSH://格式的地址告訴了我們(SVN用戶端)什麼 ?下面是一個來自sourceforge的典型的工程地址:

這個地址是sourceforge工程的標準SVN地址格式,youraccount代指你的sourcegorge帳號(帳號部分不是必需的,你可以在串連SSH主機時通過其他方式告知你的登入帳號,比如使用putty儲存好的session,這種例子會在後面的實驗三中示範),yourproject代指你的工程。如果我們從SSH的角度來解讀這個地址,那麼這個地址告訴SSH了用戶端兩個重要訊息:1. SSH遠程主機的地址:svn.code.sf.net,2. 登入SSH遠程主機的帳號:youraccount。實際上,基於這兩個資訊再加上你掌握的帳號密碼,我們就可以登入svn.code.sf.net了,一個簡單的驗證方法就是使用PuTTY串連一下svn.code.sf.net,輸入你的帳號密碼登入,之後就會得到如下的訊息:

“Welcome to *.svntest.sourceforge.net ” 表示你已經登入成功,但是SSH主機不會為你分配終端,然後直接關閉了串連,不過這並不重要,關鍵是我們已經確認使用地址中給出的主機地址和帳號是可以建立SSH串連的。

二、TortoiseSVN是如何自動登入到SSH遠程主機的

確認了可以建立SSH串連後,我們可以直接使用TortoiseSVN訪問這個地址,不過你會發現,TortoiseSVN會不停地要求你輸入帳號密碼(這種情況正是下文“實驗一”示範的),如果你堅持每次都輸入,最後就能得到完整的Repository目錄結構,這表明,單獨使用Tortoise可以直接存取svn+ssh://youraccount@remoteserver/xxxx/xxxx 格式的地址,不過唯一的麻煩是需要不停地輸入密碼。(實際上這是因為TortoisePlink在使用口令認證的方式進行登入,而出於安全原因,口令永遠不會被緩衝,所以必需每次輸入!稍後我們會進一步解釋這個過程)

現在我們來思考上述過程背後的一個實現細節:通過給出的"svn+ssh://"地址,TortoiseSVN知道了遠程主機地址和帳號,那TortoiseSVN是如何自動登入到SSH遠程主機的呢?是不是TortoiseSVN也內建了像putty那樣的SSH用戶端工具來建立SSH串連呢?答案應該是肯定的,不過我們並沒有在使用過程中看到Tortoise像putty那樣提供一個配置介面讓使用者配置主機地址和帳號,而是自動從地址中得到這些資訊建立了SSH串連,也就是說TortoiseSVN的這個SSH串連工具不是像putty那樣手動的互動串連工具,而應該是一個可以直接調用執行的命令列工具,沒錯,這個工具就是TortoisePlink,它位於TortoiseSVN安裝目錄下的bin子目錄中,在svn+ssh協議下,TortoiseSVN向遠程主機發送的所有請求都是先通過TortoisePlink建立SSH串連通道後傳遞的。那TortoisePlink是一種什麼樣的工具呢?實際上,它就是PuTTY提供的SSH命令列串連工具plink, TortoisePlink可能根據Tortoise的需要對plink進行了一層簡單的包裹,但是它本質上就是plink,TortoisePlink的參數和使用方法與plink是一樣的,所以我們的問題聚焦在:plink是什嗎?它是如何工作的?

三、Plink,幕後的關鍵角色

plink是一個SSH的命令列串連工具。簡單地說,通過一條plink命令,我們可以直接通過SSH向遠程主機推送命令執行或是傳遞資料。關於plink詳細的介紹和使用方法可以參考putty官方使用者手冊: http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter7.html. 這裡我們簡單看一下plink的命令列格式,就明白它是用來做什麼的了。

plink [options] [user@]host [command]

舉個例子,假如有一個遠程SSH主機192.168.1.101,登入帳號root, 密碼1234, 如果我們想登入這個主機查看一下根目錄下的結構,我們可以通過這樣一條plink命令實現:

plink -pw 1234 root@192.168.1.101 ls /

同樣的,仿照一開始我們使用putty訪問svn.code.sf.net,我們現在使用plink來串連一下,並推送一個ls /命令,輸入:

plink -pw yourpassword youraccount@svn.code.sf.net ls /

我們會得到這樣的響應:

同樣,我們得到了“Welcome to *.svntest.sourceforge.net”提示,表示我們也登入成功了,不過受到sourceforge的限制,我們不能執行任何命令。所以我們可以看出:plink的主要用途是讓指令碼或者某些自動化處理能通過命令列以非互動的方式串連到遠程ssh主機執行命令。很顯然,在SVN+SSH協議下,SVN用戶端工具正需要這樣的命令列工具建立SSH串連進行SVN操作!這就是為什麼TortoiseSVN需要TortoisePlink的原因。

到這裡,關於“TortoiseSVN是如何自動登入到SSH遠程主機”問題的答案已經很清楚了:在SVN+SSH協議下,所有TortoiseSVN與遠程主機的通訊,都是通過TortoisePlink建立的到遠程主機的SSH串連進行的!

四、PuTTY與Plink之間的“秘密”:共用PuTTY Session

瞭解了plink之後,對比一下putty,它們之間的關係其實很像資料庫用戶端與資料庫命令列工具的關係。如果說putty是一個需要一系列手動設定(如遠程主機地址,使用者名稱等等)可以串連上遠端資料庫進行管理的“用戶端”(如sql server的SQL Server Management Studio或者mysql的HeidiSQL),那麼plink就是一個可以直接連接到遠端資料庫執行sql的“命令列工具”(如sql server的osql.exe或者mysql的mysql.exe)。
但是,putty與plink的關係比我們想像的還要“緊密”一些,它們之間存在著一條非常重要的“紐帶”,這條“紐帶”就是:plink可以直接擷取PuTTY裡儲存的session,使用session的配置串連遠程主機。這一點plink的文檔裡有特別地說明:

If you have already set up a PuTTY saved session, then instead of supplying a host name, you can give the saved session name. This allows you to use public-key authentication, specify a user name, and use most of the other features of PuTTY。

是的,讓plink使用PuTTY裡儲存好的session, 可以複用session的配置,更重要的是PuTTY的session可以指定使用者名稱、使用密鑰登入以及其他一些特性,plink使用PuTTY的session即可以簡化命令列,還可以藉助PuTTY session實現一些更豐富的配置。

實際上,putty會將所有的session資訊儲存到註冊表中(位置是HKEY_CURRENT_USER\Software\SimonTatham), PuTTY下的所有工具(如Pageant)如果需要都可以得到這些session的資訊,甚至包括第三方工具可以從註冊表中讀取這些資訊。是的,你可能猜到了,TortoisePlink也可以使用這些Session!這是TortoiseSVN可以使用密鑰認證登入遠程主機的關鍵!因為TortoiseSVN本身沒有提供匯入密鑰的功能,TortoisePlink也沒有,但是Putty有,利用Putty配置的Session就可以實現了。

五、SSH的安全認證方式

前文我們提到使用TortoiseSVN直接存取SVN+SSH://開頭的Repository地址時總是要求輸入密碼,原因很簡單, TortoiseSVN並不與SSH遠程主機建立線上的長串連,而是有請求時才通過TortoisePlink建立一個SSH串連傳遞請求和響應,然後斷開SSH串連。而TortoiseSVN要列出Repository目錄結構需要進行多次資料傳遞,自然每次請求建立串連都需要輸入密碼。那麼有沒有不那麼麻煩還安全的身份認證呢?當然有,這就是使用密鑰進行安全認證。SSH一共支援兩種方式的安全認證:

1.‘基於口令’的安全認證
就是帳號+密碼的認證方式,這是最普通也是最普遍的一種安全認證方式,前面我們都在使用這種認證方式登入。

2.‘基於密鑰的’安全認證
使用秘要產生工具(linux下使用openssh的ssh-keygen,windows下使用PuTTY的puttygen)使用一個公開金鑰和一個私密金鑰,這是一對密鑰,公開金鑰會放置於伺服器端ssh指定的位置,私密金鑰則由本人妥善儲存,一般產生私密金鑰時還會為它設定一個密碼短語passphrase,在用戶端使用SSH串連Server的時候需要使用這個私密金鑰檔案+密碼短語進行安全認證。從安全認證的類型上分,這屬於Two-factor authentication,這也是非常普遍而且安全性更高的一種認證方式。舉個例子:密鑰相當於你的銀行卡,一個實物憑證, 密碼短語相當於你的銀行卡密碼。密碼短語的作用是使密鑰的使用更加安全。設想如果你的私密金鑰被其他人獲得,而那人又知道你的帳號名和遠程主機地址,那麼他就可以能過這個密鑰直接連接到遠程主機了,而如果設定了密碼短語,即使密鑰被其他人獲得也不能被使用。關於如何使用ssh-keygen和puttygen產生公開金鑰和私密金鑰對,過程非常簡單,本文不再贅述,請參考: http://sourceforge.net/apps/trac/sourceforge/wiki/SSH%20keys  一文的“Key Generation: PuTTY" 和"Key Generation: OpenSSH"兩個章節。

回到本節開始的問題,如果不使用密碼,使用密鑰認證的話就不再需要反覆輸入密碼了(參考下文的實驗四)!如果你的密鑰設定了密碼短語,那麼每次訪問雖然不要求輸入密碼了,但是卻被要求輸入密碼短語(參考下文的實驗五),解決方案就是開啟pageant,添加你的私密金鑰,緩衝密碼短語,這樣即安全又不會要求重複輸入密碼或密碼短語(參考下文中的實驗五),是最普遍的配置方式。

六、一系列的驗證實驗

在瞭解了TortoiseSVN訪問SSH+SVN協議時的工作方式,以及plink,putty和使用密鑰方式進行認證之後,我們把這些結合在一起,來做一系列有趣的驗證實驗,通過實驗我可以清晰地體會出這些工具到底是如何工作的了。需要特別說明的是:實驗四,五,六需要自已產生公開金鑰和私密金鑰,產生方法參考http://sourceforge.net/apps/trac/sourceforge/wiki/SSH%20keys  一文的“Key Generation: PuTTY" 和"Key Generation: OpenSSH"兩個章節;同時,還需要將公開金鑰上傳到sourceforge伺服器,sourceforge管理密鑰的頁面是http://sourceforge.net/account/services,你可以在這裡找到上傳頁面。長傳之後最長需要等待10分鐘,新的密鑰就會生效了。

實驗一:

清空PuTTY裡儲存的所有session, 關閉Pageant。使用Tortoise直接存取svn+ssh://youraccount@svn.code.sf.net/p/yourproject/code/,
現象:可以訪問,但需要不停地輸入sourceforge帳號密碼。
結論:每一次請求發生時,Tortoise(確切地說是TortisePlink)都使用帳號youraccount先串連到遠程ssh主機svn.code.sf.net,由於沒有任何其他地方儲存密碼或使用密鑰,所以每次串連都需要輸入密碼。

實驗二:
清空PuTTY裡儲存的所有session, 關閉Pageant。去掉原地址中的帳號部分,使用Tortoise訪問svn+ssh://svn.code.sf.net/p/yourproject/code/,
現象:無法訪問
結論:既未在地址中指定登入帳號,又沒有對應的putty session, Tortoise不知道使用什麼帳號登入,所以串連失敗。

實驗三:
清空PuTTY裡儲存的所有session,然後建立一個名為svn.code.sf.net的session,主機地址為svn.code.sf.net,  特別地,在Connection->Data頁面的Auto-login username的輸入框中填入你的帳號youraccount,儲存此session,關閉Pageant,同樣去掉原地址中的帳號部分,使用Tortoise訪問svn+ssh://svn.code.sf.net/p/yourproject/code/,
現象:可以訪問,但需要不停地輸入sourceforge帳號密碼。
結論:雖然在地址中沒有指定登入帳號,但是Tortoise卻找到了對應的putty session,既然session中設定了帳號,那麼Tortoise就使用這個帳號登入了,當然,密碼是不能儲存的,所以每次請求都需要輸入密碼。

實驗四:(特別說明:實驗四中匯入的密鑰是不要求輸入密碼短語(passphrase)的!)
清空PuTTY裡儲存的所有session,然後建立一個名為svn.code.sf.net的session,主機地址為svn.code.sf.net,  特別地,產生一對公開金鑰、私密金鑰對(私密金鑰無passphrase),將公開金鑰上傳到sourceforge, 在本地putty的Connection->Data頁面的Auto-login username的輸入框中填入你的帳號youraccount,在Connection->SSH->Auth頁面的Private key file for authentication輸入框中輸入你的私密金鑰位置,儲存此session,關閉Pageant,同樣去掉原地址中的帳號部分,使用Tortoise訪問svn+ssh://svn.code.sf.net/p/yourproject/code/,
現象:可以訪問,而且不需要輸入sourceforge帳號密碼。
結論:Tortoise從對應的putty session中擷取了帳號和密鑰,那麼Tortoise就使用這個帳號和密鑰登入,由於指定了密鑰,ssh使用密鑰進行驗證,所以不再需要輸入密碼!

實驗五:(特別說明:實驗五中匯入的密鑰是有密碼短語(passphrase)的!)
清空PuTTY裡儲存的所有session,然後建立一個名為svn.code.sf.net的session,主機地址為svn.code.sf.net,  特別地,產生一對公開金鑰、私密金鑰對(私密金鑰含passphrase),將公開金鑰上傳到sourceforge, 在本地putty的Connection->Data頁面的Auto-login username的輸入框中填入你的帳號youraccount,在Connection->SSH->Auth頁面的Private key file for authentication輸入框中輸入你的私密金鑰位置,儲存此session,關閉Pageant,同樣去掉原地址中的帳號部分,使用Tortoise訪問svn+ssh://svn.code.sf.net/p/yourproject/code/,
現象:可以訪問,不需要輸入帳號密碼,但需要不停地輸入passphrase。
結論:Tortoise從對應的putty session中擷取了帳號和密鑰,那麼Tortoise就使用這個帳號和密鑰登入,由於指定了密鑰,ssh使用密鑰進行驗證,所以不再需要輸入密碼!但是,由於密鑰設定了passphrase, 因此每次請求時必須輸入。

實驗六:
保留實驗五的所有設定,開啟pageant工具,匯入實驗五使用的私密金鑰,在匯入時要求輸入一次密碼短語。然後重新使用Tortoise訪問svn+ssh://svn.code.sf.net/p/yourproject/code/,
現象:可以訪問,不需要輸入帳號密碼,也不再需要輸入passphrase。
結論:Tortoise從對應的putty session中擷取了帳號和密鑰,那麼Tortoise就使用這個帳號和密鑰登入,由於指定了密鑰,ssh使用密鑰進行驗證,所以不再需要輸入密碼!而由於密鑰和passphrase被加入到了pageant, 換句話說就是使用pageant這個認證代理認證過了密鑰和passphrase,因此每次請求時通過代理實現了密鑰和passphrase的配對認證,因此不再需要輸入passphrase。

七、步入正軌,SVN+SSH常規配置和串連方式 (密鑰認證+Pageant緩衝密碼短語)

其實到這裡所有的都已經講完了,在Windows下,SVN+SSH的常規配置和串連方式就是通過PuTTY配置好與SVN+SSH://  地址中指定的主機名稱同名的session,設定帳號名和密鑰,再開啟 Pageant緩衝密碼短語就可以了,具體參考實驗六就可以了。

八、配置Subclipse使之能訪問SVN+SSH協議的Repository

如果TortoiseSVN的配置已經成功,那麼Subclipse的配置就非常簡單了,因為Subclipse也支援ToitoisePlink,只要我們告訴Subclipse ToitoisePlink的位置就可以了,具體方法為:本家配置一個系統內容變數,變數名為SVN_SSH,值是TortoisePlink的路徑,例如 C:\\Program Files\\TortoiseSVN\\bin\\TortoisePlink.exe,注意路路分隔字元是\\.然後配置Subclipse外掛程式使用JavaHL,重啟eclipse即可。

九、代理環境下的配置

最後補充一點:如果你的工作網路是使用代理上網的,那麼你需要在建立putty saved session時,在Connectiong->Proxy項上設定Proxy 伺服器的地址、連接埠和類型,從這個頁面的proxy command輸入框中可以看到putty也是使用了connect實現了ssh代理的。同時,在Tortotise也需要設定代理。Subclipse的代理設定請參考此文 http://blog.csdn.net/bluishglc/article/details/8658508

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.