如何在需要HTTP授权时,通过Fabric发起的SSH连接克隆Mercurial仓库?
我第一次尝试使用fabric,感觉还不错。但是在我的部署脚本中,有个地方我想克隆一个mercurial的代码库。到了这个步骤时,我遇到了一个错误:
错误:需要http授权
我的代码库需要http授权,而fabric并不会提示我输入用户名和密码。我可以通过把我的代码库地址从:
改成:
来解决这个问题。但出于各种原因,我更希望不这样做。有没有其他方法可以绕过这个问题呢?
2 个回答
根据你的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")
这里有四种选择,每种都有不同的安全性权衡,并且需要不同程度的系统管理技能:
对于较新的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来提供这个证书。