3

我使用对象getput方法。paramiko.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
4

1 回答 1

3

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

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

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

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

于 2013-10-09T15:13:03.737 回答