如何解决Github Action部署EC2时的“No such device or address”致命错误
解决GitHub Action部署EC2时git拉取的PAT认证错误
问题场景
更新GitHub个人访问令牌(PAT)后,GitHub Action部署到AWS EC2时出现git拉取错误:
err: fatal: could not read Password for 'https://***@github.com': No such device or address
此前Action运行正常,仅在更换PAT后出现该问题。
原因分析
- 新PAT缺少仓库访问权限
- EC2环境中git缓存了旧认证信息,或全局配置写法导致认证失败
- GitHub Secrets变量在SSH脚本中未正确传递/解析
解决方案
1. 验证新PAT的权限
生成新PAT时,必须勾选repo权限组(包含repo:status、repo_deployment、public_repo等核心权限),确保拥有目标仓库的拉取权限。
2. 调整GitHub Action部署脚本
修改deploy步骤中的script部分,优化git配置和命令:
deploy: name: Deploy to UAT needs: integration-test runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v2 - name: Deploy to EC2 instance uses: appleboy/ssh-action@master with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} envs: ACCESS_TOKEN script: | cd /var/www/html/ # 清理旧的git配置和缓存 git config --global --unset url."https://github.com/".insteadOf git config --global credential.helper '' # 使用环境变量传递PAT配置git git config --global url."https://${ACCESS_TOKEN}@github.com/".insteadOf "https://github.com/" # 指定分支拉取,避免默认分支冲突 git pull origin uat # 无交互安装依赖 composer install --no-dev --no-interaction --prefer-dist # 强制执行迁移(避免交互提示) php artisan migrate --seed --force sudo chown -R www-data:www-data .
关键调整点:
- 先清理旧的
insteadOf配置和credential缓存,避免冲突 - 使用
${ACCESS_TOKEN}环境变量传递PAT(已通过envs: ACCESS_TOKEN声明,EC2环境会自动加载) - 明确指定拉取
origin uat分支,避免默认分支不匹配问题 - 给
composer install和artisan migrate添加无交互/强制参数,防止部署中断
3. 确认Secrets配置正确性
检查仓库的ACCESS_TOKEN Secrets:
- 确保内容是新生成的完整PAT,无多余空格或字符
- 确认Secrets已保存并应用到当前分支的Action中
内容的提问来源于stack exchange,提问作者Mena
相关产品推荐
相关产品推荐

