帕拉米科文件传输操作是原子的



我使用paramiko.SFTP对象的getput方法。我依稀记得我有时会使用 get 方法获得不完整的文件内容,但从未注意到put的任何问题。这只是我的运气,还是我应该执行额外的检查以确保我在远程端获得正确的文件?如果是这样,鉴于我只有对该远程服务器的 SFTP 访问权限,我该怎么做?

通过

仅限 SFTP 的访问,我的意思是我无法通过 SSH 进入:

$ ssh user@ipaddress
user@ipaddress's password: 
PTY allocation request failed on channel 0
shell request failed on channel 0

您可以相当确定 SFTP 传输是否完成而没有错误或中断,该文件已被完全复制,因为 SFTP 协议要求确认发送的每个块。因此,在TCP,SSH通道和每个块的ACK的可靠性之间,文件不太可能以任何方式被截断。

仅使用 SFTP 时还可以执行其他一些操作:

  • 传输后,您可以对文件调用stat()以验证其实际大小。
  • 您可以读回文件的一个或多个区块,并在本地进行比较。
  • 一些SFTP服务器具有检查文件扩展名(我不认为openssh支持此功能(。Paramiko sftp 文件有一个check()方法,允许您获取部分或全部文件的哈希。

为了直接回答你的问题标题,转移不是原子的。在写入文件时,仍然可以在系统上更改该文件。如果你想防止这种情况,你可以远程将文件写入一个临时位置,验证它,然后调用sftp.rename将其移动到它的最终目的地(这是同一文件系统中Linux上的原子操作(。这大致类似于 rsync 所做的,并且可能尽可能接近"原子"。

最新更新