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

使用paramiko从Linux服务器拷贝文件到本地报PermissionError如何解决

问题排查与解决方案

核心错误原因

  • API调用逻辑错误:sftp.put()的作用是将本地文件上传到远程服务器,你要实现的是远程服务器文件下载到本地,应该调用sftp.get()方法,反向操作会直接触发路径权限不匹配的报错。
  • 路径参数不符合要求:你当前的localpath通过os.path.dirname(os.path.realpath(__file__))取到的是当前脚本所在的文件夹路径,而sftp.put/sftp.get的路径参数都需要指定到具体的文件名,不能仅传入目录路径。
  • 权限校验不通过:你使用的SSH登录用户对远程目标路径没有对应读写权限,或是本地运行脚本的用户对本地存储路径没有写入权限。
  • 额外冗余代码:代码中的time.sleep(5)没有实际作用,ssh.connect()成功返回后就可以直接操作SFTP,不需要额外等待。

修正后的代码示例

import os
import paramiko 

ssh = paramiko.SSHClient() 
ssh.load_system_host_keys() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('xxxx', port=22, username='yyy', password='zzz')
sftp = ssh.open_sftp()

# 按需修改两个路径,必须指定到具体文件名
remotefile = '/xxx/yyy/zzz/target_file'  # 远程服务器上的源文件完整路径
local_dir = os.path.dirname(os.path.realpath(__file__))
localfile = os.path.join(local_dir, 'target_file')  # 本地保存的文件完整路径

# 调用get方法从远程下载到本地
sftp.get(remotefile, localfile)

sftp.close()
ssh.close()

额外排查步骤

如果修改后仍然报权限错误,可以按以下步骤验证:

  • 用相同的账号密码通过SSH直接登录服务器,执行ls -l 远程目标文件路径,确认登录用户对该文件有读权限。
  • 手动在你要保存文件的本地目录下新建一个文件,确认当前运行脚本的系统用户对该目录有写入权限。
  • 如果需要批量下载整个目录的文件,需要先遍历远程目录的所有文件,逐个调用get方法,不能直接对目录路径调用get/put。

内容的提问来源于stack exchange,提问作者GGG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:15:04