在开发服务器(Ubuntu 14.04)上,我们在 cron 上每分钟运行这个 shell 脚本:
for dir in /home/*; do
username=$(basename $dir)
echo "changing ownership to $username in $dir/public_html"
chown -R $username:$username $dir/public_html
chmod 755 $dir
chmod -R 775 $dir/public_html
done
其目的是将任何文件的所有权和 chmod 更改为虚拟主机的用户名。这是因为当创建新文件时,它是由“root”创建的,因为我们的本地计算机使用 root 用户通过 SMB 连接到服务器。文件需要由虚拟主机用户名拥有才能运行。
此脚本运行良好,但是当我们获得大量虚拟主机/文件时,它会开始减慢服务器速度,因为它会 chown 所有内容,无论是否需要。大多数情况下它不需要它,因为只有新文件才需要它。
我的想法是将其更改为 foreach public_html 目录,查找任何不属于该虚拟主机用户名的文件,然后仅 chown 该文件。
但我担心必须浏览每个文件才能知道要 chown 哪些文件,这可能与目前的工作方式(仅查看目录级别然后递归运行)一样(或更多)密集。
所以想知道是否有人对此有更好的想法?(对 sh 或 php 脚本解决方案感到满意)
目的:任何新创建的文件,将其 chown 和 chmod 为虚拟主机用户名和 755。跳过所有其他文件。无论如何,能够跳过某些文件类型也是很好的。
答案1
“chown -R” 不会更改任何已具有所需所有权的文件。它可能比自己编写一个程序更有效地完成这项工作。chown 是由一些非常优秀的程序员编写的,他们可能已经考虑到了许多您可能没有考虑到的极端情况。但是,唯一知道的方法是通过基准测试。(我很想看看你的结果!)
这是一个简单的脚本,它可以安全地找到不属于 mary 的文件,并将其所有权设置为 mary:
find /home/the_place_to_start -xdev \! -user mary -print0 | xargs -0 chown mary
“-xdev” 表示“不跨越挂载点”,是一种很好的安全机制。“-print0”和“-0”选项用于以安全的方式处理带有空格和换行符的文件名。出于安全原因,此命令(和 chmod -R)不会跟踪符号链接……如果有人创建了符号链接,/
那就很糟糕了。
另外,如果你每分钟运行一个 cron 任务,通常最好循环运行相同的代码。以下是原因的解释:http://everythingsysadmin.com/2014/02/how-not-to-use-cron.html
答案2
我会用类似的东西观察者,它利用了 Linux 内核的 inotify 功能。如果你熟悉incron
,那么你就知道Watcher
是什么,不同之处在于 Watcher 是递归的,而incron
只能监视目录,而不能监视其下的子目录。
因此,您无需不断地浏览不断增长的 /home,您可以设置 Watcher,让它在 /home 下某些文件/目录发生变化时接收来自内核的信号,然后针对这些文件运行所需的任何命令或脚本。这样速度更快,资源占用更少。
答案3
最好的做法是不要让每个人都以 root 身份连接,这可能是权宜之计,但正如您所发现的,这会导致各种其他问题。这是我将作为第一个选择追求的(即使最初被拒绝,我也会继续长期追求它)。
您可以使用 sambaforce user
和force group
指令%u
以及%g
替换来获得一些好处。
您可能能够使用 inotify 来检测文件系统变化并运行脚本。
答案4
我的建议是首先创建一个环境,在其中创建的文件具有正确的权限/所有者/组。然后可以使用“chmod -R”/“chown -R”来修复人们搞砸的情况。
目录上的“chmod ug+s”告诉 Linux,在该目录中创建的文件不应使用用户的用户/组来创建,而是继承父目录的用户/组。
上次我需要做类似的事情时,我创建了一个只有组权限才真正重要的环境。因此,在目录上执行“chmod g+s”可确保新文件归正确的组所有。然后,我将 Apache 配置为只需要该组权限即可访问文件。
我需要做的最后一件事是确保用户设置了“umask 002”,以便他们创建默认“组可读”的文件。
尽管我尽了最大努力,但偶尔还是有人会创建具有错误权限的文件。我有一个 shell 脚本可以修复所有权限。但是,它不需要每分钟运行一次......每小时运行一次即可。此时,效率就不那么重要了。
该脚本如下所示:
cd /the/place/where/the/files/are
# Fix the owner and group:
find . -xdev \! -user the_user -print0 | xargs -0 chown the_user
find . -xdev \! -group the_group -print0 | xargs -0 chgrp the_group
# Fix the perms for dirs and files:
find . -xdev -type d -print0 | xargs -0 chmod ug+rx
find . -xdev -type f -print0 | xargs -0 chmod ug+r