Python Paramiko报PermissionError 13,sftp下载已存在文件无权限如何解决
问题解决:paramiko SFTP拉取文件覆盖时PermissionError: [Errno 13] 错误
错误根因
- 本地已存在的同名文件权限配置不允许当前运行守护进程的用户执行写入/覆盖操作,最常见场景是旧文件由其他高权限用户(如root)手动上传,进程运行用户无该文件的写入权限
- 本地旧文件被其他进程/当前进程的其他逻辑持有文件锁,未正确释放导致无法写入
- 守护进程运行用户对
/home/ubuntu/media/目录无写入权限
解决方案
1. 修复目录与文件基础权限
执行以下命令修正目标存储目录的所有者与权限,将<运行用户>替换为实际启动守护进程的系统用户名:
sudo chown -R <运行用户>:<运行用户> /home/ubuntu/media/ sudo chmod -R 755 /home/ubuntu/media/
2. 代码层面兼容覆盖逻辑
在调用sftp_client.get前增加本地文件校验逻辑,可根据需求选择以下实现:
方案A:修改本地旧文件权限后覆盖
local_path = '/home/ubuntu/media/' + entry.filename remote_path = path_serv + entry.filename # 本地文件已存在时先赋予可写权限 if os.path.exists(local_path): os.chmod(local_path, 0o644) sftp_client.get(remote_path, local_path)
方案B:删除旧文件后拉取(更稳妥,避免文件残留内容问题)
local_path = '/home/ubuntu/media/' + entry.filename remote_path = path_serv + entry.filename if os.path.exists(local_path): os.remove(local_path) sftp_client.get(remote_path, local_path)
方案C:改用流写入方式自行控制覆盖逻辑
如果自带的get方法仍报错,可以手动实现文件读写,可控性更高:
local_path = '/home/ubuntu/media/' + entry.filename remote_path = path_serv + entry.filename with sftp_client.open(remote_path, 'rb') as remote_file: with open(local_path, 'wb') as local_file: local_file.write(remote_file.read())
3. 检查文件句柄释放逻辑
确认后续的文件处理逻辑(如defection_start函数)操作文件时使用with上下文管理器,或操作完成后主动调用close()释放文件句柄,避免文件被锁导致无法覆盖。
内容的提问来源于stack exchange,提问作者user14213623
相关产品推荐
相关产品推荐

