Bitbucket Pipelines连接DigitalOcean Droplet SSH登录失败解决
报错根因
atlassian/ssh-run 管道默认优先走SSH密钥认证逻辑,不会自动读取你配置里的PASSWORD字段走密码认证,只要没在Pipelines里配置默认SSH密钥就会直接抛出✖ No default SSH key configured in Pipelines错误,你写的密码参数根本没被触发使用。
修复方案
优先选SSH密钥认证的方式,安全性更高,也是Bitbucket官方推荐的做法,实在需要用密码认证再看第二个方案。
方案1:配置SSH密钥认证(推荐)
- 本地终端执行以下命令,生成专门给部署用的无密码ed25519密钥对:
执行后一路回车即可,会在本地用户目录下生成ssh-keygen -t ed25519 -C "bitbucket-pipeline-deploy" -f ~/bb-deploy-keybb-deploy-key(私钥)和bb-deploy-key.pub(公钥)两个文件。 - 把公钥上传到你的DigitalOcean Droplet,执行命令时替换成你实际的服务器公网IP:
按提示输入root密码,完成公钥写入,这步做完之后用这个私钥就能免密登录服务器。ssh-copy-id -i ~/bb-deploy-key.pub root@<你的Droplet公网IP> - 登录Bitbucket打开对应仓库,进入 Repository settings → Pipelines → SSH keys 页面:
- 选择Use my own keys,把
bb-deploy-key里的私钥内容粘贴到私钥输入框,bb-deploy-key.pub里的公钥内容粘贴到公钥输入框,点击保存。 - 同一页面下拉到Known hosts板块,输入你的Droplet公网IP,点击Fetch自动拉取服务器主机指纹并保存,避免首次SSH连接时因为主机确认提示卡住流水线。
- 选择Use my own keys,把
- 修改
bitbucket-pipelines.yml里的部署步骤,删掉无效的PASSWORD字段,修正SERVER为实际IP,改完片段如下:- step: name: deploy deployment: test script: - echo "Deploying master to live" - pipe: atlassian/ssh-run:0.1.4 variables: SSH_USER: 'root' SERVER: '替换成你Droplet的实际公网IP' COMMAND: 'ci-scripts/pull-deploy-master.sh' MODE: 'script' - 把修改后的配置提交推送到仓库,重跑流水线即可正常连接部署。
方案2:强制使用密码认证(不推荐,存在泄露风险)
如果一定要用密码登录,需要先安装sshpass依赖,再加SSH参数强制禁用公钥认证、启用密码认证,修改配置如下:
- step: name: deploy deployment: test script: - echo "Deploying master to live" - apt-get update && apt-get install -y sshpass - pipe: atlassian/ssh-run:0.1.4 variables: SSH_USER: 'root' SERVER: '替换成你Droplet的实际公网IP' PASSWORD: '你的root用户密码' COMMAND: 'ci-scripts/pull-deploy-master.sh' MODE: 'script' SSH_ARGS: '-o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no'
注意:不要把密码明文硬编码在配置文件里,建议把密码存在Bitbucket仓库的Pipeline变量中,用变量名引用,避免代码泄露时密码同时被盗。
额外排查点
- 确认DigitalOcean后台的防火墙、服务器内部的ufw防火墙都放开了22端口,允许Bitbucket流水线的出口IP访问,否则会出现连接超时。
- 登录服务器确认
ci-scripts/pull-deploy-master.sh路径正确,且已经给脚本加了可执行权限(执行chmod +x ci-scripts/pull-deploy-master.sh),避免SSH连接成功后脚本执行失败。
内容的提问来源于stack exchange,提问作者user14880125
相关产品推荐
相关产品推荐

