如何允许多个人通过 sftp 更改文件的 mtime -时间戳?

如何允许多个人通过 sftp 更改文件的 mtime -时间戳?

我有一个目录,多个用户可以访问。他们更改、上传和删除目录中的文件。他们都属于同一用户组。目录中的文件的访问权限为 660。

问题是,如果用户不是文件的所有者,他们就无法设置文件的修改时间。

例如,用户 AAA 上传了一个文件“EXAMPLE.jpg”,用户 BBB 下载了它,修改了它,然后再次上传。该文件的“上次修改”时间戳将是 BBB 上传它的时间,而不是它上次修改的时间。我尝试将文件的权限设置为 777,但没有帮助。

该问题在 sftp-logs 中显示为:

Dec  5 16:37:08 servername sftp-server[695]: open "/shared_directory/EXAMPLE.jpg" flags WRITE,CREATE,TRUNCATE mode 0666
Dec  5 16:37:08 servername sftp-server[695]: close "/shared_directory/EXAMPLE.jpg" bytes read 0 written 42765
Dec  5 16:37:08 servername sftp-server[695]: set "/shared_directory/EXAMPLE.jpg" modtime 20111205-15:53:31
Dec  5 16:37:08 servername sftp-server[695]: sent status Permission denied

Winscp 会在这种情况下发出警告Upload of file 'example.jpg' was successful, but error occurred while setting the permissions and/or timestamp. If the problem persists, turn on 'ignore permission errors'。这个警告​​很容易被忽略,但如果我想让我的用户在文件上传后通过编辑时间戳来“保留”时间戳,该怎么办?

已经有了类似的问题比这还多,但却没有得到答复:(。

答案1

由于某些神秘的原因,Unix/Linux 系统对修改时间的保护非常严格。只有所有者[*] 可以执行您需要的操作,即将修改时间推迟。

您无法使用 ACL(man setfacl)来控制它。

我能想到的一个解决方法是使用 Samba,它有dos filemode选项。它完全满足您的要求(尽管名称不太明显)。当然,我绝不推荐使用 samba 而不是 sftp;samba 是一场管理噩梦。

事实上,如果我是你,我会选择一种非常非常丑陋的黑客手段。编写一个脚本,扫描 sftp-log 文件中的行set ... modtime,并针对每一行立即尝试运行touch --mtime。显然,该脚本需要以 root 身份运行,因此请确保它不会受到代码注入(例如包含 ' 或 " 或 ; 或 $ 字符的文件名和日期)。


[*] 实际上,也有用户拥有 CAP_FOWNER(例如 root),但这是系统范围的功能,因此不适用于您的情况。

答案2

用户可以删除然后上传已更改的文件。这样他们就可以更改所有权,并能够更新文件的时间戳。

文件夹权限应该是这样的drwxrwsr-x,文件权限应该是这样的-rw-rw-r--。用户应该与文件夹和文件位于同一组中。

也可以看看:如何在 Ubuntu 9.10 上为编辑 /var/www 中的多个站点的多个用户设置权限结构?

相关内容