使用GitHub Action部署时Capistrano持续要求SSH密码问题
解决Capistrano在VPN+GitHub Action环境下持续索要凭据的问题
核心问题梳理
- 已通过VPN正常连接目标私有服务器SSH,GitHub Action也能通过SSH密钥连接服务器,但Capistrano部署时始终要求输入凭据
- 本地部署正常,服务器本地执行
cap production deploy同样要求密码 - 已在
deploy.rb中设置set :ssh_options, { forward_agent: true },SSH密钥已配置为仓库Secret
排查与解决方案
1. 修复服务器SSH密钥权限
服务器上的SSH密钥文件权限不符合要求会直接导致认证失败,执行以下命令修正:
chmod 700 ~/.ssh chmod 600 ~/.ssh/github
2. 确保服务器SSH允许代理转发
检查服务器/etc/ssh/sshd_config配置:
- 确认
AllowAgentForwarding yes(默认可能开启,若被注释需取消) - 重启sshd服务使配置生效:
sudo systemctl restart sshd
3. 开启GitHub Action SSH会话的代理转发
在ssh-action的args中添加-A参数,确保代理转发从GitHub Action Runner传递到目标服务器:
args: "-tt -A"
4. 调整GitHub Action的SSH代理流程
无需在服务器上启动新的ssh-agent,而是让Runner的SSH代理通过转发传递给服务器,让Capistrano复用该代理访问GitHub:
- name: Set up SSH agent on Runner run: | eval "$(ssh-agent -s)" # 将访问GitHub的部署密钥添加到Runner的SSH代理 echo "${{ secrets.GITHUB_DEPLOY_KEY }}" | ssh-add - - name: Set up SSH and deploy uses: fifsky/ssh-action@master with: host: ${{ secrets.SSH_HOST }} user: deploy key: ${{ secrets.SSH_KEY}} args: "-tt -A" command: | cd ./priicer/current echo $REPO_URL # 修正repo_url的引号,避免变量解析问题 echo -e "lock '~> 3.17.1'\n\nset :application, 'priicer'\nset :repo_url, '$REPO_URL'\nset :deploy_to, \"/home/deploy/#{fetch :application}\"\nset :ssh_options, { forward_agent: true }" > config/deploy.rb BUNDLE_PATH="/home/deploy/.rbenv/shims/bundle" echo "BUNDLE_PATH: $BUNDLE_PATH" $BUNDLE_PATH exec cap production deploy
5. 验证服务器SSH访问GitHub的能力
在服务器上手动执行以下命令,确认能无密码访问GitHub:
ssh -T git@github.com
若仍要求密码,说明:
- 服务器上的密钥未正确关联GitHub账号
- 代理转发未生效,需重新检查Runner到服务器的代理配置
6. 检查Capistrano配置是否被覆盖
确认config/deploy/production.rb中没有覆盖ssh_options的设置,若存在类似配置需删除或调整:
# 避免此类冲突配置 set :ssh_options, { # 与forward_agent冲突的自定义设置 }
内容的提问来源于stack exchange,提问作者claireDMT
相关产品推荐
相关产品推荐

