如何检查Paramiko是否成功将文件上传到SFTP服务器?

时间:2015-03-10 15:42:27

标签: python sftp checksum paramiko

我使用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功能是否允许这样做?如果是这样,它究竟是如何运作的?

2 个答案:

答案 0 :(得分:5)

使用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解决方案了。

答案 1 :(得分:0)

如果文件未上传,则该方法将引发错误,因此您可以检查错误

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'