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

命令行正常但make执行cargo时出现Permission Denied错误求助

问题场景

命令行下直接运行cargo完全正常,但通过make执行相同命令时,却触发Permission denied错误,而同目录下的rustc、cargo-clippy在两种环境下都能正常运行。

命令行执行结果:

bash:~/scratch$ which cargo
XXX/.cargo/bin/cargo
bash:~/scratch$ cargo help
Rust's package manager

Usage: cargo [+toolchain] [OPTIONS] [COMMAND]

Options:
  -V, --version             Print version info and exit
      --list                List installed commands
      --explain <CODE>      Run `rustc --explain CODE`
=== etc

make执行报错:

bash:~/scratch$ make
which cargo
XXX/.cargo/bin/cargo
cargo help
make: cargo: Permission denied
make: *** [Makefile:3: all] Error 127

使用的Makefile内容:

all:
    which cargo
    cargo help

已确认命令行和make调用的是同一个cargo程序,重新安装cargo也无法解决问题。

解决思路与方法

1. 强制使用绝对路径调用cargo

Make的环境变量可能和当前shell不一致,即便which能找到cargo,实际执行时可能出现权限问题。直接在Makefile里用绝对路径调用:

all:
    which cargo
    XXX/.cargo/bin/cargo help

2. 同步make的环境变量

Make默认不会继承shell的全部环境变量,尤其是PATH、CARGO_HOME这类关键变量。可以通过两种方式同步:

  • 执行make时手动传递环境变量:
    make PATH="$PATH" CARGO_HOME="XXX/.cargo"
    
  • 在Makefile开头显式设置环境变量:
    export PATH := XXX/.cargo/bin:$(PATH)
    export CARGO_HOME := XXX/.cargo
    
    all:
        which cargo
        cargo help
    

3. 检查cargo的文件属性与shebang

虽然同目录其他工具正常,但还是要确认cargo本身的权限和解释器配置:

  • 查看文件权限,确保有可执行权限:
    ls -l XXX/.cargo/bin/cargo
    
    正常权限应为rwxr-xr-x(即755),如果不是,用chmod +x XXX/.cargo/bin/cargo修正。
  • 查看文件首行的shebang(如果是脚本的话):
    head -n 1 XXX/.cargo/bin/cargo
    
    如果shebang指向的解释器(比如bash)在make环境中无法访问或无权限,也会触发错误。

4. 排查系统安全策略限制

如果系统开启了SELinux或AppArmor,可能会限制make进程执行cargo。可以临时关闭SELinux测试:

sudo setenforce 0

如果测试后make能正常运行,再调整SELinux策略或给cargo添加合适的安全上下文。

5. 检查cargo是否为脚本而非二进制

用file命令确认cargo的类型:

file XXX/.cargo/bin/cargo

如果是shell脚本而非Rust编译的二进制,需要检查脚本内部的命令是否在make环境中能正常执行,比如脚本里调用的其他工具是否有权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45