我正在尝试与不在我所在机构中的某些人合作,不允许通过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
感谢您的帮助。
答案 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守护进程不加改变地传递。