我们在学习Linux的时候,我们知道在Linux下一切皆文件,而不同的文件对于不同的用户有不同的操作权限,有些重要的东西不能让别人随意修改,所以我们就需要给文件加上权限,保证文件的私密性,那么话不多说,开启我们今天的主题!
在Linux下有两种用户:一种是 超级用户(root),一种是 普通用户。
区别 | 超级用户 | 普通用户 |
---|---|---|
操作范围 | 可以在Linux系统下做任何事情 | 在Linux系统下做有限的事情 |
命令行提示符 | ‘#’ | ‘$’ |
如果我们当前账号是root账号,想要切换为普通用户,我们只需要这个命令:
su 普通用户名//登录普通用户
这样就能切换用户了,但是如果我们当前用户是普通用户,我们想要切换到root账户只需要:
su root//使用后要加上密码
我们从普通用户切换为root账号时,需要输入root的密码,且在输入密码的时候,我们是看不到密码的。当密码输入完成时,回车就可以切换为root账号了。
我们还有一种方法可以从普通用户切换为root账号:
su -//切换root账号
在普通账号中,我们只能查看操作自己的工作目录,我们不能看到别人账号下的工作目录,同样,更不能查看root账号的工作目录。
如果我们并不想要在root账号下执行命令,但是我们还想要root账号的权限,这个时候我们就可以使用:
sudo 命令//进行root级别权限的指令
但是sudo命令在普通账号下并不是默认就有的,需要在root账号下添加可使用sudo命令的成员名单。这个部分目前我们有所了解即可,以后我们会详谈。
总结:
1、Linux下账号分为root用户和普通用户,root用户的权限最大,可以做任何事情,而普通用户只能做有限的事情。
2、root切换普通用户使用su + 用户名,普通用户切换为root账号时,需要su root或者su - 然后输入root密码回车即可切换。
3、普通用户想执行更高权限的命令需要在使用命令前加上sudo
为了区分这个文件属于谁,在我们圈出来的地方,第一个表示拥有者,第二个就表示所属组。但是这里并没有显示other组,这是因为我们不清楚other是谁,如果将来有用户来访问我的文件,那么在这个文件当中other就会显示出来。
一般我们在详细查看系统文件的时候会很容易发现这些:
其实前面的这些字母与-就是一个 文件的属性,表示 文件的类型和访问权限,属性的 第一位表示文件类型。
文件属性的第2-10位,表示 文件的权限,权限的前三位 表示文件所有者的权限,权限的 中间三位 表示文件所属组的权限,而权限的最后三位表示其他用户的权限。
文件类型分类:
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
文件的基本权限:
1、读权限(r),r也就是READ的首字母,具有读取文件内容的权限;对于目录来说,具有浏览该目录信息的权限。
2、写权限(w),w也就是WRITE的首字母,具有修改文件内容的权限;对于目录来说具有删除移动目录内文件的权限。
3、执行权限(x),Execute的第二个字母,具有执行文件的权限;对目录来说具有进入目录的权限。
4、“ - ”表示不具有该权限。
我们知道了权限三三为一组,一般权限分为如下几种情况:
文件的权限也可以用二进制来表示,比如一个文件的权限为:rw-,那么该权限对应的二进制就是110。权限为rwx那么二进制就是111,无权限二进制表示为000。而3位比特位也可以使用8进制来表示一位数,那么我们也可以根据不同权限列出不同进制的表示方式:
权限符号 | 八进制 | 二进制 |
---|---|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
rw | 6 | 110 |
rx | 5 | 101 |
wx | 3 | 011 |
rwx | 7 | 111 |
--- | 0 | 000 |
有了以上这些我们就能很轻易的分析出我们对一个文件拥有哪些权限。从而可以做具体的事情了。
有一些文件我们不想让别人看到,或者不想让别人对本文件进行操作,也就是说,我们想要对文件的权限进行更改,达到我们想要的效果。其实在Linux当中有这样一条命令:
chmod命令:
功能: 设置文件的访问权限。
格式: chmod[选项] 权限 文件名
常用选项:
用户标识符与权限字符:
我们有如下文件:
现在我们想要对file.txt的other组的可读权限给删除,我们只需要:
chmod o-r file.txt//将其他组的可读权限删除
如果我们又想要将other组的可读权限恢复,且还想加上可执行权限,我们只需要:
chmod o+rx file.txt
这时我们突然又想要将file.txt文件所有权限都置为空,我们只需要:
chmod u-rw,g-rw,o-rx file.txt
我们想要恢复权限,仅仅将上面命令的-改为+即可。
如果我们要对一个文件的三个组有相同的权限管理请求,则我们可以使用a选项来进行批量处理文件权限:
chmod a+r file.txt
我们看到所有文件都具有是否可执行这个选项,那么我们的文件拥有了可执行权限就一定能执行吗?我们将file.txt文件属性全部开放,再对该文件写入一些内容:
那么我们执行这个文件:
我们会发现文件并不能执行,所以我们可以得出结论:一个文件具有可执行的权限,但是这个文件并不一定是可执行的,还需要保证这个文件是一个可执行程序。
除此之外,我们还可以使用8进制来对一个文件的权限进行管理,按照上面给出的8进制数进行对文件的权限的管理:
如果我们需要修改一个文件的拥有者,我们就需要用到下面的命令了:
一、chown命令:
功能:修改文件或目录的所属组
格式:chown [参数] 用户组名 文件名
使用方法也很简单,只需要:
sudo chown 用户组名 文件名
注意: 普通用户在使用chown命令时,需要使用sudo命令。原因也很简单,我们想要将自己的文件给别人,别人也是需要确认的,不然怎么知道你给的是不是什么病毒?但是你是root账号或者使用sudo命令可以强制将文件 拥有者更改。
二、chgrp命令:
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:
要更改所属组也需要进行sudo或者在root账号下使用该命令。
我们有对应的更改所属组与拥有者的命令,但是并没有更改other组的命令,这是因为我们在更改拥有者与所属组的同时,other是在不断变化的,说白了,其实更改拥有者与所属组就已经将other更改,所以不需要更改other的命令。
如果我们感觉一个一个更改拥有者与所属组很麻烦,我们也可以使用:
chown 拥有者:所属组 文件名
我们前面说了,文件属性的首尾表示文件的类型,但是文件的类型这么多,可能会记混,有没有什么办法能详细查看该文件到底是什么文件的命令呢?Linux下有一个file命令:
file命令:
功能:查看文件类型的详细信息
格式:file [选项] 文件或目录
常用选项:
使用file命令就可以显示文件的详细类型。
关于Linux的权限问题,我们有这样三个问题:
一、对于一个目录而言,如果要进入一个目录,需要什么权限?
答案:
- x决定我们是否可以进入目录。
- r决定我们是否可以对目录信息进行查看。
- w决定是否可以在目录下新建和删除文件。
二、为什么我们创建的普通文件默认权限不是777而是664,目录文件默认权限不是777而是775?
我们在创建一个普通文件时,我们的默认权限转化为8进制就是664,当我们创建一个目录文件时,我们的默认权限是775,为什么他们的默认权限不是777?
这是因为我们系统根据不同种类的文件进行了分类,有些文件不需要的属性就不会去加,或者由其他应用程序来加,或者由用户需要时自己添加,一般我们的普通文件里是不需要进行可执行的,所以在创建普通文件时就默认没有这个选项,目录同理。
那么按理来说,我们的普通文件的权限应该是666,目录文件权限应该是777,但是我们看到的目录文件权限是775,普通文件权限是664啊。其实这是因为Linux存在一种叫做权限掩码————umask
umask命令:
功能:
查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是:mask & ~umask
格式: umask 权限值(8进制)
注意: 将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
实际上,起始权限去掉umask值,就是我们的默认权限了,这里的去掉并不是单纯的减法,而是 按位与运算(&):
umask 3位8进制数
我们将两个新建文件属性翻译为8进制对比,也就说明了umask的值修改成功。
我们将一个普通文件全部的权限置为0,再将文件拥有者和所属组全部置为root,但是我们在普通用户下却能将root的文件给删除了:
我们发现居然可以删除这个文件,普通用户可以删除root文件,这是很严重的问题,这很不科学。
为了解决这个问题,在Linux中引入了粘滞位:
粘滞位:
给目录中的other设置的一个权限位,具有x的意义,同时也进一步对目录权限就进行特殊限定:
给目录的文件,只有root或者文件的拥有者有权利进行删除,其他人一概不允许。
使用形式:
chmod +t 目录名
如果我们想要将粘滞位删除,我们只需要将+改为-即可:
chmod -t 目录名