权限
- Linux权限的概念
- 用户之间的切换
- Linux权限管理
- 文件权限
- 操作文件的人
- Linux文件默认权限的设置
- 权限掩码
- 所属组/其他删除拥有者创建的文件
- 文件拥有者、所属组的修改
- 修改文件拥有者
- 修改文件所属组
- 一次性修改拥有者和所属组
- 目录的执行权限
Linux权限的概念
首先,我们在登录的时候可以超级用户(root)身份登录,也可以普通用户身份登录,超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
root就相当于是游戏里的上帝,想干啥就干啥,干什么事情不需要经过他人同意。
用户之间的切换
想要从一个用户下切换为另一个用户就可以:su 用户名
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码。
如果密码输错就无法切换,输入密码的时候是不会显示的,和设置普通用户的密码一样。
从普通用户切到root下:
从root且到普通用户,不需要输入密码
如果你是从一个用户已经转入到另一个用户了,但是你想要再转回去的话,就不建议再用su了,因为这样会导致产生多个进程,通俗点来说就是开了好多个用户。
想要直接退回去的话可以直接输入exit 或者用快捷键 ctrl + d (这个不会显示成ctrl d)。
这里可以看到有好多个进程,而且都是重复的,所以说想要回到原来的用户的话就直接 ctrl + d 就可以了。
理解权限:一件事是否允许被特定的人做。
权限 = 人 + 事物属性
Linux权限管理
文件权限
记一个东西:linux下一切皆文件。像普通文件,目录文件,块设备文件,链接文件,字符设备文件,管道文件等等都是文件。
而linux系统中怎么区分这些属性的呢?
首先linux系统中,不以文件后缀作为区分文件类型的方式。当我们用 ls -l(或ll) 展示文件信息时会在文件最前面看到一堆的字母和-。
这些字母和-有特定的意思。
那后面的rw-什么的代表什么?
先看下面的解释:
文件本身具有天然的权限属性:读® + 写(w) + 执行(x)。这三个属性限定该文件是否能够读取,是否能够写入,是否能够执行。
简单画个表格:
这里就讲一下目录文件的x:大家可以想象你自己再windows操作系统下,双击一个文件夹,会发生什么事情,就是进入了该文件夹,如果你双击了一款游戏,这款游戏就执行起来了,那么把双击游戏的执行类推到双击文件夹上,那么就可以看出,双击文件夹就是执行该文件夹,也就是进入了该文件夹,文件夹也就是目录。那么再类推到linux系统上,对于目录来说,x代表执行,那么是否有这个权力就代表你是否能够进入这个目录。
这样的话再看这张图就明白了:
但是为啥有三个?
操作文件的人
对于操作文件的人可以分为三类:拥有者(user),所属组(group),其他人(other)。
拥有者:对于一个文件来说,这个文件是被谁拥有的,这个拥有的人就是拥有者。
所属组:举个栗子,为了方便管理,如果我有一个小组,小组内有 20 个用户,而这 20 位用户对同一个文件的权限是一致的,那我是一位用户一位用户地分配权限方便,还是把 20 位用户加入一个组中,然后给这个组分配权限方便呢?不言而喻,一定是给一个用户组分配权限更加方便。
其他人就是除了拥有者和所属组之外的人了。
而对文件进行读、写、执行操作的是人,人具有是否被允许干某件事这个属性。这样组合起来就是权限。
字母的意思就是有,而 - 的意思就是没有
再往后面看,两个yjy分别代表的是该文件的拥有者和所属组。除了拥有者和所属组就是其他用户,不需要再搞一个标志了。
再往后就是文件大小,创建时间和文件名了。
当然上面的hello.c文件不可能执行,所以默认就都没有执行的权限。
但是可以改权限:
上面的操作就是给u(user)添加上执行的权限。虽然文件变成绿色了,但是没什么用,因为hello.c无法执行。
同样的我们也可以给g和o赋权。
也可以剥去权力:
还可以统一赋权和去权。
每个用户对文件权限位置是确定的,而且是两态的(要么有权,要么无权)。
我们可以用1来表示有权,用0来表示无权。
举个栗子:rw- 就是 110。
这样的话我们就可以用一种新的修改权限的方式:三位8进制数字。
八进制数 777 对应到二进制下就是 111 111 111,那么就代表所有的权限都有了。
八进制数 000 对应二进制就是 000 000 000,就是都没有。
八进制数 666 转换成二进制数就是 110 110 110,就是读写有,执行没有。
就不再多举例子了,都一个意思,数不一样,对应权限不一样。
Linux文件默认权限的设置
为什么创建文件会有默认的权限?
权限掩码
先不说概念,先看看长啥样:
umask这个指令可以看到权限掩码是多少。
第一个零意思是说这个数是八进制数,去掉它,就剩002了,八进制的002对应二进制就是000 000 010,这就是权限掩码,有什么用?
还是八进制,这里给出一个非官方的概念,起始权限。
普通文件的起始权限是666,对应二进制就是110 110 110;
目录文件的起始权限是777,对应二进制就是111 111 111。
凡是权限掩码中出现1的位置,对应到起始权限中的位置处如果为1,就变为0;如果为0,就不变。
那么默认的权限掩码都是0002,也就是000 000 010,这里去掉普通文件的那个1,就变成了 110 110 100,就是664,对应到字母就是 rw- rw- r–;去掉目录文件里的那个1,就变成了111 111 101,就是775,对应到字母就是 rwx rwx r-x。
那用二进制怎么算呢?
先对权限掩码(mask)取反,得到(~mask),然后再将这个值和起始权限与一下。那么 文件的默认权限 = 起始权限 & (~mask)
看图:
新创建的普通文件的权限和目录文件的权限和上面推出来的是一模一样的。
权限掩码是可以修改的,但是极其不建议,因为这些默认的权限是他人通过经验总结出来的,若修改,未必有人家设计的好,但是硬要修改的话也可以,umask 后面跟上八进制数就行,但是这样修改之在本次对话框能有效,也就是本次登录推出之后就变回原来的值了,如果想永久修改就需要搞配置文件,但还是建议不要永久修改,万一再想改回默认状态但是你忘了默认的值,那就恶心了。
所属组/其他删除拥有者创建的文件
这样以其他人的身份删除不属于这个人的文件,这样的操作,对于拥有者来说非常的危险,因为当这个文件比较重要时,如果被其他人删除了,那都不知道这个人是谁,就出大问题了。怎样解决呢?
若目录本身对other有w权限,other可以删掉任何目录下的文件;
若目录本身对other没有w权限,则other不可以删掉任何文件。
但是如果我们想要other可以再特定目录下创建文件并写入,但是不想让任何人删除掉自己的文件,怎么做?
这时候要引出一个新概念,叫粘滞位(只对目录文件有效),一般是限制other权限的。
设置方法:chmod o+t dir
设置好之后,other就无法删除文件了,但是可以创建文件。
将目录的other赋予w属性。
以other在该目录下创建文件,可以。
对于设置了粘滞位的目录,在该目录下,只能文件拥有者或root可以删文件,其他人不能删(所属组也不能)。
有时,用户多的情况下,或系统会有很多临时数据,所有临时文件放在系统的/tmp下,这时就需要把所有权限放开,但是只想让文件拥有者自己删除文件,就需要设置粘滞位。
若想去除粘滞位: chmod o-t filename
文件拥有者、所属组的修改
下面的这两个操作需要以root的身份去做,不然都是不允许的。
你把一个东西交给别人需要经过别人的允许。但是如果你是上帝视角,把东西给别人,别人什么话也不能说,不服也得憋着。
所以要么切换到root,要么sudo 行为。
修改文件拥有者
普通用户不允许:
法一:sudo
法二:切换到root
修改文件所属组
但是如果文件拥有者是你,那么你可以直接将所属组改为你自己。
一次性修改拥有者和所属组
目录的执行权限
最后要再强调下这个,目录的执行权限决定的是:是否能够进入该目录,这个我开头也细讲了,这里就不多说为什么了。
当o对目录没有了x,会发生什么?
无x有r
可以看到文件名,但是看不到文件的详细信息。
无x有w
想往进写文件不行
想删掉里面的文件也不行。
如果想编写目录下的文件时,会保存不了,保存了就无法退出,不保存才能退出。
到此结束。。