使用SMBConnection上传文件时遇「无法打开文件」错误求助
解决SMB文件上传报错“Unable to open file using SMBConnection”
问题背景
使用Python上传文件至远程SMB服务器时触发Unable to open file using SMBConnection错误,排查Stack Overflow及GitHub现有方案未解决问题,以下为错误日志、代码及排查建议。
错误日志
# 替换为实际错误日志内容 Traceback (most recent call last): File "smb_upload.py", line 18, in <module> remote_file = conn.openFile(share_name, remote_path, 'w') File "/venv/lib/python3.9/site-packages/smb/SMBConnection.py", line 1042, in openFile self._pollForNetBIOSPacket(request) File "/venv/lib/python3.9/site-packages/smb/SMBConnection.py", line 1357, in _pollForNetBIOSPacket raise OperationFailure(msg, result) smb.smb_structs.OperationFailure: (0, 'Failed to open file. Error returned by server: STATUS_ACCESS_DENIED') # SMB消息数据包示例 SMB Message: Command: SMB_COM_NT_CREATE_ANDX Status: STATUS_ACCESS_DENIED (0xC0000022) ...
完整Python代码
from smb.SMBConnection import SMBConnection def smb_file_upload(): # 服务器配置 server_ip = "10.0.0.5" share_name = "Uploads" username = "smb_user" password = "smb_pass" local_file = "./test_upload.txt" remote_file = "/test_upload.txt" # 建立连接 conn = SMBConnection(username, password, "local_hostname", "remote_server_name", use_ntlm_v2=True) conn.connect(server_ip, 445) # 上传文件 with open(local_file, "rb") as f: with conn.openFile(share_name, remote_file, "w") as remote_f: remote_f.write(f.read()) conn.close() if __name__ == "__main__": smb_file_upload()
排查与解决建议
- 权限校验:确认SMB账号拥有目标共享文件夹的写入+创建文件权限,部分服务器需分别配置共享权限和NTFS权限,两者缺一不可。
- 路径修正:远程文件路径避免以
/开头,改用相对路径(如test_upload.txt或subfolder/test_upload.txt),SMB协议中共享目录即为根目录,无需额外加根路径符号。 - 协议版本适配:在
connect方法中指定SMB版本,例如conn.connect(server_ip, 445, smb_version=2),部分老服务器仅支持SMB2及以下版本。 - 文件状态检查:若远程文件已存在且被其他进程锁定,会触发权限错误,可先调用
conn.exists(share_name, remote_file)检查,存在则删除或重命名后再上传。 - 连通性验证:测试本地到服务器445端口的连通性,执行
telnet 10.0.0.5 445,若不通需检查防火墙规则或端口映射。 - 库版本调整:尝试切换
pysmb库版本,比如降级到1.2.7或升级到最新稳定版,命令:pip install pysmb==1.2.7或pip install --upgrade pysmb。
内容的提问来源于stack exchange,提问作者mikeyb313
相关产品推荐
相关产品推荐

