Назад | Перейти на главную страницу

Как разрешить нескольким людям изменять mtime -timestamp файла через sftp?

У меня есть каталог, к которому имеют доступ несколько пользователей. Они изменяют, загружают и удаляют файлы в каталоге. Все они принадлежат к одной группе пользователей. Файлы в каталоге имеют права доступа 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?