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