不允许-p在sftp上

我们有一个服务器,作为(外部)用户通过sftp / ssh上传数据给我们的“保pipe箱”。 我们需要处理这些文件(gpg解密,解压缩等)。过去,我们只是处理每个用户主目录中的每个文件,而不考虑是否已经处理它。 结果这是浪费。 我更新(重写)了我们的处理脚本,依赖于一个机制,如:

FILESTOPROCESS=$(find -H /home/$CUST -type f -newer /home/$CUST/marker-file) 

这与touch /home/$CUST/marker-file结合起来效果很好,我们的工作量大大减less了。

大约一天之前,我们在SSH服务器上有一个configuration问题,暂时不允许用户上传文件给我们。 当脚本再次运行时,忽略了用户最初无法上传的文件,但随后通过带“-p”选项的sftp / ssh进行上传,以保留时间戳。 这将文件的c / a / m时间设置为比标记文件更早的一天,所以随后被忽略。

我想禁止用户使用“-p”进行上传,以便使用当前时间戳创build文件。

我可以在sshd_config中做到这一点?

不,你不能在configuration中做到这一点。 通过sftp-server.c查看,我发现禁用这个function的唯一方法是以只读模式运行sftp-server ,如果要允许上传,那么这是非常没用的:)

如果你不介意维护你自己的openssh包,你可以在编译之前futimes sftp-server.c utimes / futimes调用。 或者,您可以使用LD_PRELOAD库来实现这些function的noop实现。

您可以使用incond(inotify cron守护程序)在添加文件时触发脚本。

如果一次上传多个文件,则可以将要处理的文件名排队,然后逐个处理队列项目。

您说... "-p" option ... set the c/a/mtimes of the file ... – 这是不正确的,因为只能通过更改inode mtime来将ctime设置为当前时间或权限(或其他inode设置在这里不相关)。

有了这些知识,您可以使用-cnewerfind未处理的文件。

 $ FILESTOPROCESS=$(find -H /home/$CUST -type f \ \( -newer /home/$CUST/marker-file -o \ -cnewer /home/$CUST/marker-file \) ) 

我不知道是否(但我不认为)你可以在sshd_config中完成这个。 但是,这里有一个想法:如果修改了处理脚本,以便文件首先进入临时目录,则可以抓取文件的散列(可能是md5),然后将该散列与文件中相同名称的文件进行比较用户的目录(如果这样的文件存在)。

如果哈希匹配,那么不要做任何事情(有什么意义?)

如果散列不匹配,则将文件从临时目录复制(不要移动)到最终位置(当然,不带-p选项)。