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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:02