У меня есть каталог, к которому имеют доступ несколько пользователей. Они изменяют, загружают и удаляют файлы в каталоге. Все они принадлежат к одной группе пользователей. Файлы в каталоге имеют права доступа 660.
Проблема в том, что пользователи не могут установить время изменения файлов, если они не являются владельцем этого файла.
Например, пользователь AAA загружает файл EXAMPLE.jpg, пользователь BBB загружает его, изменяет и загружает снова. Временная метка последнего изменения файла будет соответствовать времени его загрузки BBB, а не дате последнего изменения. Я попытался установить права доступа к файлу 777, но это не помогло.
Проблема отображается в sftp-журналах как:
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).
Я могу придумать один обходной путь - использовать Samba, в которой dos filemode
вариант. Он делает именно то, что вам нужно (хотя название не очень очевидно). Конечно, я далек от того, чтобы рекомендовать самбу вместо sftp; самба - административный кошмар.
На самом деле, на вашем месте я бы пошел на очень и очень уродливый хакер. Напишите сценарий, который сканирует файл sftp-log на наличие set ... modtime
строка, и для каждой такой строки сразу же попытаться запустить touch --mtime
. Очевидно, что сценарий должен запускаться от имени пользователя root, поэтому убедитесь, что он защищен от внедрения кода (например, имена файлов и даты, содержащие символы 'или "или; или $).
[*] Фактически, также пользователь, обладающий CAP_FOWNER (например, root), но это общесистемная возможность, поэтому не применима к вашему случаю.
Пользователи могут удалить и загрузить измененные файлы. Таким образом они изменят владельца и смогут обновить временную метку файла.
Разрешение папки должно быть примерно таким drwxrwsr-x
и разрешение файла должно быть таким -rw-rw-r--
. пользователь должен быть в той же группе, что и папка и файлы.
Смотрите также: Как установить структуру разрешений для нескольких пользователей, редактирующих несколько сайтов в / var / www в Ubuntu 9.10?