IOError: \[Errno 2\] 没有这样的文件 - Paramiko put()

新手上路,请多包涵

我正在使用带有 sftp.put(localFile, remoteFile) Paramiko 通过 SFTP 上传文件。如果需要,我首先制作必要的目录

    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) 更改工作目录,但此调用产生了与上述完全相同的错误。所以这似乎不仅仅是一个上传问题。有任何想法吗?

原文由 Cian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 850
2 个回答

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

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

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

原文由 Cian 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

在我的例子中,我将文件传输到的远程服务器立即将所有传输的文件移动到另一个位置进行处理,这导致统计失败。将 confirm 参数设置为 False 解决了这个问题。

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

来自 paramiko 源 sftp_client.py:

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

原文由 Timmah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题