TortoiseSVN Logo

SSH 使用指南

(版本 0.5 由 (c) Marc Logemann)

由于许多新的 Subversion 用户在尝试使用 SSH 与 Subversion 配合时遇到了问题,因此我编制了此使用指南。也许我以后会扩展此使用指南,并将其提交给 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",打开 "转换" 菜单,然后选择 "导入密钥"。然后浏览到您从服务器获取的 "mykey" 文件,在创建密钥时输入您提供的密码。最后,单击 "保存私钥",并将文件保存为 "mykey.PPK",保存在磁盘上的某个位置。

现在,我们准备第一次使用此密钥来测试连接。为此,我们打开 "putty" 程序,并创建一个新的会话,如下所示:

会话->主机名: 服务器的主机名或 IP 地址
会话->协议: SSH
会话->保存的会话: MyConnection
SSH->首选 SSH 协议版本: 2
SSH->身份验证->用于身份验证的私钥文件: $PATH$\mykey.PKK (将 $PATH$ 替换为 mykey.PKK 文件的实际路径)

然后返回到“会话”选项卡并点击“保存”按钮。您将在可用连接列表中看到“MyConnection”。

接下来点击“打开”,您应该会看到一个 telnet 登录提示。使用“myuser”作为用户名(当然不要加双引号),如果一切正常,您无需为系统提供密码。如果系统仍然要求输入密码,则说明出现错误。请参阅本操作指南的“调试”部分。

-----------------------------------------------
使用 TortoiseSVN(客户端)测试 SSH
-----------------------------------------------
安装 TortoiseSVN 后,右键单击 Windows 资源管理器中的某个文件夹。您将看到一个名为 TortoiseSVN->RepoBrowser 的菜单项。打开浏览器后,您需要输入以下格式的 URL:

svn+ssh://myuser@MyConnection/usr/local/repos

我们简要介绍一下 URL(如果您需要更多信息,请查看 Subversion 文档)。架构名称为“svn+ssh”,它告诉 Tortoise 如何处理对服务器的请求。在双斜杠之后,您可以提供尝试连接到服务器的用户,在本例中为“myuser”。在“@”之后,我们提供 Putty 会话名称。此会话名称包含所有详细信息,例如在哪里找到私钥以及服务器的 IP 或 DNS。最后,我们必须提供存储库的完整路径。假设 Subversion 存储库位于 /usr/local/repos

如果您提交 URL,您将在下一个屏幕上看到一个打开的树,直到节点“repos”。但是,尚未建立任何连接,因为树表示来自提供的 URL。当您点击“repos”前面的“+”按钮时,将建立连接,并且如果您在存储库中没有任何内容,您将看到“+”符号消失,或者您将看到您已经导入的项目和文件。

现在,您应该拥有一个与 TortoiseSVN 结合使用的运行 SSH 隧道。

-----------------------------------------------
配置变体(Pageant)
-----------------------------------------------
现在我将继续展示一些配置变体,这些变体在日常工作中可能会有所帮助。

在 TortoiseSVN 中简化 URL 的一种方法是在 PuTTY 会话中设置用户。为此,您需要在 PuTTY 中加载您已经定义的会话“MyConnection”,并进行以下设置:

连接 -> 自动登录用户名:myuser

然后像以前一样保存您的 PuTTY 会话,并在 Tortoise 中尝试以下 URL:
svn+ssh://MyConnection/usr/local/repos

这次我们只向 TortoiseSVN 使用的 SSH 客户端 (TortoisePlink.exe) 提供 PuTTY 会话“MyConnection”。该客户端能够检查会话以获取所有必要的详细信息,例如登录用户或服务器 IP。

有些人喜欢使用 Pageant 来存储所有密钥,事实上,每个教程都解释了将密钥放在那里很重要。实际上,由于 PuTTY 会话能够存储密钥,因此您在正常情况下不需要 Pageant。但想象一下,您想为多个用户存储密钥,在这种情况下,您需要根据要连接的用户反复编辑 PuTTY 会话。对于这种情况,Pageant 非常有用,因为当 PuTTY、Plink、TortoisePlink 或任何其他基于 PuTTY 的工具尝试连接到 SSH 服务器时,它会检查 Pageant 中携带的所有私钥以启动连接。

为此,只需启动 Pageant 并添加一个密钥。它应该与您在上面的 PuTTY 会话中定义的私钥相同。如果您使用 Pageant 来存储私钥,则可以删除 PuTTY 会话中的“SSH -> 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!