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

Linux下root无法打开NamedTemporaryFile创建的文件,权限拒绝问题求助

问题原因分析

核心问题出在**O_CREAT标志触发的目录权限检查**:

  • 当open()调用包含O_CREAT时,无论目标文件是否已存在,Linux内核都会额外检查进程对文件所在目录的写权限(该标志隐含了"可能需要创建文件"的操作逻辑)。
  • 你的Python脚本以普通用户身份运行,tempfile.NamedTemporaryFile()默认会在当前用户的专属临时目录下创建文件(如果环境变量TMPDIR指向你的用户目录,而非全局的/tmp)。
  • 当你用sudo以root身份运行C程序时,root用户对普通用户的专属临时目录没有写权限,因此带O_CREAT的open()调用会触发Permission denied错误。
  • 去掉O_CREAT后,open()仅检查对文件本身的读写权限(你已通过os.chmod设置了777权限,root完全拥有访问权),因此可以正常打开;而以普通用户运行时,你对自己的临时目录有写权限,带O_CREAT也能通过检查。
解决方法

有两种简单的修复方式:

  1. 在Python中指定全局临时目录创建文件:
    修改tempfile.NamedTemporaryFile()调用,显式指定dir='/tmp',确保文件创建在root拥有写权限的全局临时目录:

    with tempfile.NamedTemporaryFile(dir='/tmp') as output:
        permissions = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH
        os.chmod(output.name, permissions)
        subprocess.run(f'sudo ./some_executable -f {output.name}', shell=True)
    
  2. 从C程序的open()调用中移除O_CREAT:
    既然临时文件已经由Python脚本创建完成,C程序不需要再尝试创建文件,直接打开写入即可:

    fd = open(output_file, O_WRONLY);
    if ( fd < 0 ) {
        perror("open");
        // 退出
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:45:32