Как разрешить нескольким людям изменять 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', Предупреждение можно легко проигнорировать, но что, если я хочу разрешить моим пользователям "сохранять" метки времени, редактируя их после загрузки файла?

Уже есть похожий вопрос, чем этот, но остался без ответа:(.

2 ответа

По какой-то таинственной причине системы Unix/Linux максимально защищают mtime. Только владелец [*] может делать то, что вам нужно. Вы не можете управлять этим, даже с ACL (man setfacl).

Один из обходных путей, который я могу придумать, - это использовать Samba, которая имеет dos filemode вариант. Он делает именно то, что вам нужно (хотя название не очень очевидно). Конечно, я далек от того, чтобы рекомендовать samba вместо sftp; Самба - это административный кошмар.

На самом деле, если бы я был тобой, я бы пошел на очень, очень уродливый взлом. Напишите скрипт, который сканирует файл sftp-log для set ... modtime линия, и для каждой такой строки сразу попытайтесь запустить touch --mtime, Очевидно, что сценарий должен запускаться от имени пользователя root, поэтому убедитесь, что он защищен от внедрения кода (например, имена файлов и даты, содержащие символы "или" или; или символы $).


[*] На самом деле, также пользователь, имеющий CAP_FOWNER (например, root), но это общесистемная возможность, поэтому не применима к вашему случаю.

Пользователи могут удалить, а затем загрузить измененные файлы. Таким образом, они изменят владельца и смогут обновить временную метку файла.

Разрешение папки должно быть что-то вроде drwxrwsr-x и разрешение файла должно быть как -rw-rw-r--, пользователь должен находиться в одной группе с папкой и файлами.

См. Также: Как настроить структуру разрешений для нескольких пользователей, редактирующих несколько сайтов в /var/www в Ubuntu 9.10?

Другие вопросы по тегам