SSH 教學
(版本 0.5,(c) Marc Logemann)
由於許多新的 Subversion 使用者在嘗試將 Subversion 與 SSH 一起使用時遇到問題,因此我編寫了此問題的教學。也許我稍後會擴充此教學並將其提交給 Subversion 或 TortoiseSVN 文件。
-------------------------
我們的場景
-------------------------
伺服器:Linux 或類 Unix 系統
用戶端:Windows 2000/XP(或變體)
-----------------------------------------
安裝 Subversion(伺服器)
-----------------------------------------
在這裡我不會深入探討細節,因為官方 Subversion 文件中已詳細介紹了這個主題。但無論如何,我想指出一件事。如果您從原始碼編譯 Subversion,並且沒有為 ./configure 提供任何參數,Subversion 會在 /usr/local 下建立一個「bin」目錄,並將其二進位檔案放在那裡。只要您將 Subversion 作為守護程式執行,這就沒有問題,但如果您想將通道模式與 SSH 一起使用,您必須注意透過 SSH 登入的使用者可以執行 svnserve 程式和一些其他二進位檔案。因此,要麼將 /usr/local/bin 放入 PATH 變數中,要麼為您的二進位檔案建立符號連結到 /usr/sbin 目錄或任何其他常用於 PATH 中的目錄。
為了確保一切正常。稍後使用 SSH 和目標使用者登入系統,然後輸入:「which svnserve」。此命令應告訴您 svnserve 是否可訪問。
要檢查 svnserve 是否可透過 ssh 訪問,請輸入:「ssh svnserve」
此外,本文檔假設您已經使用「svnadmin create」建立了一個 Subversion 儲存庫。請注意儲存庫的 ACL,以減少可能的問題。檢查每個透過 SSH 進入的使用者是否具有使用儲存庫的適當權限。
有時您的系統在全域 bashrc 檔案中放入了 'mesg y'。這將導致與 TortoisePlink 的連線失敗,因為該行將導致 SSH 拋出錯誤「stdin: is not a tty」。您必須從 bashrc 檔案中刪除該行。
------------------------------------------------
OpenSSH 和憑證(伺服器)
------------------------------------------------
同樣,我不會詳細介紹 OpenSSH 安裝,因為其他地方有更好的介紹。但在大多數系統上,啟用 SSH 只是安裝 RPM 的問題。如果您從託管公司租用預先安裝的 Linux 伺服器,則 SSH 很可能已安裝。為了確保一切就緒,請輸入:「ps xa | grep sshd」並留意 SSH 作業。
假設 OpenSSH 已安裝,最重要的步驟之一是建立用於身份驗證的金鑰對。有兩種可能的方式來建立金鑰。第一種方法是使用 puttygen(putty 系列的程式)建立金鑰,將公鑰上傳到您的伺服器,並將私鑰與 putty 一起使用。由於這種方法存在一些問題,我更喜歡另一種方法。這種方法使用 OpenSSH 工具 ssh-keygen 建立金鑰對,將私鑰下載到您的用戶端,並將私鑰轉換為 putty 樣式的私鑰。
讓我們逐步執行此操作
- 登入您的伺服器
- 輸入:ssh-keygen -b 1024 -t dsa -N passphrase -f mykey
- 將「passphrase」更改為只有您知道的秘密關鍵字
- 輸入:ls -l mykey*
我們剛剛建立了一個具有 1024 位元金鑰的 SSH2 DSA 金鑰。您將看到兩個檔案。一個名為「mykey」,另一個名為「mykey.pub」。您可能已經猜到,.pub 檔案是公鑰檔案,另一個是私鑰檔案。接下來在伺服器上建立一個具有主目錄的使用者
- 輸入:useradd -m myuser
您將在 /home 下有一個名為「myuser」的目錄,在「myuser」中建立一個名為「.ssh」的新目錄
- 輸入:cd /home/myuser
- 輸入:mkdir .ssh
然後轉到您建立金鑰的目錄,並使用以下命令將公鑰複製到 .ssh 使用者資料夾
- 輸入:cp mykey.pub /home/myuser/.ssh/authorized_keys
或者如果您已經有一些金鑰到位
- 輸入:cat mykey.pub >> /home/myuser/.ssh/authorized_keys
請注意檔案名稱,它確實必須是「authorized_keys」。在一些舊的 OpenSSH 實作中,它是「authorized_keys2」。現在將私鑰檔案下載到您的用戶端電腦。請記住,該檔案是「mykey」
------------------------------------------------------------
SSH 金鑰產生和連線檢查(用戶端)
------------------------------------------------------------
從這個網站獲取我們在 Windows 上執行 SSH 所需的工具
https://www.chiark.greenend.org.uk/~sgtatham/putty/
只需轉到下載區並獲取「Putty」、「Plink」、「Pageant」和「Puttygen」
為了使用我們從伺服器取得的私鑰,我們必須將其轉換為 putty 格式。這是因為私鑰檔案格式未由某些標準機構指定。為此,我們只需打開「puttygen」並打開「Conversions」選單,然後選擇「Import Key」。然後瀏覽到您從伺服器取得的檔案「mykey」,輸入您在建立金鑰時提供的密碼。最後,按一下「Save private key」並將檔案另存為「mykey.PPK」在磁碟上的某個位置。
現在我們已準備好首次使用此金鑰來測試連線。為了做到這一點,我們打開程式「putty」並建立一個新的會話,如下所示
Session->HostName:您的伺服器的主機名稱或 IP 位址
Session->Protocol:SSH
Session->Saved Sessions:MyConnection
SSH->Preferred SSH Protocol version:2
SSH->Auth->Private Key file for auth:$PATH$\mykey.PKK(將 $PATH$ 替換為 mykey.PKK 檔案的實際路徑)
然後返回 Session 標籤並點擊「save」按鈕。您將在可用連線列表中看到「MyConnection」。
接下來點擊「open」,您應該會看到 telnet 登入提示。使用「myuser」作為使用者名稱(當然不帶雙引號),如果一切正常,您無需為系統提供密碼。如果系統仍然需要密碼,則表示出了問題。請參閱本教學的「除錯」章節。
-----------------------------------------------
使用 TortoiseSVN 測試 SSH(用戶端)
-----------------------------------------------
安裝 TortoiseSVN 後,在 Windows 檔案總管中的某個資料夾內按一下滑鼠右鍵。您將看到一個名為 TortoiseSVN->RepoBrowser 的選單項目。開啟瀏覽器後,您必須輸入如下 URL
svn+ssh://myuser@MyConnection/usr/local/repos
讓我們簡要討論一下 URL(如果您需要更多資訊,請查看 Subversion 文件)。Schema 名稱是「svn+ssh」,這告訴 Tortoise 如何處理對伺服器的請求。在雙斜線之後,您可以提供嘗試連線到伺服器的使用者,在我們的例子中是「myuser」。在「@」之後,我們提供我們的 putty 會話名稱。此會話名稱包含所有詳細資訊,例如在哪裡找到私鑰以及伺服器的 IP 或 DNS。最後,我們必須提供儲存庫的完整路徑。假設 Subversion 儲存庫位於 /usr/local/repos
如果您提交 URL,您將在下一個螢幕上看到一個已開啟的樹狀結構,直到節點「repos」。然而,尚未建立任何連線,因為樹狀結構表示來自提供的 URL。當您點擊「repos」前面的「+」按鈕時,將建立連線,如果您在儲存庫中沒有任何內容,您將看到「+」符號消失,或者您將看到您已匯入的專案和檔案。
現在,您應該有一個與 TortoiseSVN 結合運作的 SSH 通道。
-----------------------------------------------
組態變體 (pageant)
-----------------------------------------------
現在我將繼續展示一些組態變體,這些變體在日常工作中可能會有所幫助。
簡化 TortoiseSVN 中 URL 的一種方法是在 putty 會話中設定使用者。為此,您必須在 putty 中載入您已定義的會話「MyConnection」,並進行以下輸入
connection->Auto Login username:myuser
然後像以前一樣儲存您的 putty 會話,並在 Tortoise 內嘗試以下 URL
svn+ssh://MyConnection/usr/local/repos
這次我們僅將 putty 會話「MyConnection」提供給 TortoiseSVN 使用的 SSH 用戶端 (TortoisePlink.exe)。此用戶端能夠檢查會話的所有必要詳細資訊,例如登入使用者或伺服器 IP。
有些人喜歡使用 pageant 來儲存他們的所有金鑰,事實上,每個教學都解釋說將金鑰放在那裡很重要。事實上,由於 putty 會話能夠儲存金鑰,因此您在正常業務中不需要 pageant。但想像一下,您想要儲存多個使用者的金鑰,在這種情況下,您必須根據您嘗試連線的使用者,一遍又一遍地編輯 putty 會話。對於這種情況,pageant 非常有意義,因為當 putty、plink、TortoisePlink 或任何其他基於 putty 的工具嘗試連線到 SSH 伺服器時,它會檢查 pageant 攜帶的所有私鑰以啟動連線。
對於此任務,只需啟動 pageant 並新增金鑰。它應該是您在上面的 putty 會話中定義的同一個私鑰。如果您使用 pageant 進行私鑰儲存,您可以刪除 putty 會話中的「SSH->Auth->Private Key file for auth」部分。您當然可以為其他系統或其他使用者新增更多金鑰。如果您不想在每次重新啟動用戶端後重複此程序,您應該將 pageant 放在 Windows 安裝的自動啟動群組中。您可以將帶有完整路徑的金鑰作為命令列引數附加到 pageant.exe。
連線到 SSH 伺服器的最後一種方法是僅在 TortoiseSVN 中使用此 URL
svn+ssh://[email protected]/usr/local/repos
如您所見,我們不使用已儲存的 putty 會話,而是使用 IP 位址作為連線目標。我們也提供使用者,但您可能會問如何找到私鑰檔案。由於 TortoisePlink.exe(TortoiseSVN 的標準 SSH 用戶端)是 putty 套件中 plink 工具的修改版本,因此 TortoiseSVN 也會尋找正在運行的 pageant,並將嘗試儲存在 pageant 中的所有金鑰。
----------------------------------------
意見回饋
-------------------
對於本教學的評論或更正,請使用 TortoiseSVN 郵件列表
這是原始文件的副本,原始文件位於 http://www.logemann.org/day/archives/000099.html(頁面已移除)
感謝 Marc!