如何使用Python SFTP/Paramiko在两台服务器之间传输zip文件
SFTP下载权限错误排查思路
1. 先定位错误触发端
首先给代码添加异常捕获逻辑,区分是源服务器SFTP读权限不足,还是本地路径写入权限不足,参考修改后的调试代码:
import paramiko import os host = <defined here> user = <defined here> pswd = <defined here> source_path = <defined here> destination_path = <defined here> try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, username=user, password=pswd) ftp = ssh.open_sftp() # 先验证源文件是否可读 try: ftp.stat(source_path) except Exception as e: print(f"源端文件访问失败:{str(e)}") raise # 验证本地路径合法性 dest_dir = os.path.dirname(destination_path) if not os.path.isdir(dest_dir): print(f"本地目标文件夹不存在:{dest_dir}") raise ftp.get(source_path, destination_path) print("文件下载成功") except PermissionError as e: print(f"权限错误详情:{str(e)}") except Exception as e: print(f"其他错误:{str(e)}") finally: if 'ftp' in locals(): ftp.close() if 'ssh' in locals(): ssh.close()
运行调试版代码后根据打印的错误信息,针对性排查对应端的问题。
2. 本地写入权限问题排查
如果确认是本地侧抛出权限错误,按以下顺序检查:
- 确认脚本运行用户和你手动测试权限的用户一致:很多情况下计划任务、服务调用、sudo启动的脚本,运行用户和当前登录用户不同,权限自然有差异,可在脚本中添加
print(os.getlogin())打印当前运行用户确认 - 手动验证目标路径写入权限:直接用脚本运行用户身份,往
destination_path对应的文件夹新建任意文件,确认可以写入。Linux/macOS下执行touch <目标文件夹路径>/test.txt,Windows下直接在资源管理器对应路径新建文本文档 - 检查目标文件夹权限配置(Linux/macOS):目标文件夹需要给脚本运行用户开放
写入(w)和进入(x)权限,执行ls -ld <目标文件夹路径>查看权限位,确认属主/属组/其他用户的权限和运行用户身份匹配
3. 源端SFTP权限问题排查
如果确认是源侧抛出权限错误,按以下顺序检查:
- 手动使用代码中配置的
user账号,通过SFTP客户端连接源服务器,尝试下载source_path对应的文件,确认账号本身有该文件的读权限 - 确认
source_path是绝对路径,且大小写完全匹配:Linux服务器路径大小写敏感,路径拼写错误也可能抛出类似权限的访问错误
4. 补充优化建议
- 尽量使用绝对路径作为
destination_path,避免相对路径因为脚本工作目录变动,写入到无权限的系统路径 - 生产环境建议用上下文管理器管理SSH/SFTP连接,避免异常时连接资源泄漏
内容的提问来源于stack exchange,提问作者Aaron Morales
相关产品推荐
相关产品推荐

