我是非 root 用户,并创建了一个目录,我组中的其他用户可以在其中写入。该目录是 setgid,因此其中的文件和目录属于同一组。
我可以删除此目录中的文件,但如果用户创建了包含文件的子目录,我似乎无法删除这些文件。我能做些什么特别的事情(除了打扰相关用户或系统管理员)来删除这个子目录吗?
编辑:当然,不可避免地会有人问“为什么?”
有问题的共享文件夹是 mercurial 存储库。我们不能使用基于共享帐户 ssh 密钥的服务器(如 mercurial-server),而且由于各种原因,我们也不能将其托管在外部。但那部分工作正常。我们使用 Redmine 进行项目管理,但它尚未读取存储库索引以获取文件内容 - 它读取工作目录。因此,工作目录必须保持最新。crontab
已被系统管理员禁用,因此这是不可能的。所以我天真地在执行“ hg update
”的共享存储库中放置了一个变更集钩子。这似乎最初工作正常,直到当然,有人推送了一个带有新目录的提交。虽然我曾模糊地想过尝试为钩子制作一个 setuid 脚本,但我可能只会考虑更安全的途径。
答案1
为了删除目录中的文件,您需要对该目录具有写权限。显然,用户在您没有写权限的情况下创建了目录,在这种情况下,您的问题的答案是否定的,如果不与相关用户或系统管理员交谈,您就无法执行任何操作。
但是,如果我是系统管理员,我会担心你正在做的事情。用户在其他用户目录中创建文件是不正常的。有没有更好的方法来做你正在做的事情?例如,上传到合适的 Web 应用程序可以提供更好的控制,也意味着你不必担心这一点。
答案2
这不是一个万无一失的答案,因为用户可以覆盖 umask,但你可以将“公共”文件夹的 umask 设置为由其他用户继承,这样他们创建的任何目录也将具有 777 权限。这样你就可以删除他们的文件。
dir=/tmp/abcd
mkdir -o $dir
chmod 777 $dir
setfacl -d -m o::rwx $dir
setfacl -d -m g::rwx $dir
# let users write to $dir, including making subdirs underneath
# examples:
sudo -u other_guy mkdir -o $dir/foo
sudo -u other_guy touch $dir/foo/bar
rm -rf $dir
如果没有这些setfacl
行,这将不起作用,因为$dir/foo/bar
除了 之外的任何人都可以删除它other_guy
。
当然,如果用户决定故意更改文件的权限,则这种情况就会发生。