SFTP転送ファイルのタイムスタンプ

SFTP転送ファイルのタイムスタンプ

sshd異なるタイムゾーン/ DSTの複数のユーザーからSFTP経由でファイルを受信するSSHサーバー(一般)を実行します。これにより、一連のアクションがこれらのファイルをポーリングしてさらに処理します。

ファイルが処理されない場合(エラーやスローワーカープロセスなど)、SFTPマップされたすべてのディレクトリを確認し、すべてのファイルを報告する簡単なチェックを実装することにしました。以前の

問題は、SFTPがサーバーから受け取ったファイルには、明らかに次の特徴があることです。ユーザータイムスタンプのローカルタイムゾーン/ DSTそしてmtime- 驚いたことに - でもctime。これにより、スキャンは正のタイムゾーンオフセットで到着するファイルを検出できず、負のタイムゾーンオフセットで到着するファイルをすぐに報告します。

受信したファイルのタイムスタンプをサーバーのローカルタイムゾーンまたはUTCに正規化する方法が見つからないようです。

答え1

ファイルタイムスタンプ変更要求を拒否するようにSFTPサーバーを構成できます。現在の構成ラインを見つけます/etc/ssh/sshd_config。私の場合

Subsystem      sftp    /usr/libexec/openssh/sftp-server

サーバーを実行して-Q実行できる要求を一覧表示するように選択します。

/usr/libexec/openssh/sftp-server -Q requests

私が知っている限り、これには時代の変化が含まれており、おそらくこれに該当しますsetstat。ファイルからこれらの要求を拒否するには、fsetstatブラックリストオプションを使用します。-Psshd_config

Subsystem       sftp    /usr/libexec/openssh/sftp-server -P setstat,fsetstat

設定の再読み込みは、SIGHUP信号を使用して設定を終了することによって信号を受信しますsshd

当時sftp試してみると置く-p時間を維持するオプションを使用してサーバーにファイルを送信すると、ファイルはコピーされますが、最後に変更された時間はまだ「今」です。顧客には警告が表示され、ユーザーに次のことを紹介する必要があります。

sftp> put -p localfile remotefile
Uploading localfile to remotefile
Couldn't fsetstat: Permission denied

答え2

この問題について私が見た1つの解決策は、touch文書を受け取るとすぐに文書を送信することです。これにより、そのファイルのアクセスと変更のタイムスタンプが変更されます。

源泉:手動タッチ

答え3

ファイル数が多い場合は、inotifywait到着する新しいファイルを監視し、タイムスタンプを変更するために使用できます。 (デフォルトの制限は8192個のファイルとディレクトリです。この制限を増やすことはできますが、あまりにも多くは高価なので良い考えではありません)。に対する変更を繰り返し見つけるには、次の手順を実行します/dir

inotifywait -m -r -e close_write -e attrib /dir

継続的に実行され、次の結果が出力されます。

/dir/subdir ATTRIB filea
/dir/subdir CLOSE_WRITE,CLOSE filea

ファイル変更の場合/dir/subdir/filea。ファイル名を再構成するためのシェルスクリプトを作成し$f(空白の名前を参照)、イベントを使用してstat -c %Z $f現在の変更date +%s時間touchを取得できるため、タイミングの小さな違いは無視する必要があります。

関連情報