我正在尝试与一些不在我的机构中并且不允许通过 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
感谢您的帮助。
最佳答案
这在原则上是可行的,但底层的 ssh 链接必然有点脆弱;如果您所在机构的政策允许在外部服务器上托管,我会首先考虑该选项。
也就是说,是的,这是可以做到的。首先,您的用户需要至少从您的登录服务器登录到您的存储库服务器一次(如果您的设置受限,只需克隆一次 hg 存储库——然后将其丢弃——也可以)。这将在 ~/.ssh/known_hosts
中为存储库服务器设置一个条目。 ,这是 ssh 链接在没有用户提示的情况下继续进行所必需的。如果你的存储库的服务器 ssh 配置发生变化,这个条目将变得无效,他们将不得不在从 ~/.ssh/known_hosts
中删除条目后重复这个过程。或删除 ~/.ssh/known_hosts
完全。
其次,他们需要在他们的机器上启用身份验证代理转发(否则他们会收到输入密码或口令短语的提示,但无法输入)。为此,他们可以执行以下操作之一:
在他们的 ~/.ssh/config
中添加一个条目比如:
Host lserve
User uid
HostName loginserver
ForwardAgent true
此方法的替代方法是通过将以下条目添加到您的 ~/.hgrc
来告诉 Mercurial 使用代理转发或 .hg/hgrc
:
[ui]
ssh = ssh -A
在全局范围内这样做的缺点 ~/.hgrc
是代理转发将为每个存储库完成,包括那些您可能不希望这样做的存储库。设置 ~/.ssh/config
是更简洁的选项,还允许您简化 repo URL。
您还可以使用 --ssh "ssh -A"
命令行选项,但需要大量输入。
根据他们编写 repo URL 的方式,其他配置可能会更好。以上将允许使用 ssh://lserver//path/to/repo
网址。但关键部分是 ForwardAgent true
行,这意味着远程服务器将查询其本地计算机以进行身份验证,而不是要求密码或通行短语。不用说,这也意味着他们需要在本地设置 ssh 代理身份验证。
接下来,您必须在 loginserver
上创建一个 shell 脚本转发实际的hg
要求。你可以把它放在任何你喜欢的地方(假设它在 /path/to/forward-hg
中:
#!/bin/sh
ssh repositoryserver hg "$@"
完成此操作后,您的 friend 现在可以按如下方式访问远程存储库:
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 可执行文件)并通过标准输入和标准输出与此进程通信。通过劫持$REMOTEHG
, 这实际上变成了 ssh repositoryserver hg serve --stdio
,它将改为在存储库服务器上执行。同时 - 假设代理转发设置正确,这样密码提示等不会妨碍 - 本地 Mercurial 客户端将完全不知道这一点,并且只能通过 stdin 和 stdout 看到与存储库服务器的正常通信(这由登录服务器上的 ssh 守护程序原封不动地通过。
关于ssh - hg clone 通过使用 ssh 的登录服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34625150/