linux的文件权限通过用户,组和其它组来实现。一个文件只能属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入这个组,一个用户可以同时属于多个组。一般来说一个应用下不要有太多的文件组和用户,最好不要用ROOT执行角本,这样权限都放放大,比较不安全
Linux下很重视权限,权限包括读,写,执行。所以即使Linux下染了病毒,也不一定中病毒,其实就是这个权限的问题。初学者在Linux执行命令是会感觉比较累,每次都是要用su来切换用户,其实这也是Linux保护数据的一种模式。当然建议,用户登入是不要直接用root用户登入。如果知道root登录命令的话。
Linux下有用户跟群组的观念。往往分为三个部分,持该文件的用户(user),跟持该文件同组的用户(group),剩下的其他用户(other)。一个用户可以属于很多个群组。Linux下表示权限有两种方式:
一种是八进制表示法(十位表示法,不是说八进制有十位,而是三个八进制位,再加一个最高位共十位),
另外一种十二位二进制表示法(十二个二进制位)。
先介绍第一种:
是三种模式,三个属组,就构成了9位。-代表无权限,r代表只读,w代表写的权限,x则代表执行。所以就有下面的组合。将-视为0,x视为1,w视为2,r视为4.这种组合根据该位是否有这个数来确定,就确定如下的9种组合方式。刚好,总的权值0-7对应于八进制的全部。所以也可以说权限是可以用八进制来表示的。最高的权限就是7,代表可读,可写,可执行。3就是代表只有写跟执行的权限。其他数字类推。
模式 数字
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
每个八进制数其实可以转化为三位的二进制数,
r=100,w=010,x=001,-=000
这个关系在第二种表示方法中是有用的。由于r是出现在三位中的最高位,就相当于最高位才有效,可忽略0位。在这种方法中,你可以类似的在出现的地方对它置1,不出现的地方置0,然后三个三个的转化就出来三位的八进制数了。
还是举几个例子吧:
-rw-rw-r-- 1 samuel samuel 6479 07-08 08:46 Christians.pls
根据上面对应关系为664.
-rwxr-xr-x 1 samuel samuel 0 Jan 9 17:44 scriptfile.sh
这个对应关系算出来就是755.
所以根据数字也可以推出来777就是指-rwxrwxrwx的模式。
指定权限Linux的命令为chmod,比较自由可以用数字来表示也可以用英文形象的表示。
如chmod 777 samuel.sh所有用户取得最高的权限
chmod o+w samuel.sh其他用户被赋予了写的权限
chmod go-rw samuel.sh组跟其他用户被删去读跟写的权限
chmod的行为规范:
+ 表示添加权限
- 表示删除权限
= 表示使之成为唯一的权限
只有这样,自己写的shell脚本才可以被Linux执行。否则是不可能运行的,这个就是Linux有别于Windows的机制,也是采用这个方法可以防止病毒自我运行,因为运行的条件是必须要有运行的权限,而这个权限在Linux是用户所赋予的。
关于第一位最高位的解释:
第一位代表是文件的类型,类型可以是下面几个中的一个:
- d代表的是目录(directroy)
- -代表的是文件(regular file)
- s代表的是套字文件(socket)
- p代表的管道文件(pipe)或命名管道文件(named pipe)
- l代表的是符号链接文件(symbolic link)
- b代表的是该文件是面向块的设备文件(block-oriented device file)
- c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
还有一个也是涉及到权限的,就是suid,sgid跟sticky。suid/sgid是为了适应“没有取得特权用户要完成一项必须要有特权才可以执行的任务”才产生的。
suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。
sgid(set Group ID,set GID)意思也是一样,只要把上面的进程拥有者改成进程组就好了。
如果一个文件被设置了suid或sgid位,会分别表现在所有者或同组用户的权限的可执行位上。
如果还设置了x位,则相应的位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如下例:
1、-rwsr-xr-x 表示suid和所有者权限中可执行位被设置
2、-rwSr--r-- 表示suid被设置,但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示sgid和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示sgid被设置,但同组用户权限中可执行位没有被社置。
再介绍第二种:
在UNIX的实现中,文件权限还可以用十二个二进制位表示,具体方法是在这十二位的每一位上都置值。如果该位置上的值是1,表示有相应的权限,而0表示没有此权限。
这十二位分别对应关系如下:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。
-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
其实两种方法都是互通的。
给文件加suid和sgid的命令如下(类似于上面chmod赋予一般权限的命令):
chmod u+s filename 设置suid位
chmod u-s filename 去掉suid设置
chmod g+s filename 设置sgid位
chmod g-s filename 去掉sgid设置
但是在许多环境中,suid 和 suid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。最好尽可能地少用“suid”程序。passwd 命令是为数不多的必须使用“suid”的命令之一。
现在介绍sticky:
一般来说,只要对一个目录有写访问权,任何人都可以重命名或删除该目录中的文件。对于个别用户使用的目录,这种行为是很合理的。但是,对于很多用户使用的目录来说,尤其是 /tmp 和 /var/tmp,这种行为可能会产生麻烦。因为任何人都可以写这些目录,任何人都可以删除或重命名任何其他人的文件,即使是不属于他们的!显然,当任何其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人的文件时,很难把 /tmp 用于任何有意义的文件。所幸,Linux 有叫做“粘滞位”(sticky bit)的东西。当给 /tmp 设置了粘滞位(用 chmod +t),唯一能够删除或重命名 /tmp 中文件的是该目录的所有者(通常是 root 用户)、文件的所有者或 root 用户。事实上,所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位,而您还可以发现粘滞位在其它情况下也很管用。
总结:
正如上面所说的,其实两种方法可以互通。对于第二种,我们也可以三位三位的转化为4个八进制数。最高的一位八进制数就是suid,sgdi,sticky的值一个反应。777就是他们都设为了1.