我有一个多个用户有权访问的目录。 他们更改,上传和删除目录中的文件。 他们都属于同一个用户组。 目录中的文件的访问权限为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' 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' 。 这个警告很容易被忽略,但是如果我想允许我的用户在file upload后通过编辑来“保留”时间戳呢?
已经有一个类似的问题比这个,但没有回答:(。
出于某种神秘的原因,Unix / Linux系统尽可能的强调mtime。 只有主人[*]可以做你需要的东西。 即使使用ACL(man setfacl),也无法控制它。
我能想到的一个解决方法是使用Samba,它具有dos filemode选项。 它完全符合你的要求(虽然名字不是很明显)。 当然,我远不是推荐samba的samba; 桑巴舞是一场行政噩梦。
事实上,如果我是你,我会去做一个非常非常丑陋的黑客攻击。 写一个脚本,扫描sftp日志文件的set ... modtime行,并为每一个这样的行立即尝试运行touch --mtime 。 显然,脚本需要以root身份运行,因此请确保它不受代码注入的影响(例如包含“或”或$或$字符的文件名和date)。
实际上,用户也拥有CAP_FOWNER(比如root),但是这是全系统的能力,所以不适用于你的情况。
用户可以删除然后上传更改的文件。 这样他们将改变所有权,他们将能够更新文件的时间戳。
文件夹权限应该是drwxrwsr-x ,文件权限应该像-rw-rw-r-- 。 用户应该与文件夹和文件在同一组中。
另请参阅: 如何为Ubuntu 9.10上的/ var / www中的多个用户编辑多个用户的权限结构?