【问题标题】:How to check if Paramiko successfully uploaded a file to an SFTP server?如何检查 Paramiko 是否成功将文件上传到 SFTP 服务器?
【发布时间】:2019-03-13 06:45:15
【问题描述】:

我使用 Paramiko 将文件放入 SFTP 服务器:

import paramiko

transport = paramiko.Transport((host, port))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_path, remote_path)

现在,我想检查一下它是否有效。这个想法是我比较本地文件和远程文件(位于 SFTP 服务器上)的校验和。

Paramiko 功能是否允许这样做?如果是这样,它的工作原理是什么?

【问题讨论】:

    标签: python sftp checksum paramiko


    【解决方案1】:

    使用 SFTP,通过加密的 SSH 会话运行,文件内容在传输时不会损坏。因此,除非它在读取本地文件或写入远程文件时损坏,否则您可以非常确定文件已正确上传,如果 .put 没有抛出任何错误。


    如果你想明确地测试:

    虽然 SFTP 协议有 check-file extension 来计算远程文件校验和,但它并未得到广泛支持。特别是最广泛的 SFTP 服务器实现 OpenSSH 不支持它。见What SFTP server implementations support check-file extension

    如果你有幸连接到另一个支持扩展的 SFTP 服务器,你可以使用Paramiko's SFTPFile.check method

    如果没有,您唯一的选择是下载文件并在本地进行比较。


    如果您对服务器有 shell 访问权限,您当然可以尝试通过单独的 shell/SSH 连接(或通道)运行一些 shell 校验和命令 (sha256sum) 并解析结果。但这不再是 SFTP 解决方案。见Comparing MD5 of downloaded files against files on an SFTP server in Python

    【讨论】:

      【解决方案2】:

      如果文件没有上传,那么该方法会抛出一个错误,所以你可以检查错误

      import paramiko
      
      transport = paramiko.Transport((host, port))
      transport.connect(username=username, password=password)
      sftp = paramiko.SFTPClient.from_transport(transport)
      try:
          sftp.put(local_path, remote_path)
      except IOError:
          #'Failure'
      except OSError:
          #'Failure'
      

      【讨论】:

        猜你喜欢
        • 2022-11-10
        • 1970-01-01
        • 2016-01-28
        • 2019-11-14
        • 2012-06-13
        • 2019-12-07
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多