![如何使用 OpenSSH SFTP 服务器检测或记录中断的上传?](https://linux22.com/image/648027/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20OpenSSH%20SFTP%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%A3%80%E6%B5%8B%E6%88%96%E8%AE%B0%E5%BD%95%E4%B8%AD%E6%96%AD%E7%9A%84%E4%B8%8A%E4%BC%A0%EF%BC%9F.png)
我遇到了这个问题,我们的一个客户一直在通过 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_open
sftp-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