今天的内容相对比较简单理解
Linux权限理解
这里主要想谈的就是目录的权限问题,至于用户和超级用户的权限问题,这个太简单了,查一查su和sudo命令即可
接下来重点看一看文件中的三个权限:r w x 分别是读取,写入和执行
如下图我们进入一个目录中的文件
左边的红框代表文件权限,中间的数字是连接数,我们不管这个,右边分别是拥有者user,所属组group,其实还有一个other没有显示出来,这里提出一个问题,为什么要存在group,其实就是为了保证项目安全,方便组内协作,能够使得多个组内成员写一份代码,而且还能避免其他搞破坏的。
接下来在说一下如何修改权限:
第一种方法:chmod指令:比如添加和取消拥有者的读权限:chmod u+r text.txt和
chmod u-r text.txt
所有的人都添加读权限:chmod a+r file.txt
覆盖user之前的权限,改为只有r权限:chmod u=r file.txt
第二种方法:八进制法
其实一个用户的权限有三个,用0和1分别来代表没有和有,三个0和1正好组成八进制的数,如下:
111 —表示rwx都拥有
110 —表示rw拥有,x不拥有
000 —表示rwx都不拥有
那么就可以这样改:
chmod 110 text.txt 这就表示,user和group拥有执行权,other无权限。
接下来修改拥有者和所属组
chown指令:改变拥有者,这里注意格式:chown 改变后的owner 文件或目录名
比如在普通用户权限下,sudo chown root file.txt就是把file.txt的拥有者给root
chgrp指令:改变所属组,与上同理
接下来就是本文的重点,目录的权限到底是什么意思,
目录的读权限:就是字面意思,目录的内容是否可读,而不是目录里面文件的内容是否可读,比如目录yzy,普通用户没有读权限,然后在普通用户权限下,进行 ls yzy的操作,然后就会出现permission denied的提示,但是我们知道yzy中有一个file.txt 里面有内容hello linux,我们输入cat yzy/file.txt 就可以显示hello linux
目录的写权限:是否允许特定角色在指定目录下创建文件file(和file的内容无关),其实就是修改目录,和上面的理解是一样的。
目录的可执行权限:能否进入该目录
这里存在一个问题,如果我们取消掉可执行权限,那么读和写还能进行吗?
结论是不能,读和写的前提就是目录是能进入的!
接下里介绍一个概念:粘滞位,这个功能其实就是为了解决非root用户能够删除其他人和以root为user的目录的问题,就是说普通用户可以删别人的也可以删root的。
那么粘滞位设置就是:sudo chmod +t 目录名,这时就会发现other的x权限变为t权限,此时普通用户去删除root时,就会operation not permitted
最后再介绍一个umask的概念
当我们去touch和mkdir操作时,文件默认的权限如图,为什么是这样子的?
这里就是umask发挥了作用,导致了默认文件权限是664,默认目录权限是775
我们可以看到系统默认的umask是0002,第一个0可以不管,那就是002,对应八进制就是000 000 010,那么umask是怎么影响文件或者目录的默认权限的呢?
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)
举个例子,目录起始权限111 111 111,umask是0002 也就是000 000 010 按位取反111 111 101 然后做与运算,结果为111 111 101即775
umask的数字是可以修改的 如果设置umask是0777 那么文件和目录的所有权限都会消失。
Shell理解
shell外壳概念:
当用户登录Linux系统的时候,系统会给用户创建一个进程,一般叫做bash(命令行解释器),shell的中文意思就为外壳,bash就是shell的一种。
shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。
shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。
不论何时你键入一个命令,它都被Linux shell所解释。
至此shell的作用其实也体现出来了,首先是交互作用,第二个就是保护操作系统。