使用appleboy/ssh-action部署Laravel至DigitalOcean时SSH认证失败求助
以下是针对你遇到的ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain错误的排查和解决步骤:
检查SSH私钥格式完整性
确认GitHub Secrets中存储的SSH_KEY是完整的私钥文件内容,必须包含开头的-----BEGIN OPENSSH PRIVATE KEY-----和结尾的-----END OPENSSH PRIVATE KEY-----,且中间的密钥行没有缺失或多余空格。复制私钥时容易漏掉首尾标记或换行,导致密钥无效。你可以在本地将私钥保存为临时文件,执行ssh-keygen -y -f 私钥文件名验证,如果命令能输出对应公钥,说明私钥格式正常;若报错则需重新导出正确的私钥。确认服务器端公钥配置
注意你能从服务器克隆GitHub仓库是服务器→GitHub的单向认证,而当前是GitHub Actions→服务器的反向认证,两者无关。需登录DigitalOcean Droplet,切换到${{ secrets.SSH_USERNAME }}对应的用户,检查~/.ssh/authorized_keys文件是否包含该私钥对应的公钥:- 公钥必须完整,结尾可添加注释(如
github-actions-deploy)方便识别; ~/.ssh目录权限需设为700,authorized_keys文件权限设为600,否则SSH会拒绝使用该密钥。
- 公钥必须完整,结尾可添加注释(如
检查服务器SSH服务配置
编辑服务器的/etc/ssh/sshd_config文件,确保以下配置项正确:PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2修改后执行
sudo systemctl restart sshd重启SSH服务生效。如果之前禁用了密码认证,可临时开启PasswordAuthentication yes测试,排除密钥问题后再关闭。添加调试日志定位问题
在appleboy/ssh-action的配置中加入debug: true,获取详细的SSH认证日志:- name: Deploy to testing server uses: appleboy/ssh-action@master with: host: ${{ secrets.SSH_HOST}} username: ${{ secrets.SSH_USERNAME}} key: ${{secrets.SSH_KEY}} debug: true script: | cd /pathOfTheProject php artisan down git stash git checkout testing git pull npm install --force npm run build composer update --optimize-autoloader php artisan migrate --force php artisan optimize:clear php artisan optimize php artisan up运行GitHub Actions后查看日志,调试信息会显示密钥加载状态、认证过程中的具体错误,帮助快速定位问题。
本地测试密钥连接
将GitHub Secrets中的私钥保存到本地文件(比如gh_actions_key),修改文件权限为600,执行:ssh -i gh_actions_key $SSH_USERNAME@$SSH_HOST如果本地连接失败,说明密钥或服务器配置存在问题;如果本地能正常连接,则问题大概率出在GitHub Secrets的密钥复制过程中(比如格式错误)。
内容的提问来源于stack exchange,提问作者Almas

