У нас есть сервер, который действует как «Dropbox» для (внешних) пользователей, которые могут загружать нам данные через sftp / ssh. Нам необходимо обрабатывать эти файлы (расшифровывать, распаковывать и т. Д.) По мере их поступления. Раньше мы просто обрабатывали каждый файл в домашнем каталоге каждого пользователя независимо от того, обрабатывали ли мы его уже. Это оказалось расточительным. Я обновил (переписал) наш скрипт обработки, чтобы полагаться на такой механизм, как:
FILESTOPROCESS=$(find -H /home/$CUST -type f -newer /home/$CUST/marker-file)
Это в сочетании с touch /home/$CUST/marker-file
отлично поработал, и наша рабочая нагрузка резко сократилась.
Примерно день назад у нас возникла проблема с конфигурацией на нашем SSH-сервере, которая временно не позволяла пользователям загружать нам файлы. Когда скрипт запустился снова, он пропустил файл, который пользователь изначально не смог загрузить, но затем загрузил через sftp / ssh с параметром «-p» для сохранения метки времени. Это установило c / a / mtimes файла на день или около того старше, чем файл-маркер, и поэтому он впоследствии был проигнорирован.
Я хочу запретить пользователям загружать файлы с помощью «-p», чтобы файлы создавались с текущими отметками времени.
Могу я сделать это в sshd_config?
Нет, в конфиге этого сделать нельзя. Просматривая sftp-server.c
, Я вижу, что единственный способ отключить это - запустить sftp-server
в режиме только для чтения, что совершенно бесполезно, если вы хотите разрешить закачку :)
Если вы не против поддерживать свой собственный пакет openssh, вы можете удалить вызовы utimes
/futimes
в sftp-server.c
перед компиляцией. В качестве альтернативы вы можете использовать LD_PRELOAD
библиотека без реализаций этих функций.
Вы можете использовать incond (демон inotify cron), чтобы запускать сценарий при добавлении файла.
Если у вас есть много загруженных файлов одновременно, вы можете поставить в очередь имена файлов для обработки, а затем вы можете обрабатывать элементы очереди один за другим.
Вы сказали, что ... "-p" option ... set the c/a/mtimes of the file ...
- это неверно, так как ctime можно установить только на текущее время, изменив mtime или разрешения inode (или другие настройки inode, которые здесь не актуальны).
Обладая этими знаниями, вы можете находить необработанные файлы, используя -cnewer
.
$ FILESTOPROCESS=$(find -H /home/$CUST -type f \
\( -newer /home/$CUST/marker-file -o \
-cnewer /home/$CUST/marker-file \) )
Я не знаю (но я так не думаю), что вы можете сделать это в sshd_config. Однако вот идея: что, если вы измените сценарий обработки так, чтобы файлы сначала попадали во временный каталог, вы берете хеш (возможно, md5) файла и сравниваете этот хеш с файлом с тем же именем в каталог пользователя (если такой файл существует).
Если хеш совпадает, то ничего не делайте (в чем смысл?)
Если хэш не совпадает, скопируйте (не перемещайте) файл из временного каталога в окончательное расположение (конечно, без опции -p).