「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