目录
1.Linux中的用户
1.1 用户分类
Linux下有两种用户:超级用户(root)、普通用户。
-
超级用户:可以再linux系统下做任何事情,不受限制
-
普通用户:在linux下做有限的事情。
-
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
1.2 用户切换
命令:su [用户名] 功能:切换用户。 例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
-
普通用户切换成root:需要输入root密码
-
root切换成普通用户:直接切换,不用认证
-
普通用户切换成普通用户:需要输入另一个用户的密码
-
短暂提权指令sudo:不想切换root但想使用root权限,可以只在指令前加sudo,当然并不是所有用户都可以sudo,需要root用户进入sudoers文件中进行配置,只有用户名出现在sudoers文件中才能使用sudo。
2.权限的概念
2.1 权限概念以及表示
下面的权限只针对文件而言:
-
r:读权限,读取文件内容的权限,如cat < file
-
w:写权限,修改文件内容的权限,如echo ... > file
-
x:执行权限,执行文件的权限 ,如./a.out
-
-:表示不具备该权限
注意:我们想对一个文件进行操作,不仅我们得拥有这个操作的权限,这个文件也必须得拥有对应的属性,比如执行权限,并不是所有文件都可以执行的。
2.2 文件属性以及类型
2.2.1 文件属性
Linux下可以使用ls -l指令查看文件属性,文件属性中有权限相关的属性。
如上匡红的那一列都是权限属性,为什么这么多分别代表什么权限?下面再详细介绍。
1是文件硬链接数,暂时不用考虑。
zwj和zwj分别是文件的拥有者及所属组,后面介绍。
再往后面分别是文件大小、最后一次修改日期、文件名。
2.2.2 文件类型
Windows为了考虑用户使用体验,通过后缀表示文件类型,但是Linux的文件类型不通过后缀进行区分,可这并不代表Linux不能使用后缀。Linux系统本身不通过后缀区分文件类型,但是Linux上层的一些软件需要通过后缀进行区分。
ls -l指令显示的文件属性中,第一个字符表示文件类型。
常见的文件类型有:
-
-:普通文件:文本、源代码、图片、视频、库、可执行文件等
-
d:目录文件
-
b:block,块设备文件(磁盘)
-
c:char,字符设备文件(键盘、显示器)
-
l:链接文件
-
p:管道文件
-
s:socket文件
对于文件后缀,虽然Linux不通过它识别类型,但还是建议使用。(我们看着舒服)
输入file指令可以查看文件类型。
2.3 Linux下的角色
在现实社会中每个人都扮演着不同的角色,操作系统中也是如此。
Linux中有以下三种角色:
-
拥有者(u):文件或目录的所有者
-
所属组(g):文件或目录的所有者所在的组的用户
-
others(o):除了拥有者和所属组之外的其他人
注意:
-
为什么要有所属组的存在?只区分拥有者和others不行吗?
通过所属组,Linux提供了一种方便和有效的方式来实现文件共享和协作。组内的成员可以共享文件并根据权限管理进行操作,从而实现团队成员之间的协作编辑和资源共享。
-
和现实生活一样,一个人可以扮演着不同的角色,Linux下一个用户也可以扮演不同的角色。
-
root不收任何权限的约束。
再谈权限(文件属性中的权限):
权限属性那一列分为三组,每组属性由三个字符组成,总共九个字符组成。
第一组是拥有者的权限,依次是r、w、x,-表示没有,第二组是所属组的权限,第三组是others的权限。
注意:一次只能匹配一个角色,也就是说,如果拥有者和所属组都是你的话,优先匹配拥有者,只根据拥有者的权限来决定你的权限,一个人不能既是拥有者又是所属组。
如果文件权限为:r-- rw- ---,我既是拥有者也是所属组,但是我并没有写权限。
3.权限的修改
3.1 chmod
注意:只有文件的拥有者和root才可以改变文件的权限
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
常用选项: R : 递归修改目录文件的权限
-
用法一:用户标识符(u->拥有者、g->所属组、o->others、a->所有人)+/-/= 权限字符(r、w、x)
示例:
chmod u+r test.txt :拥有者添加test.txt文件的读权限
chmod a-rwx test.txt:取消所有人对test.txt文件的读写执行权限
chmod u+rw,g+r,o+r test.txt::拥有者添加test.txt文件的读写权限、所属组和others添加test.txt文件的读权限
-
用法二:三位8进制数
权限属性分为三组,每组三个字符,而且每个权限只分有和没有,是不是可以用二进制代替,0表示没有1表示有,每组权限就是一个8进制数字,权限属性就可以表示成三位8进制数。
示例:
chmod 000 test.txt:取消所有人对test.txt文件的读写执行权限
chmod 764 test.txt:拥有者有读写执行、所属组有读写权限,others有读权限
chmod 777 test.txt:所有人拥有test.txt文件的读写执行权限
3.2 chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
常用选项:-R 递归修改文件或目录的拥有者
注意:修改文件拥有者需要获得别人的允许,普通用户虽有有这个文件的相关权限,但就是给不了别人,怎么办?只能使用sudo提权或者使用root用户强制给别人了。
3.3 chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
注意:
-
没有更改others的指令,因为更改拥有者和所属组就是在更改others。
-
如果我想一次性改变拥有者和所属组,可以使用chwon:
chwon zwj zwj test.txt 把test.txt文件的拥有者改为zwj,所属组改为zwj。
4.目录权限
目录的权限有哪些?
-
r:查看目录下文件的属性的权利
-
w:在目录下新建和删除文件的权利
-
x:进入目录的权利
5.权限掩码
5.1 默认权限
创建一个文件,默认权限是664,创建一个目录,默认权限是775。
为什么不是777,不是666?这是权限掩码决定的结果!
5.2 起始权限
介绍权限掩码之前,我们要知道:
文件的起始权限是666(因为绝大多数文件不具有执行的属性,所以不给执行权限),目录的起始权限是777。
而权限掩码和起始权限共同决定了默认权限,权限掩码也决定了一个文件或者目录被创建时的默认权限。
5.3 权限掩码
Linux中使用umask指令可以查看到权限掩码为:0002,第一个0不用在意,他决定后面的数字都是8进制,真正的掩码是002。
我们可以看到,起始权限中去掉umask中的权限,就是默认权限,但注意这不是减出来的,他们的关系是这样的:
默认权限 = 起始权限 & (~umask)
当然了,我们也可以修改权限掩码umask:
指令:umask 0555 -> 修改掩码为555,所有人都只有写权限,没有读和执行权限。
6.粘滞位
当我们新建一个用户时,系统会自动在 /home 路径下创建一个用户的家目录,通过观察可以发现,所有家目录的权限都是 700,这意味着,其他普通用户无法进入我的家目录,也不能查看我的家目录下的所有文件,更不能对我的家目录中的文件进行修改、删除,也不能在我的家目录中创建文件。
问题引入:
假设有这么一个情况,多个人需要在一个特定的目录下实现文件共享呢?当然这个目录不能在家目录/home里,得在根目录/下,而且这个目录的拥有者和所属组一般为root,目录的others权限也得全部开放,保证普通用户都能在这个目录下进行操作。
假设用户A在这个目录下创建了一个文件,拥有者和所属组是A自己,others的权限全部关闭,那么用户B进入这个目录后,显然不能对A的文件进行读写执行操作,但是B用户可以删除A的文件!(删除文件是目录的写权限,目录的others权限全部开放)这显然非常扯淡,那么怎么解决这个问题呢?答案就是粘滞位!
粘滞位
粘滞位是给目录的others设置的一个权限位t(chmod + t direcyory_name),具有x的意义,同时也进一步对目录权限进行特殊限定:该目录中的文件,只有root或者文件/目录的拥有者有权利进行删除,其他人都不允许。
总结:
-
粘滞位一般是给共享目录设置的权限位,这个共享目录:
-
在根目录下
-
拥有者和所属组一般为root
-
目录的others权限得全部开放
-
-
加了粘滞位的目录,里面的文件只能由:
-
root删除
-
目录的拥有者删除
-
文件的拥有者删除
-
7.Xshell运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
简单来说,用户直接使用kernel的话,一方面操作成本高不宜使用,另一方面可能会破坏操作系统造成不安全因素。所以我们不能直接访问操作系统。
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
-
将使用者的命令翻译给核心(kernel)处理。
-
同时,将核心的处理结果翻译给使用者。
它的意义:
-
是用户和操作系统交互的中间软件层。
-
在一定程度上保护操作系统。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。