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

如何将复杂系统命令适配到Python的subprocess.run()

解决subprocess.run执行sudo su命令的参数拆分问题

核心问题是subprocess.run的列表参数拆分错误:

  • 不能把su - otherUser合并成一个参数,sudo会把它当成完整命令名查找,自然找不到
  • 给-c后面的scp命令加转义引号完全没必要,subprocess不需要shell解析引号,引号会被当成命令的一部分传递

正确的参数拆分方式

把每个命令、选项、参数都拆成单独的列表元素:

import subprocess

def main():
    subprocess.run(["ls", "-l"])            # 测试用
    print("===================================================================================")
    # 正确拆分每个参数:su是命令,-是选项,otherUser是目标用户,-c后面直接传scp命令
    cmd = [
        "sudo", 
        "su", 
        "-", 
        "otherUser", 
        "-c", 
        "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"
    ]
    print(cmd)        # 查看命令
    subprocess.run(cmd)

if __name__ == "__main__":
    main()

拆分逻辑说明

  1. sudo:触发权限提升的命令
  2. su:sudo要执行的子命令
  3. -:su的选项,用于模拟目标用户的完整登录环境(加载用户profile等)
  4. otherUser:su的目标用户名
  5. -c:su的选项,指定要执行的命令字符串
  6. 最后一个元素:直接传递完整的scp命令,不需要加引号,subprocess会把它作为-c的参数完整传给su

原写法出错原因

  • ["sudo", "su - otherUser", ...]:sudo会尝试执行名为su - otherUser的命令,而非执行su并传递- otherUser参数,因此报错「command not found」
  • 给scp命令加的\"...\"会被当作命令的一部分,su执行时会试图寻找带引号的命令,同样会引发错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:30:51