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
ブラックリストオプションを使用します。-P
sshd_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
を取得できるため、タイミングの小さな違いは無視する必要があります。