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


9

我的客户在使用SFTP截断数据时遇到了这个问题。我不确定问题是在我们端还是在他身上。我已经启用了SFTP日志记录,但是它不允许我检测上传是否被中断。

例如,如果我启动了sftp客户端,并^C在上传的中间进行了命中,则服务器只会说类似的内容close "/data/README.md" bytes read 0 written 5366,这与不间断的上传是无法区分的。

.part想像前缀这样的东西会起作用,但是通过查看服务器故障上的其他帖子,我认为OpenSSH的sftp服务器是不可能的。

那么,有没有办法让我检测文件上传是否被中断?

Answers:


8

我假设“ 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 in a->size


如果客户端真正中止了上传(而没有干净地关闭远程文件,例如,当文件sftp被杀死时),则可以将其从“强制”前缀告知“关闭”记录:

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


1
哇,您制作了winSCP?大个子们 感谢您的回答,我会做的。
surjikal 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.