如何将上传至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
相关产品推荐
相关产品推荐

