我有一个目录,多个用户可以访问。他们更改、上传和删除目录中的文件。他们都属于同一用户组。目录中的文件的访问权限为 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--
。用户应该与文件夹和文件位于同一组中。