如何通过SSH从Bitbucket/GitHub私有仓库下载文件并授权用户更新?
问题解答
一、用SSH实现更新分发:修复连接错误+可行方案
先说说你当前paramiko连接报错的问题——这是几个参数配置错了:
- 端口不对:Bitbucket的SSH服务用的是默认22端口,不是8080(8080一般是HTTP代理这类服务用的);
- 用户名错了:SSH连接Bitbucket仓库的固定用户名是
git,不是你写的那个下载URL; - 主机地址不该用IP:直接连
bitbucket.org就行,IP可能会变动,而且Bitbucket的SSH服务绑定在这个域名上。
修复后的代码示例如下:
import paramiko from paramiko.sftp_client import SFTPClient ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 正确连接Bitbucket SSH服务 ssh.connect( hostname='bitbucket.org', port=22, username='git', key_filename='C:/Users/Django/.ssh/id_rsa' # 用正斜杠避免转义麻烦,更简洁 ) # 方案1:用SFTP读取仓库内的versions.gz(假设文件在仓库的downloads目录下) sftp = ssh.open_sftp() # 这里的路径是仓库内的相对路径,比如你的仓库根目录下的downloads/versions.gz with sftp.open('downloads/versions.gz', 'rb') as f: versions_data = f.read() # 这里可以解析versions_data,获取最新版本的下载信息 # 方案2:直接克隆仓库到临时目录(适合需要完整仓库内容的场景) # stdin, stdout, stderr = ssh.exec_command('git clone git@bitbucket.org:Tysondogerz/ssh.git /tmp/ssh_repo') # 之后就可以从/tmp/ssh_repo/downloads/versions.gz读取文件 finally: ssh.close()
至于能不能用SSH实现你的流程:完全可以,但要分情况:
- 如果
versions.gz是存在仓库代码目录里的:用SSH克隆仓库或者SFTP直接读取都没问题,全程用SSH密钥认证,不需要密码; - 如果
versions.gz是Bitbucket Release里的下载文件:SSH不是最直接的方式,不过你可以把Release的下载链接存在仓库里,通过SSH拉取这个链接列表后再下载,或者用Bitbucket API结合访问令牌(但API是HTTPS的)。
二、授权他人访问私有Bitbucket仓库下载更新
Bitbucket根本没有“只能用公开仓库或基础认证”的限制,有好几种安全的方式授权他人访问:
- 添加仓库成员:在仓库的「Settings」→「Users and groups」里加对方的Bitbucket账号,给「Read」权限,对方就能用自己的账号+SSH密钥(或密码/访问令牌)拉取更新;
- 部署密钥:在仓库的「Settings」→「Deployment keys」里添加对方的SSH公钥,对方用对应的私钥就能通过SSH访问仓库,这种方式不需要对方有Bitbucket账号,适合给外部协作人员或自动化脚本用;
- App Passwords:如果对方习惯用HTTPS,让他在自己的Bitbucket账号里生成带「Repository read」权限的「App Password」,然后用
用户名:AppPassword作为基础认证信息拉取仓库; - 临时共享链接:Bitbucket支持生成私有仓库的临时共享链接,允许他人在限定时间内下载内容,适合临时分发更新。
内容的提问来源于stack exchange,提问作者user9155788
相关产品推荐
相关产品推荐

