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

为何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:20:32