一、Shell 命令及运行原理
Linux 严格意义上来说属于操作系统,我们称之为'核心(kernel)'。
一般用户无法直接使用 kernel,而是通过 kernel 的外壳,也就是 Shell,完成交互。
为什么不能直接入手 kernel?例如 Windows 的 GUI:我们操作 Windows 不是直接操作 Windows 内核,而是通过图形点击,从而完成我们的操作(比如进入 D 盘的操作,通常是双击 D 盘盘符或者运行起来一个应用程序)。
但其实这只是将 Linux 指令图形化界面了,通过操作图形化界面让 Linux 执行对应指令,那这中间就有一个命令转换:Shell 的最简单定义——命令行解释器(command Interpreter)。
二、Linux 权限的概念
Linux 的权限一般分为两种:
超级用户(root):可以在 Linux 系统下做任何事情,不受限制,超级用户的命令提示符是"#"。
普通用户:在 Linux 下做有限的事情,普通用户的命令提示符是"$"。
权限用户的切换:su 或者 su -,后面接用户名:root 或者 普通用户名。 (root->普通用户不需要密码,普通用户->root 需要密码)
三、Linux 权限管理
我们知道,Linux 之下一切皆文件!
Linux 操作的是文件,那么上面说的 Linux 权限分类可以这么理解:对操作文件权限的分类。
操作文件的身份在 Linux 里面我们可以分为以下三类:
所有者:文件和文件目录的所有者(u),可理解为创造者
所属组:文件和文件目录的所有者所在的组的用户(g),可理解为使用者
other:其它用户(o),可理解为除了上面两类之外的
例如:在 Linux 操作的文件是有显示文件的各种信息的,下面我们来重点讨论几个信息!
(1)文件类型
**-**开头的属于文件
d 开头的属于目录
(2)权限分布与解释
除了开头的文件类型,后面九个每三个为一组分别代表:所有者、所属组、other 权限。
怎么理解三个权限对象?
所有者:文件的创造对象
所属组:可以理解为多个人集中管理一个文件,那这多个人就在一个组里面
other:除了上面两种之外的统一解释为 other
如何成为所属组成员?
所属组权限对象由 文件所有者 和 root 操控
(1)查看文件所在的所有组
(2)分配给所属组
-a:表示'追加'(避免覆盖你原有的所属组)-G:指定要加入的组(这里是文件的所属组dev_group)(3)检查
如果自己是文件的创造者或者 root,那么没有了 rwx 权限,还可以操作吗?
如果是 root 用户,是不受权限的约束:
如果修改所有者,所有者会受到影响:但是可以自己操作文件权限改回来
对文件权限简称的解释:
读(r/4):Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w/2):Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(x/1):execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
'—'表示不具有该项权限
(3)文件权限的设置
(1)chmod 指令
作用:设置文件的访问权限
选项:-R 递归修改文件的权限
格式:用户表示符 +/-= 权限字符
- :向权限范围增加权限代号所表示的权限
- :向权限范围取消权限代号所表示的权限
= :向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用户
o:其它用户
a:所有用户
(2)chown 指令
功能:修改文件的拥有者
选项:-R 递归修改文件的权限
格式:chown [参数] 用户名 文件名
例如:
chown user1 f1
chown -R user1 filegroup1
(3)chgrp 指令
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
常用选项:-R 递归修改文件或目录的所属组
实例:chgrp users /abc/f2
(4)umask 指令
作用:修改/查看文件掩码
何为文件掩码?
文件的权限掩码(umask)即当文件/目录出生时,根据掩码屏蔽掉该文件/目录的部分权限,即完成一个文件/目录的出厂设置!
如何根据掩码计算文件出厂权限?(了解)
权限掩码的计算不是简单的'数值减法',而是基于二进制的按位操作。具体步骤如下:
(1)明确'基础权限'(系统固定值)
新文件/目录的默认权限计算,首先依赖系统预设的'基础权限'(不可修改):普通文件:基础权限为 666(对应权限字符串 -rw-rw-rw-,默认无执行权限,避免安全风险);目录:基础权限为 777(对应权限字符串 drwxrwxrwx,目录必须有执行权限才能进入,因此基础权限包含 x)。
(2)理解权限的'数字 - 二进制 - 字符'对应关系
权限由'读(r)、写(w)、执行(x)'三种基础权限组成,每组角色(所有者、组、other)的权限可转换为数字或二进制:r(读)=4(二进制 100)w(写)=2(二进制 010)x(执行)=1(二进制 001)无权限(-)=0(二进制 000)
例如:rwx = 4+2+1 = 7(二进制 111)rw- = 4+2 = 6(二进制 110)r-- = 4(二进制 100)
(3)计算步骤:按位取反 → 按位与
权限掩码的计算需通过两步二进制操作:目标权限 = 基础权限 & (~umask),推导 umask:
(1)将权限掩码(umask 值)转换为二进制后按位取反~(0 变 1,1 变 0)
(2)将'基础权限'的二进制与'取反后的掩码'进行按位与(&)(同 1 为 1,否则为 0)操作,结果即为新文件的默认权限
格式:
umask // 查看
umask 044 // 设置
例如:现在我查看普通用户的掩码,然后修改为 rwx(000),在创建一个新文件看看默认权限。
注意:文件的基础权限是规定不包含 x 执行权限的,因此需要手动添加
四、粘滞位
(1)粘滞位解释
粘滞位仅对目录有效(对文件的作用已在现代 Linux 中废弃),典型应用场景是系统级公共临时目录 /tmp 和 /var/tmp:
(1)这些目录的默认权限是 rwxrwxrwx(所有用户都能读写执行),任何人都能在其中创建文件
(2)若没有粘滞位,普通用户 A 可以删除普通用户 B 在 /tmp 中创建的文件,存在数据安全风险
(3)加上粘滞位后,用户只能删除自己创建的文件(root 也行)避免了误删他人文件的问题
例如:A 在创建了一个目录 PS,现在 ABCD 都在这个目录 PS 下面工作,现在 A 创建了一个文件 text,按理来说这个文件只能由 A 或者 root 删除,但是实际是 BCD 都可以,所以避免这种情况,需要使用粘滞位来让 text 文件只能由 A 或者 root 删除!
启用粘滞位的目录,无论其他用户是否有写权限,都遵循以下删除/重命名规则:
(2)粘滞位使用
仅对目录生效,用 t 标识:
只有目录的所有者(owner)或 root 用户,才能为该目录设置或移除粘滞位。
格式:chmod +t 目录位置
# 为公共目录 /data/public 添加粘滞位
chmod +t /data/public
效果:目录权限的最后一位(其他用户的执行位 x)替换为 t

