У меня есть SFTP-сервер Linux, который я использую для обмена файлами с другими людьми.
Есть скрипт, который автоматически находит и удаляет файлы, загруженные более 10 дней назад:
find . -not -path . -mtime +10 -exec rm -frv {} \;
Я заметил, что некоторые клиенты SFTP сохраняют Последнее изменение date, в результате чего сценарий удалит файлы раньше, чем ожидалось.
Например, если сегодня 15 декабря, и клиент загружает файл, который он изменил на своем компьютере 1 декабря, файл удаляется немедленно, а не 25 декабря.
Итак, как я могу отказать клиентам в изменении Последнее изменение атрибут после загрузки?
Вы не можете сделать это чисто, и вы действуете «вопреки» устоявшейся практике Unix / Linux. Ожидаемый способ выполнить вашу задачу - использовать -mtime +10 -ctime +10
, то есть удалить файлы, которые старше по сравнению с mtime и ctime.
Многие инструменты, которые работают с файлами, возвращают mtime в прошлое, когда содержимое осмысленно изменилось. Но ctime («время изменения inode») является индикатором того, что что-то в файле изменилось: mtime, его содержимое, разрешения или другие метаданные.
Также предупреждение: ваш сценарий будет иметь непредвиденные последствия, потому что он также проверяет mtime каталогов и удаляет целые каталоги. Когда вы пишете в файлы, mtime и ctime каталога не меняются, поэтому файлы воля быть удаленным в результате rm -r ./that/directory
В sftp-server
(и совместимый internal-sftp
) имеет -P
и -p
переключает в черный / белый список определенных запросов SFTP.
Вы можете использовать их, чтобы запретить setstat
и fsetstat
Запросы:
Subsystem sftp internal-sftp -P setstat,fsetstat
Обратите внимание, что это также запретит изменение разрешений (и других атрибутов).
Конечно, вы можете сделать это для каждого пользователя (или по другим критериям), используя Match
директива.