刚刚在贴吧看到有人对web目录如何做权限设定很是疑惑。
下面我来做一下讲解。
本文使用到的是linux中的setgid(该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.)权限。
关于setgid请参考:Linux下chmod g+s 、chmod o+t 、chmod u+s详解

下面是详细的实验步骤:
1.创建公共web组,以及多个账户,保证新建的账户共同属于web组。

[root@bak ~]# groupadd web
[root@bak ~]# useradd lili -G web
[root@bak ~]# useradd lilei -G web
[root@bak ~]# useradd hanmeimei -G web

2.在/tmp下创建测试目录web,设定其属组为"web",并将权限设定为775。

[root@bak tmp]# pwd
/tmp
[root@bak tmp]# mkdir web
[root@bak tmp]# chmod 775 web
[root@bak tmp]# chgrp web web
[root@bak tmp]# ll
drwxrwxr-x. 2 root   web      4096 12月 11 10:28 web
[root@bak tmp]#

3.测试普通权限下,多个用户是否可以同时读写。
使用lili用户新建一个文件名为lili。

[lili@bak tmp]$ cd web
[lili@bak web]$ ls
[lili@bak web]$ touch lili
[lili@bak web]$ ll
总用量 0
-rw-rw-r--. 1 lili lili 0 12月 11 10:29 lili

我们可以看到lili新建的文件默认权限为775,属主和属组都是lili。这个权限不出意外的话,lilei是没有权限写的,只是能读,下面我们测试。

[lilei@bak web]$ pwd
/tmp/web
[lilei@bak web]$ ll
总用量 0
-rw-rw-r--. 1 lili lili 0 12月 11 10:29 lili
[lilei@bak web]$ echo "I'm lilei.">>lili
bash: lili: 权限不够

不出所料,lilei确实对此文件没有写的权限。
下面的步骤,就是设定lili创建的文件,lilei和hanmeimei默认是可以更改的。
4.测试setgid权限,创建同组用户都能读写的目录。
返回root用户,清空/tmp/web目录,并设定setgid权限。

[root@bak tmp]# ll web -d
drwxrwxr-x. 2 root web 4096 12月 11 10:29 web
[root@bak tmp]# chmod g+s web
[root@bak tmp]# rm -rf web/*
[root@bak tmp]# ll web -d;ll web
drwxrwsr-x. 2 root web 4096 12月 11 10:32 web
总用量 0
[root@bak tmp]#

此时我们可以看到web目录的权限从【drwxrwxr-x】变为【drwxrwsr-x】。
web目录已经具备setgid权限了。
5.测试是否已经达到预期需求。
切换到lili用户,重新建立一个文件名为lili,并且在文件中写入文本“I'm lili.”。

[lili@bak web]$ touch lili
[lili@bak web]$ ll
总用量 0
-rw-rw-r--. 1 lili web 0 12月 11 10:32 lili
[lili@bak web]$ echo "I'm lili.">>lili
[lili@bak web]$ cat lili
I'm lili.
[lili@bak web]$ ll
总用量 4
-rw-rw-r--. 1 lili web 36 12月 11 10:34 lili

注意看,lili文件默认的属组就是web了,而组用户的权限为rw-,不出意外的话,与lili同属web组的lilei和hanmeimei也对此文件具有读写权限,下面我们测试。
切换到lilei用户。
尝试对lili文件写入文本"I'm lilei."。并使用cat查看lili文件。

[lilei@bak web]$ echo "I'm lilei.">>lili
[lilei@bak web]$ cat lili
I'm lili.
I'm lilei.

我们可以看到,文件里有lili和lilei写入的文本了。
同样用hanmeimei用户测试,应该有相同的结果。

[hanmeimei@bak web]$ ll
总用量 4
-rw-rw-r--. 1 lili web 21 12月 11 10:33 lili
[hanmeimei@bak web]$ echo "I'm hanmeimei.">>lili
[hanmeimei@bak web]$ cat lili
I'm lili.
I'm lilei.
I'm hanmeimei.

接下来我们验证一下lilei删除hanmeimei的文件。
使用hanmeimei用户,建立一个包含网络信息的hanmeimei文件。

[hanmeimei@bak web]$ echo `ifconfig`>hanmeimei
[hanmeimei@bak web]$ ll
总用量 8
-rw-rw-r--. 1 hanmeimei web 768 12月 11 10:35 hanmeimei
-rw-rw-r--. 1 lili      web  36 12月 11 10:34 lili

通过lilei用户查看此文件,并将此文件删除。

[lilei@bak web]$ ll
总用量 8
-rw-rw-r--. 1 hanmeimei web 768 12月 11 10:35 hanmeimei
-rw-rw-r--. 1 lili      web  36 12月 11 10:34 lili
[lilei@bak web]$ cat hanmeimei 
eth0 Link encap:Ethernet HWaddr 00:24:E8:0C:4C:90 inet addr:192.168.16.180 Bcast:192.168.16.255 Mask:255.255.255.0 inet6 addr: fe80::224:e8ff:fe0c:4c90/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:322849515 errors:0 dropped:0 overruns:0 frame:0 TX packets:177573680 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:452911214991 (421.8 GiB) TX bytes:12856189965 (11.9 GiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1275112 errors:0 dropped:0 overruns:0 frame:0 TX packets:1275112 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:427547657 (407.7 MiB) TX bytes:427547657 (407.7 MiB)
[lilei@bak web]$ rm -rf hanmeimei
[lilei@bak web]$ ll
总用量 4
-rw-rw-r--. 1 lili web 36 12月 11 10:34 lili
[lilei@bak web]$

可以看到,lilei可以顺利删除hanmeimei创建的文件。

总结
通过setgid权限,我们可以实现多个用户可以更改web目录中的文件。
生产环境中,我们可以设定多个用户通过ftp登录到web目录,用户对文件都有读写权限,apache(只讨论使用apache的情况)用户也具有读写权限,这样就不用考虑更改或上传文件后重新修改权限,或某个新用户没有权限的问题了。

回顾一下,步骤很简单:
1.设定用户属于同一个组。
2.设定web目录属组为这个组。
3.web目录使用setgid权限。