Paramiko SFTPClient.get fails with "FileNotFoundError: [Errno 2] No such file or directory" referring to the remote file path

Paramiko SFTPClient.get fails with "FileNotFoundError: [Errno 2] No such file or directory" referring to the remote file path

我正在尝试使用 Paramiko 从我的 Raspberry Pi:

获取日志文件
import paramiko
paramiko.util.log_to_file("paramiko.log")

# Open a transport
host, port = RECV_IP_ADDRESS, 22
transport = paramiko.Transport((host, port))

# Auth
username, password = "pi", "raspberry"
transport.connect(None, username, password)
# Go!
sftp = paramiko.SFTPClient.from_transport(transport)
# Download
filepath = "/"
localpath = "/home/pi/Code/log.txt"
sftp.get(filepath, localpath)

# Close
if sftp: sftp.close()
if transport: transport.close()

然而,当我 运行 这个程序时,我得到一个找不到文件的错误:

FileNotFoundError: [Errno 2] No such file or directory: '/home/pi/Code/log.txt'

很明显文件在这里

po@raspberrypi:~/Code $ pwd
/home/pi/Code
po@raspberrypi:~/Code $ ls
a.out  log.txt  test.c
po@raspberrypi:~/Code $ _

(terminal screenshot)

但是程序好像找不到。

我原以为连接可能已经断开了。我尝试了此处的建议:

transport.send_ignore()

没有产生错误。

我是 Paramiko 的新手。我需要在 Pi 上 运行 一些东西才能让它工作吗?它不只是 SFTP/SSH 的包装器吗?

你打乱了参数的顺序。或者使用 '//' 作为文件路径

  1. 你的直接问题是你有 SFTPClient.get 的参数相反(你甚至有错误命名的变量, localpath 显然应该是 remotepath).所以 Paramiko 尝试使用远程文件的路径创建一个本地文件。由于 /home/pi/Code 在您的 local(目标)机器上不存在,您会收到 local FileNotFoundError 错误。

  2. 一旦你更正了这个问题,你就会遇到另一个问题。 SFTPClient.getlocalpath 路径参数需要是文件的路径,而不仅仅是目标目录的路径。参见

像这样:

localpath = "/log.txt"
remotepath = "/home/pi/Code/log.txt"
sftp.get(remotepath, localpath)