You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions自托管Runner SSH部署权限被拒问题求助

GitHub Actions自托管Runner SSH权限问题排查

问题描述

我通过GitHub Actions自托管Runner构建部署项目,仓库密钥已配置SS_KEY、USER_ID、SERVER_IP等信息,手动在Runner实例执行SSH部署正常,但Actions执行时出现权限拒绝错误。

配置文件(actions.yaml)

name: myproject
on:
  push:
  workflow_dispatch:
concurrency:
  group: "${{ github.ref }}"
  cancel-in-progress: true

permissions:
  contents: read
  packages: read

env:
  USER_ID: "${{ secrets.USER_ID }}"
  SS_KEY: "${{ secrets.SS_KEY }}"
  SERVER_IP: "${{ secrets.SS_SERVER_IP }}""
  
jobs:
  dev-build:
    runs-on:
      - self-hosted
    container:    
      image: ghcr.io/yepme/skanska:1.8  
    if: github.ref == 'refs/heads/feature-branch'
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v3
    - run: |
        which ssh-agent || ( apt-get update -y && apt-get install openssh-client -yqq ) &&
        eval $(ssh-agent -s) &&
        echo "$SS_KEY" | ssh-add - &&
        echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&
        echo "$SS_KEY" > key.pem && chmod 400 key.pem &&
        ansible-playbook deploy/deploy.yml -i hosts --extra-vars '{"project":"shopping","component":"customer"}' --tags "build"
    - uses: actions/upload-artifact@v3.1.3
      if: success()
      with:
        name: "${{ github.job }}"
        path: build/build.tar.gz        
        
  dev-deploy:
    needs: dev-build
    runs-on:
      - self-hosted
    container:
      image: ghcr.io/yepme/skanska:1.8      
    if: github.ref == 'refs/heads/feature-branch'
    timeout-minutes: 60
    steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@v3.0.2
    - run: |
        which ssh-agent || ( apt-get update -y && apt-get install openssh-client -yqq ) &&
        eval $(ssh-agent -s) &&
        echo "$SS_KEY" | ssh-add - &&
        echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config &&
        echo "$SS_KEY" > key.pem && chmod 400 key.pem &&
        pwd &&
        ls -la &&  
        
        # 报错位置
        ssh -p 2069 $AZUREGID@$AZURE_DEVRULEENGINESERVERIP "echo $AZURE_DEVRULEENGINECONFIG > /tmp/config.ini; mkdir -p ~/.cassandra/.certs; echo $AZ_DEV_CASS_CERT > ~/.cassandra/.certs/dev_cass.cer.pem; echo $AZURE_DEV_CASS_KEY > ~/.cassandra/.certs/dev_cass.key.pem"
        echo "[node]" > hosts &&
        echo "$SERVER_IP ansible_ssh_port=2069 ansible_ssh_user=$USER_ID ansible_ssh_private_key_file=./key.pem" >> hosts &&
        cat hosts > unauth_usage &&
        ansible-playbook deploy/deploy.yml -i unauth_usage --extra-vars '{"project":"shopping","component":"customer","process":"customer_max","dir":"customer","env":"dev"}' --tags "unauth_monitor" &&
        ansible-playbook deploy/deploy.yml -i hosts --extra-vars '{"project":"shopping","component":"customer","process":"customer_max","dir":"customer","env":"dev"}' --tags "deploy"

报错信息

Warning: Permanently added '[***]:2069' (ECDSA) to the list of known hosts.
***@***: Permission denied (publickey).

修复方案

1. SSH命令未指定私钥路径

执行SSH命令时未指定生成的key.pem,SSH会默认查找容器内的默认密钥(如~/.ssh/id_rsa),但这些密钥不存在,导致验证失败。修改SSH命令,添加-i ./key.pem参数:

ssh -i ./key.pem -p 2069 $AZUREGID@$AZURE_DEVRULEENGINESERVERIP "echo $AZURE_DEVRULEENGINECONFIG > /tmp/config.ini; mkdir -p ~/.cassandra/.certs; echo $AZ_DEV_CASS_CERT > ~/.cassandra/.certs/dev_cass.cer.pem; echo $AZURE_DEV_CASS_KEY > ~/.cassandra/.certs/dev_cass.key.pem"

2. 缺失环境变量定义

dev-deploy任务中用到的$AZUREGID、$AZURE_DEVRULEENGINESERVERIP等变量未在env块中从GitHub Secrets导入,导致SSH命令的用户名、服务器IP等参数无效。补充环境变量定义,同时修正SERVER_IP末尾多余的双引号:

env:
  USER_ID: "${{ secrets.USER_ID }}"
  SS_KEY: "${{ secrets.SS_KEY }}"
  SERVER_IP: "${{ secrets.SS_SERVER_IP }}"
  AZUREGID: "${{ secrets.AZUREGID }}"
  AZURE_DEVRULEENGINESERVERIP: "${{ secrets.AZURE_DEVRULEENGINESERVERIP }}"
  AZURE_DEVRULEENGINECONFIG: "${{ secrets.AZURE_DEVRULEENGINECONFIG }}"
  AZ_DEV_CASS_CERT: "${{ secrets.AZ_DEV_CASS_CERT }}"
  AZURE_DEV_CASS_KEY: "${{ secrets.AZURE_DEV_CASS_KEY }}"

3. SSH密钥格式损坏

用echo "$SS_KEY" > key.pem可能丢失私钥中的换行符,破坏密钥格式。改用printf确保格式正确:

printf "%s" "$SS_KEY" > key.pem && chmod 400 key.pem

4. 系统级SSH配置无权限修改

执行echo "StrictHostKeyChecking no" >> /etc/ssh/ssh_config需要root权限,Actions默认非root用户执行会失败。改用用户级配置:

echo "StrictHostKeyChecking no" >> ~/.ssh/config && chmod 600 ~/.ssh/config

内容的提问来源于stack exchange,提问作者DevGo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:55:20