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

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

我遇到了这个问题,我们的一个客户一直在通过 SFTP 传输截断的数据。我不确定问题出在我们这边还是他那边。我已启用 SFTP 日志记录,但它不允许我检测上传是否已中断。

例如,如果我启动 sftp 客户端,并^C在上传过程中点击,服务器只会显示类似的内容close "/data/README.md" bytes read 0 written 5366,这与不间断的上传没有区别。

我猜测类似.part前缀的东西会起作用,但是通过查看有关服务器故障的其他帖子,我认为 OpenSSH 的 sftp 服务器不可能做到这一点。

那么,有没有办法可以检测文件上传是否已中断?

答案1

我假设“sftp 客户端”指的是 OpenSSH SFTP 客户端。“问题”在于,当您按下 时Ctrl+C,它会停止上传并干净地关闭远程文件,就像上传完全完成一样(请注意,这是正确的行为,许多其他 SFTP 客户端的行为也相同)。因此,服务器完全无法判断上传是否中断。


严格来说,确实如此,因为 OpenSSH 客户端在创建文件时会向服务器发送大小提示。但 OpenSSH 服务器不使用甚至不记录该信息。不过,如果您可以选择,修改其代码以记录大小会非常简单。

参见:process_opensftp-server.c

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)。在这种情况下,您将在 中获得 0 a->size


如果客户端真的中止了上传(没有彻底关闭远程文件,例如sftp被终止时),你就可以从“强制”前缀到“关闭”记录来判断它:

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

相关内容