使用Paramiko传输SFTP文件报错:FileNotFound: [Errno 2] No such file
SFTP文件传输报错
FileNotFound: [Errno 2] No such file的解决建议 问题背景
为学校项目开发无人机使用的SFTP模块,暂不考虑安全性,仅需实现基础的连接与文件传输功能。使用paramiko编写代码后,运行时下载、上传操作均报FileNotFound: [Errno 2] No such file错误。
环境说明:Windows平台用OpenSSH搭建SFTP服务器,sshd_config已配置对应路径,防火墙规则正常,同一设备用FileZilla可正常连接传输,网络连通性无问题,代码路径已反复核对。
原代码:
import paramiko #Open Transport host, port = "IP Address", 22 transport = paramiko.Transport((host,port)) #Authentication username, password = "Username", "Password" transport.connect(None, username, password) #Connect sftp = paramiko.SFTPClient.from_transport(transport) #Download remotePath = "C:\\Users\\User\\Desktop\\Upload Data\\Test.txt" localPath = "C:\\Users\\User\\Downloads\\Test.txt" sftp.get(remotePath, localPath) #Upload remotePath = "C:\\Users\\User\\Desktop\\Upload Data" localPath = "C:\\Users\\User\\Downloads\\Test.txt" sftp.put(localPath, remotePath) #Close if sftp: sftp.close() if transport: transport.close()
核心问题与解决步骤
- 远程路径格式错误:SFTP基于SSH协议,使用类Unix风格的路径(正斜杠
/),而非Windows本地的反斜杠\。Windows OpenSSH的SFTP绝对路径需要写成/C/Users/User/Desktop/Upload Data/Test.txt这种格式,直接用C:\\...的Windows路径会被服务器判定为无效路径。 - 上传路径需指定文件名:代码中上传的
remotePath是目录,sftp.put要求远程路径要么是完整文件名(明确告诉服务器把本地文件存成什么名字),要么确保目标目录存在且服务器支持自动沿用本地文件名。建议直接指定完整的远程文件名,避免歧义。 - 确认SFTP会话的工作目录:可以在代码中加入
sftp.getcwd()打印当前SFTP会话的根目录,确认你的远程路径是否需要相对于这个目录调整,比如如果根目录是用户的home目录,那么用Desktop/Upload Data/Test.txt即可,无需写全路径。
修改后的示例代码
import paramiko # Open Transport host, port = "IP Address", 22 transport = paramiko.Transport((host, port)) # Authentication username, password = "Username", "Password" transport.connect(None, username, password) # Connect sftp = paramiko.SFTPClient.from_transport(transport) # 打印当前SFTP工作目录,确认路径基准 print("当前SFTP工作目录:", sftp.getcwd()) # Download - 使用类Unix风格的远程路径 remotePath = "/C/Users/User/Desktop/Upload Data/Test.txt" localPath = "C:\\Users\\User\\Downloads\\Test.txt" sftp.get(remotePath, localPath) # Upload - 指定完整的远程文件名 remotePath = "/C/Users/User/Desktop/Upload Data/Test_uploaded.txt" localPath = "C:\\Users\\User\\Downloads\\Test.txt" sftp.put(localPath, remotePath) # Close if sftp: sftp.close() if transport: transport.close()
内容的提问来源于stack exchange,提问作者Selovanth
相关产品推荐
相关产品推荐

