OpenSSH SFTPサーバーで中断されたアップロードを検出または記録する方法は?


9

私の顧客が切り捨てられたデータをSFTPで処理している場合、この問題が発生します。問題が私たちの側にあるのか彼の側にあるのかわかりません。SFTPロギングを有効にしましたが、アップロードが中断されたかどうかを検出できません。

たとえば、sftpクライアントを起動して、^Cアップロードの途中でヒットした場合、サーバーはのようなclose "/data/README.md" bytes read 0 written 5366メッセージを表示します。これは中断のないアップロードと区別がつきません。

.partプレフィックスのようなものが機能すると思いますが、サーバー障害に関する他の投稿を見ると、OpenSSHのsftpサーバーでは可能ではないと思います。

それで、ファイルのアップロードが中断されたかどうかを検出する方法はありますか?

回答:


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になりa->sizeます。


クライアントが本当にアップロードを中止した場合(リモートファイルが完全に閉じられずに、たとえば、sftp強制終了された場合)、「強制」プレフィックスから「クローズ」レコードにそれを伝えることができます。

強制クローズ "/data/README.md"バイト読み取り0が書き込まれた5366


1
うわー、あなたはwinSCPを作りましたか?ビッグアップ男。答えてくれてありがとう。
surjikal 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.