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

如何将上传至SMB的CLI cURL命令转为Python实现(不使用pySMB)

解决方案:用Python调用系统curl实现SMB文件上传

哦,这个问题我之前也碰到过——requests和pycURL搞不定SMB上传的原因其实很直白:requests根本不支持SMB协议,而pycURL需要编译时启用SMB支持,大多数默认安装的pycURL都没开这个选项。既然你原有的curl命令已经能正常运行,那最省事的方案就是直接在Python里调用系统的curl进程,完全不用折腾其他库,而且还能保证和原命令的行为一致。

代码实现

下面是封装好的Python代码,直接复用你原有的curl逻辑:

import subprocess

def upload_file_to_smb(local_file, smb_target, username, password):
    # 构造curl命令参数列表,避免shell转义问题
    curl_command = [
        "curl",
        "--upload-file", local_file,
        "-u", f"{username}:{password}",
        smb_target
    ]
    
    try:
        # 执行命令并捕获输出
        result = subprocess.run(
            curl_command,
            check=True,  # 当curl返回非0错误码时抛出异常
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True    # 以文本形式返回输出,而非字节
        )
        print("上传成功!curl输出:")
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"上传失败,错误码:{e.returncode}")
        print("错误详情:")
        print(e.stderr)

# 测试调用,替换成你的实际参数
if __name__ == "__main__":
    upload_file_to_smb(
        local_file="some.file",
        smb_target="smb://192.168.0.1/C$/local/path",
        username="username",
        password="p@ssw0rd"
    )

关键细节说明

  • 避免shell转义坑:用列表形式传递命令参数,而不是拼接成字符串后用shell=True执行——这样既避免了密码等特殊字符的转义问题,也防止了潜在的shell注入风险。
  • 错误处理:通过check=True让subprocess在curl执行失败时主动抛出异常,配合stderr捕获可以快速定位问题(比如权限不足、网络不通等)。
  • 输出捕获:同时捕获stdout和stderr方便调试,你可以根据需求选择是否打印这些内容。

注意事项

  • 确保你的系统环境中已经安装了支持SMB的curl版本(既然原命令能正常运行,这条基本没问题)。
  • 如果密码包含特殊字符(比如!、$、&),不用额外转义——因为我们直接把username:password作为一个独立参数传给curl,不会经过shell解析。
  • 如果你需要在生产环境中隐藏密码,建议不要在日志中打印包含密码的参数,或者考虑使用环境变量存储密码后读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:43:24