我有这个问题,我们的客户一直在使用 SFTP 截断数据。我不确定问题出在我们这边还是他那边。我已启用 SFTP 日志记录,但它不允许我检测上传是否已中断。
例如,如果我启动 sftp 客户端,并^C
在上传过程中点击,服务器只会说类似close "/data/README.md" bytes read 0 written 5366
,这与不间断上传无法区分。
我.part
想像前缀这样的东西会起作用,但是通过查看有关服务器故障的其他帖子,我认为 OpenSSH 的 sftp 服务器不可能。
那么,有没有办法让我检测文件上传是否已中断?
我假设“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);
Run Code Online (Sandbox Code Playgroud)
将logit
语句更改为:
logit("open \"%s\" flags %s mode 0%o size %llu",
name, string_from_portable(pflags), mode, (unsigned long long)a->size);
Run Code Online (Sandbox Code Playgroud)
请注意,发送大小提示是可选的。虽然一些 SFTP 客户端会发送它(例如 OpenSSH 或 WinSCP),但有些不会(例如 PSFTP、FileZilla 或 LFTP)。在这种情况下,您将在a->size
.
如果客户端真的中止了上传(没有干净地关闭远程文件,例如当sftp
被杀死时),您将能够将它从“强制”前缀告诉“关闭”记录:
强制关闭“/data/README.md”字节读取 0 写入 5366
归档时间: |
|
查看次数: |
2032 次 |
最近记录: |