如何使用OpenSSH SFTP服务器检测或logging中断上传?

我有我们的客户已经被SFTP截断的数据的这个问题。 我不确定问题是否在我们的最后或他的。 我启用了SFTP日志logging,但是它不允许我检测上传是否被中断。

例如,如果我启动了sftp客户端,并在上传过程中点击了^C ,服务器只是说了一些像close "/data/README.md" bytes read 0 written 5366 ,这与不间断的上传。

我猜像.part前缀可以工作,但通过查看服务器故障的其他post,我不认为这是可能的OpenSSH的sftp服务器。

那么,有没有办法让我检测file upload是否被中断?

    我假设“sftp客户端”是指OpenSSH SFTP客户端。 “问题”是,当你按下Ctrl + C时 ,它停止上传,并干净地closures远程文件,就像上传完成(注意这是一个正确的行为,许多其他SFTP客户端的行为相同)。 所以服务器绝对没有办法告诉上传被中断。


    严格来说,OpenSSH客户端在创build文件时会向服务器发送大小提示。 但OpenSSH服务器不使用,甚至不logging这些信息。 尽pipe修改代码来logging大小非常简单,但如果这是您的select。

    请参见sftp-server.c process_open

     a = get_attrib(); flags = flags_from_portable(pflags); mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666; logit("open \"%s\" flags %s mode 0%o", name, string_from_portable(pflags), mode); 

    logit语句更改为:

     logit("open \"%s\" flags %s mode 0%o size %llu", name, string_from_portable(pflags), mode, (unsigned long long)a->size); 

    请注意,发送尺寸提示是可选的。 当一些SFTP客户端将发送它(例如OpenSSH或WinSCP)时,有些不会(例如PSFTP,FileZilla或LFTP)。 在这种情况下,你会在a->size得到0。


    如果客户端真的中止了上传(没有closures远程文件干净,例如,当sftp被杀害),您将能够从“强制”前缀告诉它“closures”logging:

    强制closures“/data/README.md”字节读取0写入5366