我们有一台服务器,它充当外部用户的“dropbox”,以便用户通过 sftp/ssh 向我们上传数据。我们需要在这些文件(gpg decrypt、unzip 等)传入时对其进行处理。过去,我们只是处理每个用户主目录中的每个文件,而不考虑我们是否已经处理过它。这很浪费。我更新(重写)了我们的处理脚本,使其依赖于以下机制:
FILESTOPROCESS=$(find -H /home/$CUST -type f -newer /home/$CUST/marker-file)
这与之相结合,touch /home/$CUST/marker-file
效果很好,我们的工作量大大减少。
大约一天前,我们的 SSH 服务器出现配置问题,导致用户暂时无法上传文件给我们。当脚本再次运行时,它忽略了一个用户最初无法上传的文件,但随后通过 sftp/ssh 上传,并使用“-p”选项来保留时间戳。这会将文件的 c/a/mtime 设置为比标记文件早一天左右,因此随后将其忽略。
我想禁止用户使用“-p”上传,以便使用当前时间戳创建文件。
我可以在 sshd_config 中执行此操作吗?
答案1
不,您无法在配置中执行此操作。查看后sftp-server.c
,我发现禁用此功能的唯一方法是以sftp-server
只读模式运行,如果您想允许上传,这是毫无用处的 :)
如果您不介意维护自己的 openssh 包,您可以在编译之前删除对 / 的调用。utimes
或者,您可以使用这些函数的 noop 实现库。futimes
sftp-server.c
LD_PRELOAD
答案2
您可以使用 incond(inotify cron 守护程序)在添加文件时触发脚本。
如果您一次上传多个文件,您可以将要处理的文件名排队,然后逐个处理队列项。
答案3
您说的是... "-p" option ... set the c/a/mtimes of the file ...
- 这是不正确的,因为只能通过更改 inode mtime 或权限(或此处不相关的其他 inode 设置)将 ctime 设置为当前时间。
有了这些知识,您可以使用 找到未处理的文件-cnewer
。
$ FILESTOPROCESS=$(find -H /home/$CUST -type f \
\( -newer /home/$CUST/marker-file -o \
-cnewer /home/$CUST/marker-file \) )
答案4
我不知道(但我认为)您是否可以在 sshd_config 中完成此操作。但是,这里有一个想法:如果您修改了处理脚本,使文件首先进入临时目录,然后获取文件的哈希值(可能是 md5),并将该哈希值与用户目录中同名的文件进行比较(如果存在这样的文件),结果会怎样?
如果哈希匹配,则不执行任何操作(有什么意义?)
如果哈希不匹配,则将文件从临时目录复制(不要移动)到最终位置(当然,不带-p选项)。