如何在需要HTTP授权时,通过Fabric发起的SSH连接克隆Mercurial仓库?

0 投票
2 回答
836 浏览
提问于 2025-04-15 23:51

我第一次尝试使用fabric,感觉还不错。但是在我的部署脚本中,有个地方我想克隆一个mercurial的代码库。到了这个步骤时,我遇到了一个错误:

错误:需要http授权

我的代码库需要http授权,而fabric并不会提示我输入用户名和密码。我可以通过把我的代码库地址从:

https://hostname/repository

改成:

https://user:password@hostname/repository

来解决这个问题。但出于各种原因,我更希望不这样做。有没有其他方法可以绕过这个问题呢?

2 个回答

0

根据你的fabfile(一个配置文件),你可能可以换个角度来看这个问题。与其在远程系统上执行hg clone命令,不如先在本地系统上运行你的mercurial命令,然后通过fabric把你构建的文件传输过去。

具体来说,你可以使用fabric的local()命令来克隆mercurial仓库,然后运行'hg archive'命令来准备一个压缩包。接着,你可以用fabric的put()命令上传这个压缩包,再用fabric的run()命令在正确的位置解压它。

克隆、打包和上传的代码示例可能看起来像这样:

from fabric.api import local

def task():
    local("hg clone ssh://hg@host/repo tmpdir")
    with lcd("tmpdir"):
        local("hg archive ../repo.tgz")
    local("rm tmpdir")
    put("repo.tgz")
2

这里有四种选择,每种都有不同的安全性权衡,并且需要不同程度的系统管理技能:

对于较新的Mercurial版本,你可以把密码放在本地用户的.hgrc文件的[auth]部分。虽然密码还是以明文形式保存在磁盘上,但至少不会出现在网址里。

或者

你可以在本地设置一个HTTP代理,这个代理在本地不需要认证,而在与远程服务器通信时会为你处理认证。

或者

如果你能修改托管服务器的配置(比如Apache),你可以设置它在从本地访问时不需要用户名和密码,然后使用SSH隧道让本地机器看起来像是从localhost访问服务器:

ssh -L 8080:localhost:80 user@hostname # run in background and leave running

然后让Fabric连接到http://localhost:8080/repository

或者

较新的Mercurial支持客户端证书进行认证,所以你可以配置你的Apache来接受这些证书作为授权/认证,然后调整你的本地hg来提供这个证书。

撰写回答