为何使用Python subprocess执行chown无法修改目录文件所有权?
问题
尝试使用Python的subprocess模块执行命令,修改指定目录下所有文件的用户和组,代码如下:
output = subprocess.run(["sudo", "chown", "-R", "user:group", "{}/data/*".format(workingDirectory)], encoding="utf-8", capture_output=True) print(output)
执行后出现无法访问目录的错误:
CompletedProcess(args=['sudo', 'chown', '-R', 'user:group', '/var/lib/method_transform/data/*'], returncode=1, stdout='', stderr='chown: cannot access ‘/var/lib/method_transform/data/*’: No such file or directory\n')
但直接在bash脚本中执行sudo chown -R user:group /var/lib/method_transform/data/*却能正常运行,预期所有文件的所有权都改为"user:group"。
解决方法
原因
subprocess默认不会通过shell解析命令中的通配符*,这里的*会被当作一个字面量的文件名传递给chown,导致系统找不到名为*的文件/目录。而在bash中执行时,shell会自动把*展开为目录下的所有文件和子目录,所以命令能正常运行。
方案一:通过shell执行命令
添加shell=True参数,让subprocess调用shell来解析命令,这样通配符会被正确展开:
output = subprocess.run(f"sudo chown -R user:group {workingDirectory}/data/*", shell=True, encoding="utf-8", capture_output=True) print(output)
⚠️ 注意:如果workingDirectory包含特殊字符(比如空格、引号),这种方式可能存在shell注入风险,需谨慎使用。
方案二:直接指定目标目录(推荐)
chown -R本身就会递归处理目标目录下的所有内容,完全不需要通配符*。直接指定目录路径即可,这种方式更安全,也避免了shell解析的问题:
output = subprocess.run(["sudo", "chown", "-R", "user:group", f"{workingDirectory}/data"], encoding="utf-8", capture_output=True) print(output)
内容的提问来源于stack exchange,提问作者John Grieb
相关产品推荐
相关产品推荐

