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

Github Actions使用自定义shell时出现Permission denied问题求助

在GitHub Actions中使用chroot/QEMU自定义shell解决权限拒绝问题

问题本质

GitHub Actions生成的临时脚本默认无执行权限,且你的chroot环境无法直接访问主机上的临时脚本路径,导致自定义shell调用时出现Permission denied错误。

规范解决方案(官方预期方式)

自定义shell脚本需要正确处理GHA传递的临时脚本参数(即shell: bash-wrapper {0}中的{0},对应临时脚本路径),针对chroot环境的特殊性,应读取脚本内容并传递给目标架构的bash执行,而非直接传递路径。

修改后的bash-wrapper脚本:

#!/bin/bash
# 读取GHA生成的临时脚本内容
script_content=$(cat "$1")
# 在chroot环境中执行脚本内容
sudo chroot --userspec=$(whoami):$(whoami) $CROSS_ROOT qemu-arm-static /bin/bash -c "$script_content"

为什么原方案会出错

  1. 原脚本使用$*拼接参数,当GHA传递临时脚本路径时,chroot环境中不存在该路径,导致执行失败;
  2. GHA生成的临时脚本默认仅设置读取权限,这是设计行为——官方期望自定义shell能通过读取脚本内容或直接调用解释器执行脚本(如bash本身可直接读取无执行权限的脚本),但chroot环境无法访问主机文件系统,因此直接传递路径不可行。

其他可选方案

如果需要保留脚本文件执行的方式,可以将主机的临时目录挂载到chroot环境中,示例如下:

#!/bin/bash
# 挂载主机临时目录到chroot环境
sudo mount --bind /tmp "$CROSS_ROOT/tmp"
# 在chroot中执行临时脚本
sudo chroot --userspec=$(whoami):$(whoami) $CROSS_ROOT qemu-arm-static /bin/bash "$1"
# 卸载挂载(避免影响后续步骤)
sudo umount "$CROSS_ROOT/tmp"

此方案需确保GHA的临时脚本位于/tmp目录下,且挂载/卸载操作不会冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:41:06