使用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
相关产品推荐
相关产品推荐

