ssh - hg clone 通过使用 ssh 的登录服务器

标签 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

感谢您的帮助。

最佳答案

这在原则上是可行的,但底层的 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/

相关文章:

mysql - 尝试通过 SSH 连接到远程数据库时 SSH 端口转发失败

authentication - SSH "Failed to add the host to the list of known hosts"Openshift

Mercurial - 如何将 repo 的源代码导出到生产站点?

mercurial - 无法中止中断的 rebase

python - 如何向 Mercurial 扩展中的现有命令添加命令选项?

networking - 如何在命名空间中创建 SSH 服务器?

git - 如何在没有ssh auth的情况下设置git服务器

mercurial - Mercurial 6 与其他 VCS 的互操作性

bash - 在 ssh 中转义 awk 命令

mercurial - 我可以 "break"hg 工作副本,以便在提交之前必须将其恢复吗?