paramiko文件传输操作是原子的吗?

时间:2013-10-07 11:40:04

标签: python sftp paramiko

我使用get对象的putparamiko.SFTP方法。我可以依稀记得我曾经使用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

1 个答案:

答案 0 :(得分:2)

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

仅使用SFTP时可以做的更多事情:

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

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