返回
创建于
状态公开
在自托管 GitHub Actions 运行器(self-hosted runner)时,确实会遇到无法直接使用 sudo
运行某些命令的问题。这是因为 GitHub Actions 的运行器设计上有一些安全限制,默认情况下不允许以 sudo
(即 root 权限)直接执行配置或运行脚本(比如 config.sh
或 run.sh
)。提示信息通常会是类似“Must not run with sudo”的错误。
为什么不能用 sudo
?
- 安全设计:GitHub Actions 的自托管运行器默认要求以非 root 用户运行,以减少潜在的安全风险。如果以 root 权限运行,可能导致意外修改系统文件或暴露敏感信息。
- 权限隔离:运行器通常需要一个普通用户账户来隔离工作目录和操作,避免对宿主系统的直接影响。
如何解决?
根据你的需求,有以下几种方法可以应对这个问题:
方法 1:以非 root 用户运行
- 推荐做法:创建一个普通用户来运行自托管运行器,而不是用 root。
- 操作步骤:
- 创建一个新用户,例如
github_runner
:1sudo adduser --disabled-password --gecos "" github_runner
- 切换到该用户:
1sudo -u github_runner -i
- 在该用户的主目录(例如
/home/github_runner
)下下载并配置运行器:1mkdir actions-runner && cd actions-runner 2curl -o actions-runner-linux-x64.tar.gz -L https://github.com/actions/runner/releases/latest/download/actions-runner-linux-x64.tar.gz 3tar xzf ./actions-runner-linux-x64.tar.gz 4./config.sh --url https://github.com/你的组织或仓库 --token 你的令牌
- 启动运行器:
1./run.sh
- 创建一个新用户,例如
- 这样可以避免
sudo
相关的限制,同时保持安全性。
方法 2:启用 RUNNER_ALLOW_RUNASROOT
- 如果你确实需要在 root 用户下运行(例如某些特殊场景需要 root 权限),可以设置环境变量
RUNNER_ALLOW_RUNASROOT
来绕过限制。 - 操作步骤:
- 在运行
config.sh
或run.sh
时,添加环境变量:1RUNNER_ALLOW_RUNASROOT=1 ./config.sh --url https://github.com/你的组织或仓库 --token 你的令牌 2RUNNER_ALLOW_RUNASROOT=1 ./run.sh
- 注意:这种方法不推荐用于生产环境,因为以 root 运行可能会带来安全隐患。
- 在运行
方法 3:工作流中需要 sudo
的情况
- 如果问题不是配置运行器,而是工作流(workflow)里的步骤需要
sudo
(例如安装软件或修改系统文件),你可以:- 确保运行器用户有足够的权限。例如,将用户加入
sudo
组:1sudo usermod -aG sudo github_runner
- 在
/etc/sudoers
文件中为该用户配置无需密码的sudo
权限:1sudo echo "github_runner ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
- 在工作流 YAML 文件中使用
sudo
:1jobs: 2 build: 3 runs-on: self-hosted 4 steps: 5 - name: Run a command with sudo 6 run: sudo apt-get update
- 确保运行器用户有足够的权限。例如,将用户加入
- 这样可以在工作流中正常使用
sudo
,而不需要以 root 配置运行器。
注意事项
- Docker 权限问题:如果你的工作流需要使用 Docker,而遇到类似“permission denied”的错误,可能是因为运行器用户没有 Docker 权限。可以将用户加入
docker
组:然后重启运行器或系统以应用权限。1sudo usermod -aG docker github_runner
- 服务模式:如果你将运行器配置为系统服务(使用
svc.sh
),可以用普通用户安装服务:1sudo ./svc.sh install github_runner 2sudo ./svc.sh start
总结
不能直接用 sudo
运行自托管 GitHub Actions 运行器是设计上的限制,但你可以通过创建普通用户或设置 RUNNER_ALLOW_RUNASROOT
来解决。推荐使用非 root 用户运行,既安全又符合最佳实践。如果工作流中需要 sudo
,则可以通过配置 sudoers
文件实现。希望这些方法能帮到你!有什么具体问题可以再告诉我,我会尽力解答。