使用ssh

时间:2016-01-06 03:30:04

标签: ssh mercurial

我正在尝试与不在我所在机构中的某些人合作,不允许通过VPN连接到内部网络,但是,允许使用ssh通过登录服务器。

即。协作者可以使用两个连续的ssh命令登录:

$ ssh loginserver
$ ssh repositoryserver

登录后,他们可以开始在存储库服务器上进行开发。但是,他们希望进行克隆,远程进行修改,然后推送更改。

我知道可以通过ssh运行mercerial命令,这对我来说很好(因为我在网络上)。即:

$ hg clone ssh://uid@repositoryserver//path/to/repo

但是,有没有办法通过登录服务器运行命令?

类似的东西:

$ hg clone ssh://uid@loginserver ssh://uid@repositoryserver//path/to/repo

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这原则上是可行的,但潜在的ssh链接必然有点脆弱;如果您所在机构的政策允许在外部服务器上托管,我会首先考虑该选项。

那说,是的,可以做到。首先,您的用户需要至少从登录服务器登录您的存储库服务器一次(如果您有一个受限制的设置,只需克隆一次hg存储库 - 然后将其丢弃 - 也将起作用)。这将在~/.ssh/known_hosts中为存储库服务器设置一个条目,这是ssh链接在没有用户提示的情况下继续进行所必需的。如果存储库的服务器ssh配置发生变化,则此条目将变为无效,并且必须在从~/.ssh/known_hosts删除条目或完全删除~/.ssh/known_hosts后重复此过程。

其次,他们需要在他们的计算机上启用身份验证代理转发(因为否则会提示他们输入密码或密码,但无法输入密码或密码)。为此,他们可以执行以下操作之一:

~/.ssh/config添加条目,例如:

Host lserve
User uid
HostName loginserver
ForwardAgent true

此方法的替代方法是通过将以下条目添加到~/.hgrc.hg/hgrc来告诉Mercurial使用代理转发:

[ui]
ssh = ssh -A

在全局~/.hgrc中执行此操作的缺点是,将为每个存储库执行代理转发,包括您可能不需要的存储库。设置~/.ssh/config是更清晰的选项,还允许您简化回购URL。

您也可以使用--ssh "ssh -A"命令行选项,但这需要输入很多内容。

根据他们编写repo URL的方式,其他配置可能会更好。以上内容允许使用ssh://lserver//path/to/repo个网址。但关键部分是ForwardAgent true行,这意味着远程服务器将查询其本地计算机进行身份验证,而不是要求密码或密码短语。不用说,这也意味着他们需要在本地设置ssh代理身份验证。

接下来,您必须在loginserver上创建一个转发实际hg请求的shell脚本。你可以把它放在任何你喜欢的地方(让我们假设它在/path/to/forward-hg

#!/bin/sh
ssh repositoryserver hg "$@"

完成此操作后,您的朋友现在可以按如下方式访问远程存储库:

hg clone --remotecmd /path/to/forward-hg ssh://lserve//path/to/repo
hg push --remotecmd /path/to/forward-hg
hg pull --remotecmd /path/to/forward-hg
hg incoming --remotecmd /path/to/forward-hg
hg outgoing --remotecmd /path/to/forward-hg

因为这需要大量输入,您可能需要创建别名或在本地.hg/hgrc中输入一个条目(注意:hg clone无法执行此操作,您仍需输入它或者创建一个hg rclone别名)。此条目将是:

[ui]
remotecmd = /path/to/forward-hg

并告诉Mercurial向所有支持它的命令添加必需的--remotecmd选项,并在该存储库上运行(注意:请勿将此条目放在用户的~/.hgrc中,仅在存储库中 - 特定的)。

最后,这就是为什么这样做的原因:当访问远程存储库时,Mercurial将基本上尝试启动$REMOTEHG serve --stdio(其中$REMOTEHG是远程Mercurial可执行文件)并通过stdin和stdout与此进程通信。通过劫持$REMOTEHG,这将变为有效ssh repositoryserver hg serve --stdio,它将在存储库服务器上执行此操作。同时 - 假设代理转发设置正确,以便密码提示等不会妨碍 - 本地Mercurial客户端将完全不知道这一点,只能通过stdin和stdout看到与存储库服务器的正常通信(通过登录服务器上的ssh守护进程不加改变地传递。