如何在GitHub Workflow中实现Linux系统用户切换?
GitHub Workflow 切换用户执行Python文件的解决方案
问题根因
你当前的写法存在两个问题:
su命令默认要求运行在交互式终端环境,而 GitHub Actions 的run步骤默认使用非交互非登录 shell,不符合su的运行条件,因此抛出对应报错。- 即便
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
相关产品推荐
相关产品推荐

