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

4
我使用paramiko.SFTP对象的getput方法。我模糊地记得,有时使用get方法可能会得到不完整的文件内容,但从未注意到put存在任何问题。这是我的运气好,还是应该进行额外的检查,以确保我能够在远程服务器上得到正确的文件?如果需要,我应该如何做,考虑到我只有SFTP访问权限?
通过SFTP-only访问,我指的是我无法SSH登录。
$ ssh user@ipaddress
user@ipaddress's password: 
PTY allocation request failed on channel 0
shell request failed on channel 0

1
我每天都使用 put 命令并且我看到文件总是到达远程服务器。但是如果你想确保,可以使用 ssh.exec_command 命令发送任何你想要的 shell 命令(比如简单的 ls 命令)。 - Milo
我指的是文件内容,抱歉。我更新了问题以澄清。另外,请注意我没有服务器上的exec_command访问权限。 - tshepang
那么无法通过SSH登录到服务器吗? - Milo
你可以将MD5哈希作为单独的文件通过SFTP传输。检查的责任在于其他人,但至少你已经完成了部分工作。你甚至可以获取文件并检查MD5哈希值 - 如有需要,重新发送。基本上,成为自己的验证器。 - tdelaney
@tdelaney 我也曾考虑过那个解决方案...太丑陋了。谢谢你确认我没有疯掉。 - tshepang
1个回答

3
如果SFTP传输没有错误或中断,那么您可以相当确定文件已完全复制,因为SFTP协议要求每个发送的块都得到确认。因此,在TCP的可靠性、SSH通道和每个块的ACK之间,文件很少会被截断。
当仅使用SFTP时,您还可以执行以下几个操作:
- 在传输后,您可以调用`stat()`函数来验证其实际大小。 - 您可以读取文件的一个或多个块并在本地进行比较。 - 一些SFTP服务器具有检查文件扩展名(openssh不支持此功能)。Paramiko SFTP文件具有`check()`方法,允许您获取文件的某些或全部哈希值。
直接回答您的问题的标题,传输是原子的。在写入过程中,文件仍可能在系统上被修改。如果要防止这种情况发生,您可以将文件远程写入临时位置,验证它,然后调用`sftp.rename`将其移动到最终目标(在同一文件系统内,这是Linux上的原子操作)。这大致类似于rsync的操作,也许是最接近“原子”的方法了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接