web-dev-qa-db-ja.com

複数の人がsftpを介してファイルのmtime-timestampを変更できるようにするにはどうすればよいですか?

複数のユーザーがアクセスできるディレクトリがあります。ディレクトリ内のファイルを変更、アップロード、および削除します。それらはすべて同じユーザーグループに属しています。ディレクトリ内のファイルのアクセス権は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'。警告は簡単に無視できますが、ファイルのアップロード後にユーザーがタイムスタンプを編集して「保存」できるようにするにはどうすればよいですか?

すでに 同様の質問 これよりもありますが、答えられていません:(。

7
jous

いくつかの不思議な理由で、Unix/Linuxシステムはmtimeを可能な限り強力に保護します。所有者[*]だけがあなたが必要とすることをすることができます。 ACL(man setfacl)を使用しても、制御することはできません。

私が考えることができる1つの回避策は、dos filemodeオプションがあるSambaを使用することです。それはあなたが必要とすることを正確に行います(名前はあまり明白ではありませんが)。もちろん、sftpよりもsambaを推奨することにはほど遠いです。サンバは管理上の悪夢です。

実際、もし私があなたなら、私は非常に醜いハックに行きます。 sftp-logファイルをスキャンしてset ... modtime行を探すスクリプトを作成し、そのような行ごとにすぐにtouch --mtimeを実行しようとします。明らかに、スクリプトはrootとして実行する必要があるため、コードインジェクション( '、 "、;、または$文字を含むファイル名や日付など)から安全であることを確認してください。


[*]実際には、CAP_FOWNER(rootなど)を所有しているユーザーもいますが、これはシステム全体の機能であるため、ケースには適用されません。

8
kubanczyk

ユーザーは、変更されたファイルを削除してからアップロードできます。このようにして、所有権が変更され、ファイルのタイムスタンプを更新できるようになります。

フォルダのアクセス許可はdrwxrwsr-xのようになり、ファイルのアクセス許可は-rw-rw-r--のようになります。ユーザーは、フォルダーおよびファイルと同じグループに属している必要があります。

参照: buntu9.10の/ var/wwwで複数のサイトを編集する複数のユーザーの権限構造を設定するにはどうすればよいですか?

2