我正在尝试将一个 SFTP 模块放在一起,以便在学校项目中与无人机一起使用。安全现在不是我关心的问题,因为我只是想首先建立成功的连接和文件传输。
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()
运行上面的代码时,我得到
FileNotFound: [Errno 2] No such file
返回。尝试上传时会返回相同的错误。我正在使用 OpenSSH 在 Windows 平台上托管 SFTP 服务器,如路径所示。
sshd_config
文件正确指向 remotePath
中定义的路径。服务器上的防火墙规则已正确配置,因为我能够从我尝试使用 Python 连接到服务器的同一台计算机上使用 FileZilla 连接到 SFTP 服务器。我也可以使用同一台机器 ping 远程服务器。据我所知,这不是服务器和客户端之间的连接问题。
我真的不确定我做错了什么。我已经四次检查了代码中的路径是否正确。在过去的几个小时里,我一直在努力解决问题,但我的想法已经用完了,所以我需要上网查询。
C:\Users\User\Desktop\Upload Data\Test.txt
不是典型的 SFTP 路径。它看起来更像是服务器上的物理路径。
使用 GUI SFTP 客户端登录并查看文件的实际 SFTP 路径是什么。
如果可以像(或任何其他):
/Upload Data/Test.txt
/C/Users/User/Desktop/Upload Data/Test.txt
/Test.txt
另请参阅SFTP 路径格式与本地路径格式。
强制性警告:不要以这种方式直接使用
Transport
类——您将绕过主机密钥检查,从而失去对 MITM 攻击 的保护。而是使用 SSHClient
类。另见Paramiko“未知服务器”.