linux下的权限详解
感性认识权限
经常使用windows的小伙伴应该几乎没有人接触过权限吧,反正我使用的win 7 以前的版本里,从没有遇到过有关权限的问题,我想这应该就是windows的不安全的原因之一吧。其实windows是有权限的,比如你以游客账户登录的话,就会发现,许多文件夹和文件无法查看,许多的系统设置无法更改,但是,估计只有我这种电脑谜才会去尝试,大多数人一定都没使用过。而在linux下,如果你再像windows下一样忽视权限的话,那你将寸步难行。
linux下的权限
在谈权限之前,先简单介绍一下linux下的用户与用户组的概念:
文件所有者
与windows不同的是,linux系统是一个真正的多用户多任务的系统,因此,常常就会有多个用户在同时使用一个主机来工作,学习,那么对于不同的文件或文件夹,分清他的所有者是谁当然是必需的,因为每个用户都希望有自己的隐私嘛。
用户组概念
很多人会问,既然都有文件所有者了,那还有什么必要再设个用户组呢?可能我们经常在一个人拼搏的时候感受不到,但是如果我们需要团队合作的时候,比如我们大家要共同完成一个文档,但是此文档的所有者只能是一个人,团队其他人想看和修改,就无法看和修改,如果把文件权限改成每个人都可读可写,又有种危险就是怕团队之外的人窃取团队的机密,那么有没有好的解决办法来弥补这一缺陷呢?用户组这一概念就应运而生。团队协作时,需要共同修改和完成的文件,可以让团队成员都加入到一个用户组里,然后将此文件的用户组权限更改为可读可写,那么就解决了上面的问题。
此处要特别说明的是,同一个用户可以加入多个用户组。保存用户信息的文件在 /etc/passwd 里面,而保存用户组信息的在 /etc/group 里面,如过一个用户想拥有多个用户组,就可以该 /etc/passwd 里面的第五个字段了,但是不建议初学者随便改变这一文件里面的内容,因为里面保存了系统所有的用户信息,改错的话,就会造成系统异常。
其他人概念
了解了用户和用户组,那么其他人的概念就特别容易界定了,不属于所有者,又在用户组之外的人就是其他人。
一般权限
当使用ls -l后,我们看见从左到右,依次是文件的类型,然后三个是文件所有者的权限,再是文件用户组权限,最后是其他人权限,后面的与本文内容无关,这里就不再赘述了。
每个权限都有三个位,依次是读权限,写权限,执行权限,用rwx来表示,如果不具有这一权限,则用-来表示,举个例子:一个文件的权限的九位为:rwxrw-r--,那么就表示文件所有者对此文件有读写执行权限,而与文件所有者在同一用户组里的人有读写权限,其他人只有读权限。
上面介绍了怎样认识文件的权限,那么我们应该怎样改变文件的权限呢?那就是使用chmod命令了,chmod命令有以下几种使用方法:
使用数字
我们可以用数字来表示权限:
r: 4
w: 2
x: 1
那么,要改变一个文件权限为rwxrw-r--,那么,就可以使用命令: chmod 764 文件名 来改变权限
使用符号类型
我么知道,一个文件有三种身份类型,共9位,分别是user,group,other 3个,那么我们就用u,g,o来简单代表这三个身份类型,此外,用a(all的意思)来代表全部身份。那么改变权限就可以使用下表:
|---------------|----------|---------------|--------|---------------------|
| | u | | | |
| | g | + (加入) | r | |
| chmod | | - (除去) | w | 文件名 |
| | o | = (设置) | x | |
| | a | | | |
|---------------|----------|---------------|--------|---------------------|
如果我们要设置一个文件权限为rwxrw-r--,就可以使用: chmod u=rwx,g=rw,o=r 文件名 来实现。
特殊权限
linux中除了常见的读(r)、写(w)、执行(x)权限以外,还有3个特殊的权限,分别是suid、sgid和sticky bit
suid、sgid
先看个实例,查看你的/usr/bin/passwd 与/etc/passwd文件的权限:
[root@MyLinux ~]# ls -l /usr/bin/passwd /etc/passwd
-rw-r--r-- 1 root root 1549 08-19 13:54 /etc/passwd
-rwsr-xr-x 1 root root 22984 2007-01-07 /usr/bin/passwd
众所周知,/etc/passwd文件存放的各个用户的账号与密码信息,/usr/bin/passwd是执行修改和查看此文件的程序,但从权限上看,/etc/passwd仅有root权限的写(w)权,可实际上每个用户都可以通过/usr/bin/passwd命令去修改这个文件,于是这里就涉及了linux里的特殊权限setuid,正如-rwsr-xr-x中的s
suid就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,sgid同理指”组“
作为普通用户是没有权限修改/etc/passwd文件的,但给/usr/bin/passwd以suid权限后,普通用户就可以通过执行passwd命令,临时的拥有root权限,去修改/etc/passwd文件了
sticky bit (粘贴位)
再看个实例,查看你的/tmp目录的权限
[root@MyLinux ~]# ls -dl /tmp
drwxrwxrwt 6 root root 4096 08-22 11:37 /tmp
tmp目录是所有用户共有的临时文件夹,所有用户都拥有读写权限,这就必然出现一个问题,A用户在/tmp里创建了文件a.file,此时B用户看了不爽,在/tmp里把它给删了(因为拥有读写权限),那肯定是不行的。实际上是不会发生这种情况,因为有特殊权限sticky bit(粘贴位)权限,正如drwxrwxrwt中的最后一个t
sticky bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。
也就是说,在/tmp目录中,只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
如何设置以上特殊权限
suid:chmod u+s xxx
sgid: chmod g+s xxx
sticky bit : chmod o+t xxx
或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:
suid guid stick bit
1 1 1
所以:suid的二进制串为:100,换算十进制为:4
guid的二进制串为:010,换算:2
sticky bit 二进制串:001,换算:1
于是也可以这样设:
suid:chmod 4755 xxx
sgid:chmod 2755 xxx
sticky bit:chmod 1755 xxx
最后,在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限