在Linux中有超级用户(root)和普通用户,超级用户就是超级管理员,有着最高权限,而普通用户是受权限约束的。每个普通用户都在一个home文件里,普通用户想要在home目录创建或删除文件是不被允许的,因为没有权限(home属于root账户创建的目录),只有root才有权限创建和删除系统文件。
当然,普通用户有时也需要root权限来做一些事,所以有两个指令可以让我们拥有root权限。
用法:su [用户名](不写就是root)
su - [用户名](不写就是root)
功能:切换账号(需要输入对应用户的登录密码)
演示:
可以看到su和su -都可以让我们登录,并且登录后都有root权限,很明显我们可以发现su和su -登录后的所在目录有所不同。因为su是单纯切换账户,而su -是让账号重新登陆,所以所在目录也变了。登录root账号后按ctrl+d即可退回普通账号。
但是我们可以很明显的看出,使用su和su -获得root权限需要root密码,那这样所有普通用户就都得知道root密码了,大伙都可以直接用root账号来工作了,不必多此一举。所以普通用户想要root权限就得用下面的指令。
用法:sudo [其他指令]
功能:以root权限执行后面的指令
说明:sudo之后要输入自己用户的密码
很明显,这咋一看没什么问题,再看一眼就会发现有BUG!sudo之后输入自己的密码就可以用root权限执行指令了,那么这和直接告诉你root密码并无区别,root权限极有可能被滥用做坏事。当然,实际上这是需要被信任的用户才能使用sudo,也就是白名单。
这里我们用root权限执行一次ls(只是演示sudu指令):
可以发现并没有成功,我们看到最后一行“normal is not in ths sudoers file”,意思就是我们这个用户并没有被添加到“sudoers”这个文件里,也就是没有被信任,只有被信任的用户才能使用sudo指令,那么如何添加我们后面再说。
下面我们来详细介绍一下文件的属性和权限。
可以看到从左到右有很多信息,下面我用一张图来解释这些都是什么意思。
从左开始第一个字符代表的是文件类型,关于文件类型:
-:普通文件,源代码,可执行程序,库等
d:目录文件
c:字符设备文件
b:块设备文件
l:链接文件(链接文件就是windows的快捷方式,指向一个路径的文件)
p:管道文件
Windows上对于文件类型的区别是看文件的后缀,所以Linux系统本身对于文件类型的区分是根据文件属性第一个字符来看的,所以对于文件名的后缀Linux系统并不关心,但是不代表Linux上安装的软件不关心,比如gcc编译器,文件后缀必须是.c才能编译。
然后剩下9个字符每三个为一组,分别代表“拥有者”,“所属组”,“other”的权限,rwx分别代表读,写,可执行权限。比如rw-就说明有读和写权限但没有执行权限。可执行文件就具有x权限,也就是可执行权限,比如编译之后的c语言代码,会生成一个a.out文件。
关于“拥有者”,“所属组”,“other”是什么:
- 拥有者就是创建这个文件的用户。
- 所属组就是多个用户的集合,组的名字是组长,当然组也是可以只有一个人,我们创建一个文件,这个文件的所属组就只有我们一个人。
- other就是除了拥有者和所属组之外的用户。
所以,对于上图中的file文件,拥有者的权限就是“rw-”,所属组的权限也是“rw-”,而other的权限是“r--”。连接数暂时不讲。下面我将演示是否有rw权限的实际表现,因为要修改权限所以要用刀chmod指令。
用法:chmod [选项] [权限] [目标文件]
功能:对文件或目录的权限进行修改(只有文件/目录拥有者和root才能修改)
选项:
-u 拥有者
-g 所属组
-o other
-a 所有(包括上述三个)
R 递归修改目录文件的权限
实例:(这是file文件初始权限)
- 修改file文件拥有者的权限(用=就是赋值,+就是增加,-就是取消,=-就是让rwx都取消)
- 对所有人都添加w权限
- 对拥有者权限为rwx,所属组权限为rw,other权限为r
下面我们具体演示一下r和w权限:
这里有一个别的用户创建的文件,对于other只有r权限就是只能读,不能写。
可以看到只能读不能写,那么可以推断出,如果other权限是-w-只有w权限,我们就只能写而不能读了。
细节:
还是上述那个文件,不过这一次我们把账户换成了文件拥有者,并且我们把拥有者的权限全部去掉。
发现我访问不了了,但是所属组还有rw权限,所属组那里显示的是我,虽然拥有者没了权限,但我作为所属组还有权限,理论上我还是可以访问的,现实是我访问不了,也不能写入。
原因是对于用户的匹配只有一次,当这个用户是拥有着就会直接去看拥有者的权限了,不会再去匹配所属组里是否有这个用户了。
对于rwx和---前者是拥有rwx权限,后者是啥也没有。那么我们可以视前者为二进制111,后者是二进制000,r-x就是101,转换成八进制就是5,所以我们也可以用八进制来更改权限。
这里我们用八进制的方式更改权限,7对应二进制就是111,6->110,5->101。对应的权限就是rwx,rw-,r-x,和图中的完全一样。
用chown和chgrp就可以更改文件拥有者和所属组,但是需要root权限。(关于sudo如何添加信任用户后面会讲)
我们用chown和chgrp指令修改了文件的拥有者和所属组。也可以像下面这样一口气更改。
用法:file [选项] [文件或目录]
功能:辨识文件类型(就是告诉你这个文件是什么类型的,当然也可以看文件属性第一个字符判断,上面有讲过)
选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。-z 尝试去解读压缩文件的内容。
对于文件的rwx权限前面讲过,也比较好理解,那么对于目录来说rwx的具体表现就和文件不同了。
- r权限可以让用户查看当前目录下的所有文件属性(就是使用ls指令),而能不能查看文件内容和修改文件就取决于文件本身了。
- w权限可以让用户在目录里添加或删除文件,能否删除文件和文件本身没有关系,和文件所处的目录是否具有w权限有关。
- x权限可以让用户进入目录,没有x权限用户就无法进入目录
假设在以下场景:a,b两人在一个共享目录里都为other,该目录对other具有rwx权限,那么a创建了一个文件并写了一些代码,因为具有w权限,b可以直接删掉目录里的文件,无论b是有意还是无意,自己的文件随时都能被别人删除都不好。所以针对此就有粘滞位这个权限。
当一个目录被设置了“粘滞位”以后该目录下的文件只能由root和该目录所有者和该文件的所有者删除。
演示:输入chmod +t [目录名] (需要root权限)即可把该目录设置为粘滞位。
可以看到目录颜色变成绿色,权限最后一位变成t了。
现在我就不能删除其他用户在该目录下创建的文件了。 (其他用户在该目录下创建的目录,假如该目录没有粘滞位,那么目录里别的用户创建的文件我还是可以删除的)
文件和目录被创建时的权限就是默认权限。
可以看到目录的默认权限转换成8进制就是775,文件是664。但事实上,目录的默认权限是777,文件是666,那为什么会出现775和664呢?
权限掩码是一个3位的八进制数字,每一位代表着拥有者,所属组,other。不同机器上的权限掩码不一样,我这台是0002(第一个0是说明这是8进制数字),转换成二进制就是000 000 010,这三个分别对应着拥有者,所属组,other,而每一个的三个位对应着rwx,如果哪一位是1,那么默认权限中这一位就要去掉。
可以看到前两个都是000,所以默认权限不变,而第三位也就是other的w是1,就说明other的默认权限不能有w权限,所以上图中的other就没有w权限。
这是一个位运算,公式就是{最终权限=起始权限&~(umask)}(umask就是权限掩码)。
我们也可以更改权限掩码。
更改成777就是 111 111 111,取消所有权限。(1就是取消权限,0就是不取消)