禁止在 sftp 上使用 -p

禁止在 sftp 上使用 -p

我们有一台服务器,它充当外部用户的“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 实现库。futimessftp-server.cLD_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选项)。

相关内容