SSH HowTo
(修订版 0.5,作者:(c) Marc Logemann)
由于许多新的 subversion 用户在尝试将 subversion 与 SSH 一起使用时遇到问题,因此我编写了一个关于该问题的 HowTo。也许我稍后会扩展此 HowTo 并将其提交给 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”作为用户名(当然不带双引号),如果一切正常,您不必为系统提供密码。如果系统仍然需要密码,则说明出了问题。请参阅本 HowTo 的调试部分。
-----------------------------------------------
使用 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”,并进行以下输入
connection->Auto Login username:myuser
然后像以前一样保存您的 putty 会话,并在 Tortoise 中尝试以下 URL
svn+ssh://MyConnection/usr/local/repos
这次我们只向 SSH 客户端 TortoiseSVN 使用的客户端 (TortoisePlink.exe) 提供 putty 会话“MyConnection”。此客户端能够检查会话的所有必要详细信息,例如登录用户或服务器 IP。
有些人喜欢使用 pageant 来存储他们的所有密钥,事实上,每个 howto 都解释说将密钥放在那里很重要。事实上,由于 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 中存储的所有密钥。
----------------------------------------
反馈
-------------------
对于关于此 howto 的评论或更正,请使用 TortoiseSVN 邮件列表
这是原始文件的副本,原始文件位于 http://www.logemann.org/day/archives/000099.html(页面已删除)
感谢 Marc!