Linux文件夹权限

3
在我的办公室,我们有一个像这样的网络目录结构:
/jobs/2004/3999-job_name/...
/jobs/2004/4000-job_name/...

问题在于员工会重命名“4000-job_name”文件夹(这会导致其他依赖该名称与数据库一致的内容出现问题)。
我如何阻止用户重命名父文件夹,同时仍允许他们完全控制该文件夹的内容?
请记住,这是一个Windows用户将要访问的Samba共享。

如果你们这些控制狂不介意等一会儿再关闭它,我想知道这个问题的答案。 - Bill K
此外,为什么这个问题有4个关闭票,而这个几乎相同的问题已经存在数月却没有任何票?http://stackoverflow.com/questions/391284/sharepoint-permission-on-macs 是因为一个是Linux,另一个是Mac吗? - Bill K
为什么这个被标记为“与编程无关”?我甚至使用了预先存在的标签“Linux”,“Samba”和“权限”。 - Matt Darby
这只是因为它与编程无关。一个Linux编程问题可能是“什么C方法设置可读位”。尽管如此,我仍然认为这是程序员感兴趣的问题。 - Bill K
3个回答

6
我认为你想要做这件事情:

我认为您想要执行以下操作:

chmod a=rx /jobs     #chdir and lsdir allowed, modifying not
chmod a=rwx /jobs/*  #allow everything to everyone in the subdirectories

由于目录 /jobs/* 实际上是在 /jobs 中的文件,因此如果没有对 /jobs 的写入权限,则无法更改它们的名称。在 /jobs/ 的子目录中,每个人都可以使用上述命令进行任何操作。

此外,在添加新目录时,请确保将其权限设置为 rwx。

(由 Bill K 编辑以修复示例 - 解决方案是正确的,但由于 SO 添加了奇怪的颜色,他误读了问题)


如果您无法修改 /jobs/2004,那么这是否意味着您无法向其中添加或删除文件? - Bill K
真的,不允许写入 /jobs/2004。但是允许对 /jobs/2004/* 进行写入操作(例如创建/删除/重命名文件)。 - Johannes Weiss

3
问题已经得到解答,我只想简要说一下:在你的问题中,你交替使用了“文件夹”和“目录”这两个术语。它们是非常不同的,在我的经验中,99%的Unix权限问题都与混淆这两个术语有关。记住:Unix有目录,没有文件夹。
编辑:一个文件夹是两片纸板粘在一起,包含文件。因此,一个文件夹是一个容器,它实际上物理上包含它所持有的文件。因此,一个文件只能同时存在于一个容器中。要重命名文件,你不仅需要访问文件夹,还需要访问文件本身。删除文件也是一样。
另一方面,目录本身是一个文件。[事实上,这正是早期Unix文件系统中如何实现目录的:只是带有特殊标志的普通文件,你甚至可以在编辑器中打开它们并更改它们。]它包含从名称到位置的映射列表(类似于电话簿或大型仓库)。[在Unix中,这些映射称为链接硬链接。]由于目录仅包含文件的名称,而不是文件本身,因此相同的文件可以在多个目录下以不同的名称存在。要更改文件的名称(或更准确地说是更改文件的一个名称,因为它可能有多个名称),你只需要对目录具有写访问权限,而不需要对文件具有写访问权限。删除文件也是一样。实际上,你不能删除文件,你只能删除目录中的条目 - 仍然可能有其他目录中的条目指向该文件。[这就是为什么用于删除文件的系统调用/库函数称为unlink而不是delete:因为你只是删除链接,而不是文件本身;如果没有更多的链接指向它,文件会自动进行“垃圾回收”。] 这就是为什么我认为Unix目录的文件夹比喻是错误的,甚至是危险的原因。我所在的Unix邮件列表中最常见的安全问题是:“为什么A可以删除B的文件,即使他没有对它们的写访问权限?”答案是,他只需要对目录具有写访问权限。因此,由于文件夹的比喻,人们认为他们的文件是安全的,即使它们并不安全。使用目录的比喻将更容易解释正在发生的事情:如果我想从电话簿中删除你,我不必追捕你并杀死你,我只需要一支铅笔!

我在职业上已经使用 Linux 十多年了。那么到底有什么区别呢? - Matt Darby
没有区别。之所以使用文件夹是因为那是某人选择来代表目录的图像。这对于那些不太懂技术的人来说也更有意义。 - he_the_great
@Johan,@Matt:更好了吗?@he_the_great:拿出电话簿。拿出文件夹。并排放置。比较一下。它们真的一样吗? - Jörg W Mittag
扩展一下:我知道很多Unix UI使用文件夹来表示目录。这正是问题所在:这是错误的,它会导致误解。而当涉及到文件系统语义时的误解通常会导致安全漏洞或数据丢失。 - Jörg W Mittag
1
这在实现层面上是一个很好的区分,但在那个层面上,我不知道有什么实现了基于“文件夹”的文件系统。这意味着做出区分是毫无意义的,特别是因为使用更多地代表文件夹。 - he_the_great
显示剩余4条评论

2
如果您将父目录--/jobs/2004/--对用户设置为不可写,他们将无法重命名该文件夹。
我在自己的计算机上进行了以下实验以说明这一点:
ndogg@seriallain:/tmp$ sudo mkdir jobs
ndogg@seriallain:/tmp$ sudo mkdir jobs/2004
ndogg@seriallain:/tmp$ sudo mkdir jobs/2004/3999-job_name/
ndogg@seriallain:/tmp$ cd jobs/2004/
ndogg@seriallain:/tmp/jobs/2004$ sudo chown ndogg.ndogg 3999-job_name/
ndogg@seriallain:/tmp/jobs/2004$ ls -alh
total 12K
drwxr-xr-x 3 root  root  4.0K 2009-03-13 18:23 .
drwxr-xr-x 3 root  root  4.0K 2009-03-13 18:23 ..
drwxr-xr-x 2 ndogg ndogg 4.0K 2009-03-13 18:23 3999-job_name
ndogg@seriallain:/tmp/jobs/2004$ touch 3999-job_name/foo
ndogg@seriallain:/tmp/jobs/2004$ mv 3999-job_name/ blah
mv: cannot move `3999-job_name/' to `blah': Permission denied

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接