什么叫做权限,简明得说就是一件事是否允许被你做
权限与两点有关:
- 权限与身份有关,权限认证的是你的身份而不是你这个ren
- 权限与事物的属性有关
Linux下的用户
Linux下有2种用户: 1.root超级用户 2.普通用户
root用户可以在Linux下做任何事,不受权限限制
普通用户受权限的限制
切换用户的命令:su
su
命令,可以使普通用户切换到root用户身份上,但也只是身份上的转变,所在的当前目录不会改变。输入exit
或ctrl + D
可以退回普通身份su -
以重新登录的方式切换用户,这样身份和所处目录就都改变了su user
切换到普通用户,user
为普通用户的名- 从root转换到普通用户不需要输入密码,从普通用户切换到root需要密码
对指令的提权:
sudo xxx指令
,首次执行要输入password
这样执行一些高权限的指令时,就可以以root的身份进行操作
但是目前我们用add user 新建的用户时没有办法使用sudo的,因为系统不信任这些用户
除非将普通用户添加到白名单中
Linux下用户的身份
开头说了,权限与身份有关,与用户无关
怎么理解呢?可以理解为在某一个公司小组内,只有组长有设定任务的权限,无论时谁担任组长都可以,不论是小王还是小张,这要他们是组长的身份,就有相关的权限
在Linux中,有三种身份:
- 拥有者
u
- 所属组
g
- 其他人
o
要注意几点:
- 权限身份与linux中具体的用户并不冲突
- 无论是root还是普通用户,都可以是拥有者、所属组、其他人
- 拥有者、所属组、其他人都要有具体的用户承担
那么思考一个点,既然有了拥有者、其他人这两种身份,为什么还有有所属组这个权限身份呢?
假设,在一个公司内,有2个竞争关系的小组,员工A和员工B分别在这2个小组内
假设现在只有拥有者和其他人2种身份
对于A的项目,A为拥有者,B为其他人,这可以很好的防止B去 “偷窥” A的文件
但是如果在同一组内的领导C,假如C想看A的项目,但此时C的身份也为其他人,此时C就不能成功地浏览A的项目
所以这才有了第三种身份——所属组
这样A为拥有者,B为其他人,C为所属组。
既保证了组内协同,也保证了other访问
在执行 ll
指令后,我们是可以看见在打印的信息中看见每个文件的拥有者、所属组和其他人的
第一个用户名为拥有者,第二个用户名为所属组
其他不是拥有者和所属组的用户都是其他人
当一个用户访问一个文件时,其身份会与文件的拥有者和所属组队进行对比,如果发现不是拥有者和所属组,就是other
文件类型和访问权限
文件的相关属性和权限,可以使用指令ll
查看
使用ll
后,可以看到,显示出很多列的内容
这里我们先介绍第一列,第一列一个共有10个字符,第一例的第一个字符表示文件的类型
d :普通文件,如:源代码,文本文件,库文件等都是普通文件
- :目录文件
b:块设备文件,如磁盘文件
c:字符设备文件 如键盘文件,显示器文件等
p:管道文件
.....
针对文件的类型:
windows下,文件以后缀的方式来分类,如:.txt .exe .png等
而在Linux下,后缀没有直接的意思(不代表没用)
例如:在Linux下,将a.out改名为a.exe 或a,./a,exe
和./a
都可以执行这些文件
但是把test.c文件改为test.txt,gccs是不能够编译的。
原因是:gcc是一个编译器,运行在Linux上的软件,而linux系统是对文件的后缀没有要求,但不代表在Linux上的其他软件不需要后缀。
下面研究剩下的9个字符
r:可读
w:可写
x:可执行
-:没有对应位置的权限
这9个字符,从左到右,三三为一组
- 位置是什么含义是固定的,第一个为读权限,第二个为写权限,第三个为执行权限
- 每一个位置只有是或否,具有指定的权限
访问文件的流程: 用户与文件的拥有者、所属组、其他人进行对比,确认用户的角色,然后识别该角色的权限,然后看权限,如果有权限,就进行操作,如果没有权限,就拦截
值得注意的是:
root不受权限的控制,即使root为某一用户的other角色,other没有此文件的写权限,但root仍能写入内容,因为它是root
进行权限认证的时候,只能选择一个角色进行认证
假如一个文件的拥有者和所属组都是用户A,那么用户A访问这个文件的时候,只认证它的拥有者的角色
权限认证的优先级:u > g > o
对文件权限的修改指令
chmod
功能:修改文件的权限
语法:chmod [选项] [权限] [文件名]
只有文件的拥有者或者root用户可以修改权限
+: 向权限范围增加权限代号所表示的权限
-: 向权限范围取消权限代号所表示的权限
=: 向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
常用选项:R
可以递归修改目录下面所有文件的权限
下面举几个例子:
chmod u+r test.txt
给拥有者添加读权限
chmod o-rwx test.txt
给其他人减去读,写,执行权限
chmod a+rwx
给所有人添加读,写,执行权限
chmod u+r, g-w,o+x
给拥有者添加读权限 ,所属组去掉写权限 ,其他人添加执行权限
权限三三一组,每个权限都是确定的,有或没有
所以可以用1表示有,0表示没有。用比特位的方式与是否有权限一一对应
例如 111 101 000 也就可以用八进制表示7,5,0
所以三三一组,可以用三位八进制数字表示权限
也可以用三个八进制数字修改权限:
chmod 777 test.txt
chmod 640 test.txt
chown
语法: chown [选项] [用户名] [文件名]
功能:修改文件的拥有者
常用选项:R
可以递归修改目录下面所有文件的拥有者
只有root可以修改文件的拥有者
或者普通用户执行的时候,前面加上sudo
举两个例子:
chown root test.txt
chown -R root dir1/
一个指令改变拥有者和所属组;
chown root:root test.txt
chgrp
语法: chgrp [选项] [用户名] [文件名]
功能:修改文件的所属组
常用选项:R
可以递归修改目录下面所有文件的拥有者
怎么修改other身份呢?没有直接的命令,不是拥有者和所属组的人,就是other了
权限掩码
思考一个问题,为什么我们新建的普通文件和目录文件的默认权限是固定的,并且是我们看到的样子?
为什么普通文件的权限是664?
为什么目录文件的权限是775?
这里介绍一下预备知识:
linux默认给普通文件的初始权限是666
给目录文件的初始权限是777
原因是有一个东西叫做 权限掩码umask
凡是在umask
中出现的权限,不会在最终文件权限中出现
我们查看一下默认的umask
:输入umask
指令就可以查看
这里的权限掩码为0002,下面我们就可以知道为什么新建普通文件和目录权限为664和775了
最终权限 = 初始权限&(~umask)
我们也可以手动修改umask:指令umask xxxx
如果想让创建的文件和目录默认不可读不可执行:修改umask为 101 101 101
即555
目录的权限
r:读权限,如果一个目录没有读权限,就无法用ls指令等指令查看目录中的文件
w:写权限,如果没有写权限,无法在目录中新建文件,删除文件,修改文件
x:执行权限,如果没有执行权限,就无法用cd命令,移动到目录中
创建目录的时候,权限基本是满的,因为如果没有权限,那么建目录没有意义
它默认权限为775,说明只限制了other用户无法在目录中新建删除修改文件,other也可以cd进去,ls其下的文件
普通用户的家目录权限为700,并且家目录的拥有者和所属组也都是自己,所以其他普通用户无法看见其他用户下的文件
共享文件夹以及粘滞位
有点时候,多个用户想进行文件数据的共享
我们就需要建议一个共享文件夹,这个文件夹不能在任何一个用户的家目录下,因为其他用户无法访问其他用户的家目录
跟目录的权限为555,拥有者和所属组都为root,所以普通用户也无法在根目录下建立这个文件夹
但是根目录下有一个文件夹叫做tmp
,权限为777,所以我们可以把在tmp下建立共享文件夹或者直接把tmp当作共享文件夹
这时,我们解决了共享文件夹位置的问题
普通用户可以随意创建文件,修改文件
一个文件,我可以不让别人读,不让别人写,但是从本文件的权限上,我无法让这个文件不被删除
因为一个文件能否被删除,兵部右这个文件本身决定,而是由所处目录所决定
假如我为了不让别人删除我的文件,我去除文件的w权限
此时,别人的确无法删除我的文件了,但是痛仰也创建文件了,就体现不出共享文件的性质了
所以Linux中引入了粘滞位,粘滞位的用t
表示
chmod o+t shared/
给共享文件夹shared/
添加t
权限
设置了t
权限后,other的x
权限就变成了t
t权限就限制了:一个人可以删除自己建立的文件,但是不能删除别人建立的文件
粘滞位:
- 给目录设置,一般是共享目录,大家可以在目录中进行各自文件的增上查改
- 只允许文件的拥有者或者root去删除文件,其他人不允许
t
是一种特殊的权限