我使用get
对象的put
和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
答案 0 :(得分:2)
由于SFTP协议要求确认每个发送的块,因此您可以确定SFTP传输是否完成而没有错误或中断,文件已完全复制。因此,在TCP的可靠性,SSH通道和每个块的ACK之间,文件不可能以任何方式被截断。
仅使用SFTP时可以做的更多事情:
stat()
以验证其实际大小。check()
方法,允许您获取部分或全部文件的哈希值。要直接回答您问题的标题,转移不原子。该文件在编写时仍可在系统上进行更改。如果要防止这种情况,可以远程将文件写入临时位置,验证它,然后调用sftp.rename
将其移动到它的最终目的地(这是在同一文件系统中的Linux上的原子操作)。这大致类似于 rsync 所做的,并且可能接近“原子”。