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

Python paramiko文件传输操作是原子的吗?,python,sftp,paramiko,Python,Sftp,Paramiko,我使用gramiko.SFTP对象的get和put方法。我模模糊糊地记得,我确实有时使用get方法获取不完整的文件内容,但从未注意到put的任何问题。这仅仅是我的运气,还是我应该执行额外的检查以确保在远程端获得正确的文件?如果是这样的话,如果我只有对远程服务器的SFTP访问权,我该怎么做 通过仅SFTP访问,我的意思是我无法SSH进入: $ ssh user@ipaddress user@ipaddress's password: PTY allocation request failed o

我使用
gramiko.SFTP
对象的
get
put
方法。我模模糊糊地记得,我确实有时使用
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服务器有一个check文件扩展名(不过我认为openssh不支持这个)。Paramiko sftp文件有一个
    check()
    方法,允许您获取部分或全部文件的哈希值

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

我每天使用
put
很多次,我看到文件总是到达远程端。但是如果您想确保使用
ssh.exec_命令
并发送您想要的任何shell命令(例如简单的
ls
),我指的是文件内容,对不起。我更新了问题以澄清。另外,请注意,我没有对服务器的
exec\u命令
访问权限。因此无法通过SSH连接到服务器?您可以将md5哈希作为单独的文件进行sftp。检查是其他人的责任,但至少你有一部分做到了。您甚至可以取回文件并根据需要检查md5重新发送。基本上,做你自己的验证者。@tdelaney我认为这是解决方案。。。太难看了。谢谢你确认我没有发疯。