迁移至Ubuntu22.04 Droplet后Bitbucket Pipeline公钥权限拒绝问题
问题背景
从Ubuntu 18.04 Droplet迁移至DigitalOcean的Ubuntu 22.04 LTS Droplet,原Bitbucket Pipeline配置可正常运行,当前配置如下:
image: atlassian/default-image:latest pipelines: branches: master: - step: name: Deploy to dev script: - echo "Deploying to dev..." - ssh $SSH_USER@$SSH_HOST " cd $PROJECT_PATH && git pull origin master --rebase && composer install && php artisan migrate && php artisan config:cache && php artisan view:clear "
已完成以下操作但仍报错:
- 更换仓库SSH密钥对(本地可正常登录Droplet的
id_rsa/id_rsa.pub) - 更新指纹及仓库变量
- 尝试使用Bitbucket生成的密钥并添加至
dev用户的authorized_keys - 检查
.ssh目录及authorized_keys的权限、所有权,未发现异常
执行Pipeline时的错误信息:
ssh $SSH_USER@$SSH_HOST " cd $PROJECT_PATH && git pull origin master --rebase && composer install && php artisan migrate && php artisan config:cache && php artisan view:clear " Permission denied (publickey). N/A: version "v23" is not yet installed
一、SSH权限拒绝问题排查与解决
验证Pipeline环境的密钥加载状态
在Pipeline脚本中添加调试命令,确认密钥是否被正确识别:- step: script: - echo "Checking SSH key status..." - ls -la ~/.ssh/ - ssh -v $SSH_USER@$SSH_HOST "echo Connection test passed"通过输出日志查看密钥加载流程,确认是否使用了目标私钥。
检查Droplet的SSH服务配置
登录Droplet,编辑/etc/ssh/sshd_config,确保以下配置正确:PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 PasswordAuthentication no # 开启密码登录可能干扰密钥认证,建议关闭修改后重启SSH服务:
sudo systemctl restart sshd严格校准文件权限
SSH对权限要求苛刻,必须确保Droplet上的目录和文件权限符合规范:- 设置
.ssh目录权限:chmod 700 ~/.ssh - 设置
authorized_keys权限:chmod 600 ~/.ssh/authorized_keys - 修正所有权:
chown -R $USER:$USER ~/.ssh
- 设置
使用Bitbucket内置密钥管理
放弃手动上传本地密钥,改用Bitbucket生成的密钥对:- 进入仓库设置 > Pipelines > SSH keys
- 点击Generate keys生成新密钥对
- 将公钥复制到Droplet的
~/.ssh/authorized_keys中 - 确认仓库变量
SSH_HOST(Droplet IP/域名)和SSH_USER配置正确
二、Composer版本问题解决
错误提示version "v23" is not yet installed是因为Ubuntu 22.04默认Composer版本与项目要求不匹配,解决方法:
在Droplet上更新Composer到稳定版
登录Droplet执行:sudo composer self-update若更新失败,直接重新安装最新版:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" sudo mv composer.phar /usr/local/bin/composerPipeline中指定Composer版本(可选)
若项目需要特定版本的Composer,可在Pipeline脚本中添加:- composer self-update --2.2 # 根据项目需求调整版本号
三、Pipeline脚本优化(可选)
拆分远程命令、启用ssh-agent管理密钥,提升稳定性和调试性:
image: atlassian/default-image:latest pipelines: branches: master: - step: name: Deploy to dev script: - echo "Deploying to dev..." # 启动ssh-agent并加载私钥 - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - # 禁用主机密钥检查(仅用于可信主机) - mkdir -p ~/.ssh - echo "StrictHostKeyChecking no" >> ~/.ssh/config # 分步执行远程命令 - ssh $SSH_USER@$SSH_HOST "cd $PROJECT_PATH && git pull origin master --rebase" - ssh $SSH_USER@$SSH_HOST "cd $PROJECT_PATH && composer install --no-dev --optimize-autoloader" - ssh $SSH_USER@$SSH_HOST "cd $PROJECT_PATH && php artisan migrate --force" - ssh $SSH_USER@$SSH_HOST "cd $PROJECT_PATH && php artisan config:cache" - ssh $SSH_USER@$SSH_HOST "cd $PROJECT_PATH && php artisan view:clear"
注意:SSH_PRIVATE_KEY需作为仓库安全变量添加,值为私钥完整内容。
内容的提问来源于stack exchange,提问作者Angel Miladinov

