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也能通过检查。
解决方法
有两种简单的修复方式:
在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)从C程序的
open()调用中移除O_CREAT:
既然临时文件已经由Python脚本创建完成,C程序不需要再尝试创建文件,直接打开写入即可:fd = open(output_file, O_WRONLY); if ( fd < 0 ) { perror("open"); // 退出 }
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

