9

我正在通过 SFTP 使用Paramikosftp.put(localFile, remoteFile). 如果需要,我首先制作必要的目录

    makeCommand = 'mkdir -p "' + remotePath + '"'
    ssh.exec_command(makeCommand)

这有时有效,但我偶尔会收到以下错误:

    sftp.put(localFile, remoteFile)
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
    IOError: [Errno 2] No such file 

尽管本地文件确实存在(并且localFile是它的正确路径)并且远程路径已创建。这里这里都有关于类似问题的讨论,但那里提出的任何观点都没有帮助我。我的服务器支持该df -hi命令。有没有人对此或可能的解决方案有任何建议?

编辑

在下面的建议之后,我尝试更改工作目录,sftp.chdir(remoteDirectory)但是这个调用产生了与上面完全相同的错误。所以看起来这不仅仅是一个上传问题。有任何想法吗?

4

5 回答 5

10

这似乎是一个远程文件夹权限问题。尽管远程文件夹是在文件上传之前创建的,但该文件夹的权限似乎阻止了上传。

问题与问题有关 - 如果我在上传之前对要上传到的文件夹设置打开权限,则程序可以正常上传。虽然我应该得到一个权限问题IOError: [Errno 13] Permission denied,但由于我进行了更改,我没有遇到任何错误。

我不确定是服务器给Paramiko的响应是问题,还是Paramiko本身的错误导致IOError: [Errno 2] No such file而不是a Errno 13,但这似乎已经解决了问题。

于 2013-03-22T14:18:46.340 回答
8

put 方法有一个默认启用的确认参数,它将在传输后对文件进行统计。

就我而言,我将文件传输到的远程服务器立即将任何传输的文件移动到另一个位置以进行处理,这导致统计失败。将确认参数设置为 False 解决了这个问题。

def put(self, localpath, remotepath, callback=None, confirm=True):

从 paramiko 源 sftp_client.py:

:param bool confirm: 之后是否对文件执行 stat() 以确认文件大小(从 1.7.7 开始)

于 2020-01-24T15:13:37.793 回答
2

是本地的IOError,因此(无论出于何种原因)似乎您的本地 python 找不到localFile. 在通话之前进行安全检查可能有助于追踪问题:

if os.path.isfile(localFile):
    sftp.put(localFile, remoteFile)
else:
    raise IOError('Could not find localFile %s !!' % localFile)

如果您确定localFile确实存在,那么这可能只是一个路径问题 - 是localFile在绝对路径还是相对路径上?无论哪种方式,if上面的语句都会抓住它。

编辑

跟踪 paramiko 文件显示第 245 行sftp_client.py(引发异常的行)实际上是

fr = self.file(remotepath, 'wb')

这是相当误导性的,因为 paramiko 会抛出IOError一个远程文件!我现在最好的猜测是,remoteFile要么是丢失的目录,要么是您无权访问的目录。

出于兴趣,你能列出远程目录吗

sftp.listdir(path=os.path.dirname(remoteFile))

检查它是否在那里(或者它在那里并且你可以写信给它)?

于 2013-03-18T17:12:11.333 回答
2

您确定该目录已创建并且它是您的远程工作目录吗?Paramiko 有自己的方法来创建新目录和导航远程文件系统。考虑使用类似的东西:

sftp.mkdir(remotedirectory)
sftp.chdir(remotedirectory)
sftp.put(localfile, remotefile)
于 2013-03-20T13:07:05.223 回答
1

我遇到了同样的问题。这是一个愚蠢的错误。

  • 只需使用 sftp.stat(您的远程目录)来检查它是否存在。
  • 然后使用 sftp.put(localfileabsolutepath, remotedir+filename)

它肯定会起作用。

于 2021-09-14T14:28:13.100 回答