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

远程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:必须在远程服务器运行代码时的处理

如果一定要在远程服务器运行代码,需要分两步实现:

  1. 先将SFTP服务器的文件下载到远程服务器的临时目录
  2. 再将远程服务器上的临时文件传输到你的本地电脑

示例代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:16:46