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

如何在GitHub Workflow中实现Linux系统用户切换?

GitHub Workflow 切换用户执行Python文件的解决方案

问题根因

你当前的写法存在两个问题:

  1. su 命令默认要求运行在交互式终端环境,而 GitHub Actions 的 run 步骤默认使用非交互非登录 shell,不符合 su 的运行条件,因此抛出对应报错。
  2. 即便 su 执行成功,后续的 python helloworld.py 也不会在切换后的用户下运行:su - user 会启动独立的子 shell,只有退出该子 shell 才会执行下一行命令,下一行命令仍然归属原用户的执行上下文。

解决方案

推荐使用 sudo -u 命令直接以指定用户身份执行命令,这是适配非交互场景最简单的实现方式,你需要先完成前置配置,再调整 Workflow 代码:

前置配置

在自托管运行器(self-hosted)的宿主机上配置sudo规则,允许运行 Workflow 的默认用户无需密码切换到目标用户执行命令,将以下规则添加到 /etc/sudoers 文件中(将对应占位符替换为你的实际用户名):

<runner默认用户名> ALL=(<目标用户user>) NOPASSWD: ALL

调整后的Workflow配置

name: CI

on:
  push:
     branches: [ main ]

  workflow_dispatch:

jobs:
  build:
    runs-on: self-hosted
    strategy:
      matrix:
        python: [3.8.1]
        
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python }}
    - name: run multiple commands
      run: |
        echo $PWD
        whoami 
        # 单条命令直接执行
        sudo -u user python helloworld.py
        # 如需执行多条命令,用bash -c包裹所有命令
        # sudo -u user bash -c "whoami && python helloworld.py && echo 任务完成"

注意事项

  • 若需要保留当前shell的环境变量,可在sudo后添加-E参数,示例:sudo -E -u user python helloworld.py
  • 请确保目标用户对代码检出目录有读、执行权限,避免执行Python文件时出现权限报错
  • 如果你的自托管运行器默认以root身份运行,也可以使用runuser命令实现切换,语法为:runuser -l user -c 'python helloworld.py'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:03