权限:一件事情是否能被特定的人做(执行,完成,拥有)
linux下有两种用户:超级用户、普通用户
超级用户:可以在linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情
超级用户的命令提示符是“#”,普通用户的命令提示符是"$"
切换root用户:su -
切换普通用户:su - 用户名
sudo whoami
sudo可以进行权限的短期提升,以root身份执行命令
在现实生活中,比如我们需要看一场电影,买了电影票的才有权限看电影,没买的你没有权限,在腾讯视频中,你想看超前点播,你需要开通vip才有资格去买超前点播,这就是权限。
我们现在所讲的权限聚焦在文件:
Linux当中的人的角色:超级用户、普通用户,文件权限 = 人 + 事物属性;Linux当中的人又在文件中分为:拥有者(user),所属组(group),其他人(other),文件的事物属性:读(w),写®,执行(x)
ll命令是以列表展示文件的属性:
列表的第三列为文件的拥有者,第四列为文件所属组,第五列为文件大小,第六列为修改时间,第七列是文件名
该列表的第一列的10个字符的第一列字符位文件类型,d开头是目录,-开头是普通文件,其余是文件的权限
文件属性开头字符的含义:
符号 | 文件类型 |
---|---|
- | 普通文件(源代码,图片,动静态库,可执行程序,视频音频) |
d | 目录 |
s | 套接字 |
p | 管道 |
l | 链接文字 |
b | 块设备(磁盘) |
c | 字符设备(键盘,显示器) |
在文件的属性中有所属组,那么文件的属性为什么会有所属组呢?group存在的意义是什么?
我们举个例子,比如有一个公司需要开发一款软件,该公司有两个组(比如说A组和B组)想要做这个项目,但是我们公司的资源又有限,假设只有一台服务器,那么两个组就需要共用一台服务器进行工作,那么该服务器中就有A组和B组两个工作区域,比如你叫张三在A组,李四在B组,A组和B组是竞争关系,那么李四能看张三写的代码吗?当然是不行的,此时文件的权限有拥有者和其他人就可以了,因为张三是拥有者,李四是其他人,故李四是看不了张三写的代码的,但是同样的一个问题,张三和组内的人员是协作关系,那么他们之间是可以相互看代码的,但是由于文件的权限只有拥有者和其他人,组内的其他成员也是其他人呀,所有组内的其他人也不能看到张三的代码,所以就出现了所属组,如果所属组相同了就可以进行操作文件了。当文件的权限有拥有者,所属组,其他人时,这时就好办了,李四想看张三写的代码?爪巴!你既不是文件的拥有者,也不是A组的人,那么你就是其他人了,还想看代码?
group存在的意义是保证项目安全的前提,方便组内协作
在文件的权限那一个区域中,一个有9个字符,该9个字符三三一组,第一组对应的是user,第二组对应得是group,第三组对应的是other
写®,读(w),执行(x),-表示是不可进行读或写或执行。注意:这三个的顺序是确定的固定的:rwx
修改权限指令:chmod
修改拥有者权限,比如取消拥有者的读权限:
chmod u-r file.txt
我们首先创建了一个普通文件,写入了字符串,然后将该文件的读权限取消,可以看到拥有者的读权限已经没有了,我们用cat进行读,发现是不能读的
添加拥有者的读权限:
chmod u+r file.txt
我们可以看到cat已经可以读文件了,而且file.txt文件拥有者的读权限已经有了
并且可以同时进行权限的加或者减,中间用逗号相隔就可以,也可以同时加权限,同时减权限,对于所属组和其他人的权限修改和拥有者的类似。
chmod a+r file.txt
所有都加r权限
chmod u=r file.txt
覆盖user之前的权限,改为只有r权限
多次重定向后,我们发现cat显示时,只有个hello world,其实echo使用一个>是每次给文件写入全新的内容
我们使用两个>>进行重定向:
>>进行重定向时是在文件现有的内容上新增内容
注意:超级用户不受权限限制,root用户既不是文件的拥有者也不是所属组,它是other,即使other只有读权限,它也可以随便进行读写执行操作
修改权限还有一种方法:
因为我们的权限顺序是不变的,都是rwx这样的顺序,并且权限是两种状态,要么拥有要么不拥有,那么就可以这样表示:
111 —表示rwx都拥有
110 —表示rw拥有,x不拥有
000 —表示rwx都不拥有
三位二进制数可以表示为八进制
假设一个文件的权限是:rwx rw- —,它们分别用二进制表示为:111 110 000
111 110 000 分别用八进制可以表示为7 6 0
那么就有了这样的一种改权限的方法:
chmod 111 file.txt
相当于 001 001 001 ;也相当于–x--x–x
很明显这种方案比第一中更加简洁
刚才都是给文件的属性做修改,那么想给拥有者和所属组进行修改呢?
如果想把一个文件的拥有者给别人:
chown root 10-4
我们把10-4目录的拥有者给root,发现此操作不被允许,在现实生活中,我们给别人一个东西是不是需要得到别人的允许呢?故我们需要:
sudo chown root 10-4
sudo是权限提升,执行chown命令时,我们以root用户进行执行
我们发现拥有者已经变为了root。
如果想把一个文件的所属组给别人:
chgrp root 10-4
同样的道理这样也是不允许的
sudo chgrp root 10-4
我们发现拥有者和所属组都变为了root
我们也可以将拥有者和所属组改回来:
那么一个目录的读权限是什么意思呢?
我们发现我们将10-4目录的拥有者的权限设置为不可读时,使用ls显示它的文件,是没有权限的,一个目录的读权限,含义是允许查看目录下的文件,而我们查看目录下文件的内容是可以的,注意不要混淆,目录的读权限是允许显示目录下的文件的属性信息,不包含内容,而文件的读权限是,允许查看文件的内容
相应的目录的写权限是:是否允许特定角色在指定目录下创建文件file(和file的内容无关)
我们在改了目录10-4的写权限后就不能在该目录下创建文件了
在目录的权限当中,我们发现还有可执行权限,一个可执行程序有可执行权限能理解,那么一个目录的可执行权限是什么意思呢?
我们知道cd指令是进入目录,而目录的执行权限其实就是能否进入该目录:
我们发现取消执行权限时就进不去该目录了
但是我们发现我们取消了目录的x权限后,我们也不能在目录里面创建文件了,并且不能显示目录文件了,为什么呢?我们明明有写权限和读权限的呀
事实上无论是r还是w,都需要先进入目录
我们一个目录里面的文件可能有不同用户,不同用户之间可以删彼此,这样是有问题的,这时我们可以给目录设置粘滞位
我们以普通用户创建三个文件,以超级用户root创建了三个文件:
此时我们的用户现在是普通用户,但是我们尝试去删超级用户创建的文件:
竟然可以删除成功,实际上我们是不应该能够删除别人创建的文件的,但是这里可以删除,所以解决方法是给这个目录设置粘滞位:
sudo chmod +t 10-4
需要以超级用户去设置,不然没有权限
我们发现10-4目录的other的可执行权限那里变为了t,这时就是设置了粘滞位
我们当前是普通用户,我们发现我们再去删除root创建的文件时已经没有权限了:
我们总结一下:
现象:在特定目录下,普通目录会受普通权限的约束,但是竟然可以删掉别人的文件,甚至是root
给特定目录设置粘滞位,chmod +t dir,自己只能删自己的。只有root是不受限制的
同一个目录下,不同人创建的文件,可能会被其他人删掉,防止删掉,给目录设置粘滞位
有人可能会问:设置粘滞位后删除目录能删除吗?
首先删除目录,一定要先把内部的文件全部删掉,同样的,删内部的文件前提是你必须进入目录
关于使用sudo报错不能使用怎么解决:
首先切换成超级用户,然后输入下面指令:
vim /etc/sudoers
找到这里:
将自己sudo报错的用户写进去,写的时候按i进行插入,写完之后按esc,然后:wq保存并退出
有没有人疑惑我们创建普通文件和目录为什么权限默认会是这样呢:
可以看到我们目录的默认的权限是775,普通文件的默认权限是664,那么为什么会是这样呢?是因为umask这个东西
我们可以看到umask是0002,第一个0我们先不管,后面三个数字是002,这是八进制数字,对应的二进制为:000 000 010
那么这和创建文件的默认权限有什么关系呢?
Linux中有这样一个规则:创建普通文件默认权限从666(八进制)开始,创建目录默认权限从777(八进制)开始,凡是在umask中出现的权限,就要在默认的权限中去掉
那么我们先看普通文件,666对应的二进制:110 110 110,此时umask是000 000 010,umask当中出现的权限是other的写权限拥有,那么默认的权限就需要去掉这个权限,就变成了:110 110 100,所以我们的test.c文件默认为110 110 100,即664
我们再看目录,777对应的二进制:111 111 111,此时umask是000 000 010,umask当中出现的权限是other的写权限拥有,那么默认的权限就需要去掉这个权限,就变成了:111 111 101,所以我们的test.c文件默认为111 111 101,即775
那么umask可以修改吗?是可以修改的
umask 003
那么我们再创建普通文件和目录默认权限会是什么呢?
我们一起来看:
那么我们先看普通文件,666对应的二进制:110 110 110,此时umask是000 000 011,umask当中出现的权限是other的写权限和执行权限拥有,那么默认的权限就需要去掉这两个权限,就变成了:110 110 100,所以我们的test.c文件默认为110 110 100,即664
我们再看目录,777对应的二进制:111 111 111,此时umask是000 000 011,umask当中出现的权限是other的写权限和执行权限拥有,那么默认的权限就需要去掉这两个权限,就变成了:111 111 100,所以我们的test.c文件默认为111 111 100,即774
那么是不是这样呢?看下面:
当用户登录Linux系统的时候,系统会给用户创建一个进程,一般叫做bash(命令行解释器),shell的中文意思就为外壳
最简单定义:命令行解释器,操作系统管理软件和硬件,本质是为了让用户使用起来成本更小,用起来更爽,直接使用操作系统成本比较高,为了解决用户使用计算机的成本,包裹软件外壳:shell,包裹图形界面:GUI,在未来可能会出现语音式以及手势式包裹在操作系统外层的软件层,方便用户和操作系统进行沟通,shell的作用主要是接收用户的输入,交给操作系统执行,得到结果反馈给用户
我们举个例子来说明shell的作用:假如你是张三,你们村有你喜欢一个暗恋多年的女生小花,但是你的言语表达能力不太好,想找个媒人来给你搭个线,那这个媒人就去找小花说:小花啊,有个小伙子张三条件也不错,要是可以的话处一处。但是小花说:阿姨啊,不好意思,您的好意我心领了,张三我看不上。此时媒人就讲该信息反馈给张三。
张三为什么不直接去找如花呢?不擅长!
媒婆存在的价值?
那么这里的张三就是用户、开发者、小白用户、自然人;媒人就是shell外壳;小花就是操作系统,村就是计算机。这就是shell的第一个作用:交互
那么shell的第二个作用是什么呢?
假如张三还不死心,觉得自己各方面条件也都OK,又去找媒人再去和小花说说,然后媒人就又去找小花说说,但是呢,小花想彻底绝了张三的心说:阿姨,我有男朋友李四了,您不要再找我了,不然李四会误会的,这时,媒人得到了小花的信息,以后张三找他,他就不会再找小花了,这时就间接的保护了小花
shell的第二个作用就是保护操作系统
shell作用:
1、交互:将用户请求任务,传递给操作系统,将操作系统对应的执行结果通过外壳返回给用户
2、保护操作系统
我们知道Linux用的外壳是bash,那么shell和bash有什么关系呢?把shell比作媒人,那么bash就是媒人之一:王婆,我们要理解,shell是所有外壳程序的统称,bash是外壳程序之一
欢迎大家学习交流!