複数のユーザーがアクセスできるディレクトリがあります。ディレクトリ内のファイルを変更、アップロード、および削除します。それらはすべて同じユーザーグループに属しています。ディレクトリ内のファイルのアクセス権は660です。
問題は、ユーザーがファイルの所有者でない場合、ユーザーがファイルの変更時刻を設定できないことです。
たとえば、ユーザーAAAがファイル「EXAMPLE.jpg」をアップロードし、ユーザーBBBがファイルをダウンロードして変更し、再度アップロードします。ファイルの「最終変更」タイムスタンプは、実際に最後に変更されたときではなく、BBBがアップロードした時間になります。ファイルのアクセス許可を777に設定しようとしましたが、役に立ちませんでした。
この問題は、sftp-logsに次のように表示されます。
Dec 5 16:37:08 servername sftp-server[695]: open "/shared_directory/EXAMPLE.jpg" flags WRITE,CREATE,TRUNCATE mode 0666
Dec 5 16:37:08 servername sftp-server[695]: close "/shared_directory/EXAMPLE.jpg" bytes read 0 written 42765
Dec 5 16:37:08 servername sftp-server[695]: set "/shared_directory/EXAMPLE.jpg" modtime 20111205-15:53:31
Dec 5 16:37:08 servername sftp-server[695]: sent status Permission denied
Winscpは状況に応じてUpload of file 'example.jpg' was successful, but error occurred while setting the permissions and/or timestamp. If the problem persists, turn on 'ignore permission errors'
。警告は簡単に無視できますが、ファイルのアップロード後にユーザーがタイムスタンプを編集して「保存」できるようにするにはどうすればよいですか?
すでに 同様の質問 これよりもありますが、答えられていません:(。
いくつかの不思議な理由で、Unix/Linuxシステムはmtimeを可能な限り強力に保護します。所有者[*]だけがあなたが必要とすることをすることができます。 ACL(man setfacl)を使用しても、制御することはできません。
私が考えることができる1つの回避策は、dos filemode
オプションがあるSambaを使用することです。それはあなたが必要とすることを正確に行います(名前はあまり明白ではありませんが)。もちろん、sftpよりもsambaを推奨することにはほど遠いです。サンバは管理上の悪夢です。
実際、もし私があなたなら、私は非常に醜いハックに行きます。 sftp-logファイルをスキャンしてset ... modtime
行を探すスクリプトを作成し、そのような行ごとにすぐにtouch --mtime
を実行しようとします。明らかに、スクリプトはrootとして実行する必要があるため、コードインジェクション( '、 "、;、または$文字を含むファイル名や日付など)から安全であることを確認してください。
[*]実際には、CAP_FOWNER(rootなど)を所有しているユーザーもいますが、これはシステム全体の機能であるため、ケースには適用されません。
ユーザーは、変更されたファイルを削除してからアップロードできます。このようにして、所有権が変更され、ファイルのタイムスタンプを更新できるようになります。
フォルダのアクセス許可はdrwxrwsr-x
のようになり、ファイルのアクセス許可は-rw-rw-r--
のようになります。ユーザーは、フォルダーおよびファイルと同じグループに属している必要があります。
参照: buntu9.10の/ var/wwwで複数のサイトを編集する複数のユーザーの権限構造を設定するにはどうすればよいですか?