在开发服务器(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更改为虚拟主机的用户名。 这是因为当创build一个新文件时,它是由“root”创build的,因为我们的本地机器是使用root用户的SMB服务器。 这些文件需要由虚拟主机用户名拥有才能运行。
这个脚本工作得很好,但是当我们得到很多virutalhosts /文件的时候,服务器就会开始放慢速度,因为无论它是否需要它,它都会传播一切。 大多数时候它不需要它,因为它只是新的文件。
我的想法是将其更改为在public_html目录中查找任何不属于该虚拟主机用户名的文件,并仅显示该文件。
但是我担心不得不滚动浏览每个文件来知道哪些文件可能与当前的工作方式(只是查看目录级别然后recursion运行)一样(或更多)。
所以想知道有没有人有更好的想法呢? (满意sh或php脚本解决scheme)
目标:任何新创build的文件,chown和chmod它虚拟主机用户名和755.跳过所有其他文件。 不pipe怎样,也有能力跳过某些文件types。
“chown -R”不会更改任何已经具有所需所有权的文件。 它可能比写一个自己做的程序更有效地完成这项工作。 chown是由一些非常优秀的编程人员编写的,他们可能已经考虑了许多您可能没有的边缘案例。 但是,唯一的方法是通过一个基准。 (我很想看看你的结果!)
这是一个简单的脚本,可以安全地find不属于玛丽的文件,并将其所有权设置为玛丽:
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
我会使用像Watcher ,它利用Linux内核inotifyfunction。 如果你熟悉incron ,那么你就知道Watcher是什么,不同的是Watcher是recursion的,而incron只能看到一个目录,而不是它下面的子目录。
所以,不要一直爬过不断增长的/ home,你可以设置Watcher在/ home下的某个文件/目录变化时接收来自内核的信号,然后运行你需要的任何命令或脚本。 这要快得多,而且资源密集程度要低一些。
在这里做的最好的事情并不是每个人都以根的方式连接,这可能是适宜的,但是正如你所发现的,会导致各种各样的其他问题。 这就是我所追求的第一个select(即使最初被拒绝,我仍然会继续追求它)。
您可能会使用%u和%greplace从samba force user和force group指令中获得一些里程。
您可以使用inotify来检测文件系统更改并运行脚本。
我的build议是创build一个环境,使用正确的perms / owner / group创build文件。 然后“chmod -R”/“chown -R”可以用来解决人们搞砸的情况。
目录中的“chmod ug + s”告诉Linux,在该目录中创build的文件不应该由用户的用户/组创build,而应该inheritance父目录的用户/组。
上次我需要做这样的事情时,我创build了一个只有组权限才真正关注的环境。 因此,目录中的“chmod g + s”确保新文件由正确的组拥有。 然后我configurationApache只需要该组权限就可以访问这些文件。
我需要做的最后一件事是确保用户有“umask 002”设置,以便他们创build默认“组可读”的文件。
有时候,尽pipe我尽了最大的努力,但有人会用错误的权限创build一个文件。 我有一个固定所有权限的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