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