使用HTTP身份验证下载私有BitBucket存储库的zip文件

28

我正在撰写一个脚本,以便轻松部署应用程序。应用程序的代码存储在私人BitBucket代码库中。

我希望能够下载提交的zip文件。我尝试使用以下代码进行身份验证:

https://user:pass@bitbucket.org/user/repo/get/commit.zip

然而,它没有完成任务,而是重定向到BitBucket的登录页面。

7个回答

36

就我个人而言,我不想在我的脚本中输入密码来完成这个任务。因此,诀窍是在将公钥添加到你的Bitbucket账户后运行以下命令:

git archive --remote=ssh://git@bitbucket.org/your_bitbucket_username/your_repository.git --format=zip --output="name_of_your_desired_zip_file.zip" master

我在系统中有多个密钥,如果你也有的话,你需要在你的~/.ssh目录下创建一个配置文件,指定使用特定的密钥连接到Bitbucket。

~/.ssh/config

Host bitbucket.org
  StrictHostKeyChecking no
  IdentityFile /home/me/.ssh/my_private_key

2
这只是正确的身份验证方式,任何其他使用明文密码进行身份验证的方式都是错误的,除非您不关心安全。 - thomas

28

为了从命令行下载一个 私有的 Bitbucket 仓库的压缩副本,请使用以下命令:

curl --digest --user <username>:<password> https://bitbucket.org/<username>/<repository>/get/<branchname>.zip -o <branchname>.zip

其中<username><password>是Bitbucket帐户名和密码,<repository>是仓库名称,<branchname>是分支名称。如果你想要下载特定的提交,可以使用提交的SHA-1哈希代替<branchname>

--digest标志是为了您的安全性,并且强烈建议使用它。它完成身份验证,使得您的用户名和密码不会以明文形式发送。-o标志将curl命令的输出作为一个文件存储到磁盘上,而不是在终端屏幕上流式传输。

注意: Bitbucket的身份验证方案与wget不兼容。这就是为什么必须使用curl的原因。

对于公共 Bitbucket 存储库,命令如下:

curl https://bitbucket.org/<username>/<repository>/get/<branchname>.zip -o <branchname>.zip

或者,您可以使用wget来下载公共存储库,因为不需要身份验证:

wget https://bitbucket.org/<username>/<repository>/get/<branchname>.zip
另外除了.zip格式,您还可以下载.gz.bz2版本的存储库。只需在上面的代码中用.gz.bz2替换.zip即可下载您选择的压缩格式的存储库。

4
我尝试使用curl --digest --user <用户名>:<密码> https://bitbucket.org/<用户名>/<项目>/downloads/<文件名> -o <文件名>来从下载区下载,但是它没有起作用。有任何想法是为什么? - Faheem Mitha
1
@FaheemMitha,要从下载区下载文件,您需要添加“-L”选项,如下所示:curl -L --digest --user <username>:<password> https://bitbucket.org/<usename>/<project>/downloads/<filename> -o <filename> - user1027169
1
因为使用https,所以--digest是否必要? - amos
4
BitBucket已弃用并关闭了对摘要身份验证的支持。更多信息 - naXa stands with Ukraine
1
请注意,现在wget似乎可以使用Bitbucket的身份验证方案。请参见:laike9mmstra的答案。 - Jonny
显示剩余2条评论

11
--digest 标志对您的安全性非常重要,强烈建议使用该标志。它完成身份验证,以确保您的用户名和密码不会明文传输。
这不是真的。
Bitbucket 专门使用 TLS,因此在任何情况下都不会发送任何明文内容。因此,Digest 在 Basic Auth 上没有任何优势。事实上,考虑到 Digest 是服务器启动的,您需要额外的服务器往返来请求服务器提供的 nonce。
我们使用 Digest 已经过时了,并且自几年前停止提供未加密的 HTTP 访问以来就已经过时了,仅因为有基于 curl 的脚本执行 --digest,如 @GrowlTiger 建议的那样。
实际上,我们将在5月1日彻底关闭 Digest,之后 curl --digest 将无法使用。
更多信息可以在以下网址找到:https://blog.bitbucket.org/2015/04/03/fare-thee-well-digest-access-authentication/

2
这不是对初始问题的回答,而是对另一个回答的评论。请重新发布为对冒犯性回答的评论(或附加到问题本身)。 - Stéphane Gourichon

8

想要从Bitbucket私有仓库下载单个文件的人,我尝试了上面的方法,但都没有成功。最终,我使用下面的命令使其工作:

wget --user=<user> --password=<password> https://bitbucket.org/<user>/<repo>/raw/master/<filename>

3
这对我同样有效,不过我更喜欢使用 --ask-password 而不是 --password=<password>,这样就不会将我的密码以明文形式显示或存储在任何地方。 - Jonny

3

GrowlTigers的回答很好,更新一下:使用wget现在也似乎可以工作:

wget --user=<username> --password='<password>' https://bitbucket.org/<user>/<repo>/get/<filename>.tar.gz

1

1
我发现这在较新版本的Bitbucket中有效。
repository_list=" a b c"
for repository in ${repository_list}
do
    echo "Getting: ${repository}"
    curl --user userid:password \
         http://bitjira.xxx.com:7990/rest/api/latest/projects/WP/repos/${repository}/archive?format=zip  \
         -o ${repository}.zip
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接