远程SSH服务器运行Paramiko代码无法将SFTP文件下载至本地的问题
问题描述
在本地VS Code运行以下Paramiko代码时,能正常将SFTP服务器上的文件下载到本地指定路径;但通过SSH登录远程服务器并在其上运行该代码时,无报错却未在本地找到文件,反而在远程服务器的当前代码目录生成了类似/home/xxx/D:\..\pred.jpg的文件。需求是:在远程服务器运行代码时,将SFTP服务器的文件下载至自己的本地计算机。
代码如下:
import paramiko host_name ='10.110.100.8' user_name = 'abc' password ='xyz' port = 22 remote_dir_name ='/data/.../PMC1087887_00003.jpg' local_dir_name = 'D:\..\pred.jpg' t = paramiko.Transport((host_name, port)) t.connect(username=user_name, password=password) sftp = paramiko.SFTPClient.from_transport(t) sftp.get(remote_dir_name,local_dir_name)
解决方案
核心原因
当代码在远程服务器(一般为Linux环境)运行时,代码里的local_dir_name是Windows格式路径(D:\..\pred.jpg),这个路径对Linux系统来说是无效的绝对路径,系统会将其解析为当前目录下的一个文件名,因此文件被保存在了远程服务器的当前工作目录中,而非你的本地电脑。同时,远程服务器默认无法直接访问你的本地电脑磁盘,必须通过网络传输实现文件转移。
方法1:优先在本地运行代码(最简单有效)
你原本在本地VS Code运行代码就能正常下载文件,说明本地环境可直接连接目标SFTP服务器。如果没有必须在远程服务器运行代码的需求,直接在本地执行代码即可,同时注意修正路径字符串的转义问题:
# 用原始字符串避免转义问题 local_dir_name = r'D:\..\pred.jpg' # 或者使用双反斜杠 # local_dir_name = 'D:\\..\\pred.jpg'
方法2:必须在远程服务器运行代码时的处理
如果一定要在远程服务器运行代码,需要分两步实现:
- 先将SFTP服务器的文件下载到远程服务器的临时目录
- 再将远程服务器上的临时文件传输到你的本地电脑
示例代码如下:
import paramiko # 第一步:从目标SFTP服务器下载到远程服务器的临时路径 sftp_host = '10.110.100.8' sftp_user = 'abc' sftp_pwd = 'xyz' sftp_port = 22 remote_sftp_path = '/data/.../PMC1087887_00003.jpg' remote_temp_path = '/tmp/downloaded_pred.jpg' # 远程服务器的临时路径 t = paramiko.Transport((sftp_host, sftp_port)) t.connect(username=sftp_user, password=sftp_pwd) sftp = paramiko.SFTPClient.from_transport(t) sftp.get(remote_sftp_path, remote_temp_path) sftp.close() t.close() # 第二步:将远程服务器的临时文件传到你的本地电脑 # 注意:需要你的本地电脑开启SSH服务,且远程服务器能访问到你的本地IP local_host = '你的本地电脑IP' local_user = '本地SSH用户名' local_pwd = '本地SSH密码' local_port = 22 # 本地SSH默认端口 local_target_path = r'D:\..\pred.jpg' t_local = paramiko.Transport((local_host, local_port)) t_local.connect(username=local_user, password=local_pwd) sftp_local = paramiko.SFTPClient.from_transport(t_local) sftp_local.put(remote_temp_path, local_target_path) sftp_local.close() t_local.close()
或者,你也可以在本地使用scp命令直接从远程服务器下载临时文件:
scp 远程服务器用户名@远程服务器IP:/tmp/downloaded_pred.jpg D:\..\pred.jpg
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

