1. 程式人生 > >SVN+SSH協議工作方式全解析,以Sourceforge為例講解如何在Windows下配置TortoiseSVN和Su

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

簡單地說,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://[email protected]/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] [[email protected]]host [command]

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

plink -pw 1234 [email protected] ls /

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

plink -pw yourpassword [email protected] 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://[email protected]/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 command輸入框中可以看到putty也是使用了connect實現了ssh代理的。同時,在Tortotise也需要設定代理。Subclipse的代理設定請參考此文 http://blog.csdn.net/bluishglc/article/details/8658508
           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述 你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文字居中 第二列文字居右 第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 現有任務
        已完成               :done,    des1, 2014-01-06,2014-01-08
        進行中               :active,  des2, 2014-01-09, 3d
        計劃一               :         des3, after des2, 5d
        計劃二               :         des4, after des3, 5d
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::

這將產生一個流程圖。:

  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎