Linux 入门之旅 ☁️
上一篇文章链接: 【2021年最新版】安装虚拟机 VMware Workstation + 安装Linux操作系统 + 输出“Hello World!”.
下一篇文章链接: 【Linux学习笔记②】——基础入门(下)⭐【进程管理 备份与恢复 元字符与正则表达式】⭐.
● Shell 是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向 Linux 发送请求以便运行程序的接口系统级程序。 Shell本身是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
● Shell 既是一种命令语言,又是一种程序设计语言(也就是常说的shell脚本)。
● Shell 作为命令语言,它互动式地解释和执行用户输入的命令;Shell 作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
● 它虽然不是 Linux 系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档等操作。Shell 与 Linux系统的层次结构 的关系如下图所示:
◆ 补充说明:像 “gcc、cp” 等字符就是shell的常用命令语言。
● 为什么在学习 shell 之前要学习 “目录组织结构” 呢?因为在 Linux 系统启动时,计算机会选择一个特定分区作为根文件系统。我们如果不做 “ 文件进/出 ” 的操作,那么我们将在当前文件下进行相关操作。
打比方说,把 Linux 系统比作一个 “人”,“人” 睡醒后起来时(就像 Linux系统 启动时),“人” 所在的房间一般是卧室,几乎不可能是厨房(就像 Linux 系统启动时,操作区间位于 home 目录,如下图所示)。
● 上手实战来看看 Linux 的系统目录。点击左端的 “终端”,如果没有这个选项,就在下面 “菜单” 里面找出来。本文的操作环境是 VMW虚拟机 + Ubuntu搭建的Linux系统。
● 简单说一下马上要用的 shell 命令:
$ ls # 查看当前文件下的所有文件
$ cd 文件名 # 进入该文件
◆ 说明:
① 一打开终端时,显示的是 “~$”。其中 “ ~ ” 代表的就是 “Linux系统启动时操作区间一开始位于的目录”。
② 当我们输入 “ls” 时,终端会把 当前文件下的所有文件 的文件名显示出来。其中,我们可以发现 “Desktop” 这个桌面文件。
③ 接下来,我们来找找这个 “~” 目录,究竟在哪里。
④ 输入 “cd /” ,进入根目录,也就是计算机最根本的“祖先级”文件。
⑤ 再输入 “ls” ,我们可以发现那张图上面熟悉的文件身影 “bin、etc、lib等等”,我们也看到了 “home”。
⑥ 再输入 “cd /home”,进入 home目录。再输入 “ls”,发现里面只有 ubuntu 文件,为什么呢?
⑦ 其实,这个就是我们在最先前安装的 Ubuntu搭建的Linux系统 ,只不过虚拟机将其默认起名为 “ubuntu”。
⑧ 最后,我们再输入“cd /ubuntu” ,就可以看到熟悉的 “~” 了。
● 路径是表示文件所在文件系统中的位置,路径由一系列由 “/” 分割的目录名组成的字符串,例如: /usr/src。当 “/” 位于字符串首位时,表示根目录;而当位于两个目录名之间时,表示分隔符。
● 用户主目录:每个用户在登录系统时,都位于某个目录,该目录称为用户主目录。例如:root 的用户主目录是 /root ,普通用户的用户主目录通常是 /home/username。(我们的 username 为 “ubuntu”)。
不同的用户进入系统时,进入的用户胡主目录一般不同。就像一个公司一样,不同级别的员工所能进入的区域有限,而进入某些区域可能还没有权限。
● 工作目录:工作目录是指用户当前所处的目录。
● 用户主目录由系统定义,用户在使用计算机的过程中一般不变。工作目录可由用户动态改变
● 绝对路径:绝对路径表示从根目录开始到目标文件所经历的一系列目录名构成的字符串,目录名之间用 “/” 分割。例如:“ /home/ubuntu/Desktop ”
● 相对路径:相对路径指从当前目录开始到目标文件所经历的一系列目录序列。例如,若当前用户的工作目录为 “/usr/bin”时,且要进入绝对路径为 “ /usr/include ” 的目录时,相对路径可表示为 “ . . /include ”。
# 从根目录开始,输入以下命令
cd /usr/bin # 进入根目录下的 usr 文件里的 bin 文件
cd ../include # 先返回上一级文件,再进入 usr 文件里的 include 文件
● 运行结果如下:
● Linux 系统通过 Shell 的用户交互接口访问 Linux 系统。Shell 是架构于 Linux 内核之上的命令解析器,Shell 循环等待并解释执行用户从终端上输入的命令。Shell 有多个版本,例如:csh、bash 和 ksh 等。我们常用的是 bash。结构如下: $ 命 令 名 [ 选 项 ] [ 参 数 列 表 ] \$\quad命令名\quad[选项]\quad[参数列表] $命令名[选项][参数列表] ◆ 说明:
① $ 为提示符,提示符可通过环境变量重新设置
② 命令名 代表命令的名称
③ 选项 表示用户对功能的特定要求,有短选项格式和长选项格式,后面细讲。
④ 参数列表 表示要操作的对象列表,对象可以是文件、目录、用户和用户组等,对象的性质由命令决定。
● 根据 Shell 命令实现方式的不同,可分为内部命令和外部命令。这在进阶内容中会细讲。
● 内部命令是 shell 程序的一部分(写在 bashy 源码里),包含一些轻量级的 linux 系统命令,如:exit,history,cd,echo等。 由 shell 程序解析并在 shell 程序内运行,不需要创建新进程,通常在 linux 系统加载运行时 shell 就被加载并驻留在系统内存中,因而效率较高。
● 外部命令是系统层调用的命令,属于 linux 系统中的实用程序部分,只有当被调用时才从磁盘加载进内存。Shell 通过创建子进程,在子进程中加载并执行外部命令。
type -t ls # 判断命令 ls 是否为内部命令
● 有点像 Matlab、Java 的帮助手册。
history # 查看以往的历史命令
man ls # 利用 man 命令查询 ls 命令 的操作文档
info cp # 查看命令 cp 的相关信息
ls --help # 通过选项 --help 来获得 ls 命令的相关信息
● 在 Linux 系统中,目录是一种特殊的文件,其中包含了指向文件或子目录的链接信息。它是建立层次型文件系统的基础。
▼ pwd 命令:显示当前目录的绝对路径
★ 语法:直接写
pwd # 直接写就OK
▼ cd 命令:改变当前目录
★ 语法:cd 目录名
cd / # 切换到系统根目录
cd .. # 切换到父目录
cd ~ # 切换到用户主目录
▼ mkdir 命令:创建指定名称的目录
★ 语法:mkdir [选项] 目录名
mkdir testdir # 在当前文件创建 testdir 目录
mkdir -p /father_dir/son_dir # 分别创建 father_dir 和 son_dir 目录,-p 表示创建一系列目录
▼ rmdir 命令:删除指定名称的空目录
★ 语法:rmdir [选项] 目录名
rmdir testdir # 删除当前目录下的 testdir 目录
rmdir -p /father_dir/son_dir # 删除 father_dir 下的 son_dir 目录,若 father_dir 为空,则也删除
● 文件和目录一样,它是构成文件系统的基本要素。文件是由若干分布于块设备的逻辑块构成。从用户的角度看,文件是由若干连续字节构成的序列。文件系统记录了每个文件的名称、大小、数据在磁盘上的分布以及操作时间等信息。
▼ ls 命令:显示文件和目录信息
★ 语法:ls [选项] 目录或文件
■ 选项信息:
选项 | 含义 |
---|---|
-a |
(all)查询所有文件,包括文件名以 “.” 开头的隐藏文件 |
-l |
(list)以详细列表的方式显示文件属性 |
-i |
显示文件的节点编号(后面会学习这个) |
-R |
连同子目录的内容一起列出 |
… | … |
ls -l ~/ # 详细列出用户主目录下所有文件的信息
ls -Ri ~/ # 递归列出用户主目录下的所有文件,并显示文件的节点号
▼ cp 命令:将源文件复制到目标文件
★ 语法:cp [选项] 源文件 目标文件
■ 选项信息:
选项 | 含义 |
---|---|
-l |
若目标文件已存在,提示是否要覆盖 |
-p |
(replicate)连同源文件的属性一起复制到目标文件 |
-r |
(recursion)递归复制,主要用于目录复制 |
-u |
(update)若目标文件比源文件就,则更新目标文件 |
… | … |
cp file_1 file_2 # 将文件 file_1 复制为文件 file_2
cp -r dir_1 dir_2 # 复制目录 dir_1 到目录 dir_2
▼ rm 命令:删除文件列表中的文件
★ 语法:rm [选项] 文件列表
■ 选项信息:
选项 | 含义 |
---|---|
-i |
(information)在删除文件前给出提示 |
-r |
(recursion)递归删除,主要用于删除目录 |
-f |
(force)强制删除,不给出提示 |
… | … |
rm file_1 file_2 # 删除文件 file_1 和 file_2
rm -r dir_1 # 删除目录 die_1
▼ mv 命令:将列表中的所有文件和目录移动到目标目录
★ 语法:mv [选项] 源文件或源目录列表 目标目录
■ 选项信息:
选项 | 含义 |
---|---|
-f |
(force)强制移动,若目标文件已存在,不进行提示 |
-i |
(information)若目标文件已存在,提示是否覆盖 |
-u |
(update)若目标文件存在且比较旧,则用源文件更新 |
… | … |
mv file_1 file_2 # 将文件 file_1 更名为 file_2
mv file_1 dir_1 dir_2 # 将文件 file_1 和目录 dir_1 移动至目录 dir_2
▼ find 命令:在目录列表中按照匹配方式搜索符合条件的文件
★ 语法:find [目录列表] [匹配方式]
■ 选项信息:
匹配方式 | 含义 |
---|---|
-name 文件名 |
在目录列表中搜索和文件名相匹配的文件 |
-type ... |
在目录列表中搜索类型为…的文件,例如,d 表示目录 |
-mtime n |
匹配所有在前 n 天内修改过的文件 |
-atime n |
匹配所有在前 n 天内访问过的文件 |
-print |
显示整个文件路径和名称 |
-user 用户名 |
搜索所有属主为用户名的文件 |
… | … |
find / -name hello_world.c -print # 查找文件 hello_world.c 并打印整个文件路径和名称
find / -type d -print # 找查所有目录文件
find ~/Desktop -type f -mtime -10 -print # 找查在“~/Desktop”里面的 10 天以内修改过的所有类型为 f 的文件
● 文本文件是指以 ACSII 码形式存储的文件,Linux 系统中常用到这样的文件。
▼ cat 命令:在终端上显示文本列表中文本文件的内容。若未提供文件列表,则提示需要从键盘输入。
★ 语法:cat [选项] 文件列表
■ 选项信息:
cat /bin/lib32 # 显示文件 /bin/lib32 的内容
cat txt_1 txt_2 # 分别显示文本文件 txt_1 和 txt_2 的内容
▼ more 命令:分页显示文本文件的内容
★ 语法:more [选项] 文件列表
more hello_world.c # 分页显示 hello_world.c 中的内容
more / -name "*.c" -mtime -5 -print - exec more {} \; # 分页显示所有 5 天内修改的 C 程序
▼ less 命令:分页显示文件内容,可用键盘上的 “PageDown” 和 “PageUp” 进行翻页
★ 语法:less [选项] 文件名
less -N /etc/services # 分页显示文件 services 中的内容,在每行前显示行号
▼ head 命令:显示文件前的若干行
★ 语法:head [选项] 文件名
head -5 /etc/services # 显示文件 services 的前 5 行
▼ tail 命令:显示文件后的若干行
★ 语法:tail [选项] 文件名
tail -20 /etc/services # 显示文件 services 的后 20 行
● 文件链接有两种形式,分别为硬链接和软连接。打比方说,我们打开一个游戏软件,我们可以在游戏文件夹打开 “.exe” 程序文件,这个就是硬链接。而当我们打开桌面上游戏的快捷方式,这个就是软链接。可以发现,这两个链接的大小是不一样的。前者是包含启动游戏的所有 “配置+搭建代码”,而后者只是一个 “链接”(记录了前者的地址)。
● 硬链接:文件系统中的每一个文件都有它自己的 “i 结点”,每个 “i 结点” 都保存了一个文件的属性和它在硬盘上对应数据块的位置,当两个不同的文件名代表同一个文件时复制 i 结点,“链接计数器” 增加一个值,类似指针。不同分区上的两个文件之间不能建立硬链接,这是因为硬链接是通过 i 结点指向原始文件的,而文件 i 结点在不同的文件系统中可能会不同。
● 软链接:又称符号链接(symbolic link),通过文件名指向另外一个文件的,类似于 Windows 的快捷方式,本质上存储另外一个文件的路径。这就允许符号链接指向定位于其他分区,甚至是其他网络硬盘的某个文件。
in source_file destination_file # 对文件 source_file 建立硬链接文件 destination_file
in -s source_file destination_file # 对文件 source_file 建立软链接文件 destination_file
● Linux 是多用户的操作系统,Linux 可在系统中建立多个用户,并为不同用户分享资源。 每个用户拥有不同的资源访问权限。不同用户之间既有共享资源,又有各自独立的资源空间。
● Linux 系统会通过建立用户组来管理相关用户。
● 在 Linux 系统中,所有用户都有一个唯一的标识 UID 。从用户的角度,每个用户都有一个名字,例如:超级用户 root。Linux系统为了方便用户使用,在用户名和UID之间建立一对一的关系。
● Linux 系统将用户分为超级用户、虚拟用户和普通用户。
① 超级用户:超级用户一般用于系统管理,可不加限制地使用系统资源,具有所有权限,用户名为 root,UID 为 0。
② 虚拟用户:与超级用户不同,虚拟用户是一种受限用户,为满足系统进程对文件资源的访问控制而建立,虚拟用户不能用来登录。例如,bin、daemon、adm 和 lp 等都是虚拟用户,用户 UID 一般为1~499。
③ 普通用户:与虚拟用户一样,普通用户也是受限用户,建立普通用户的目的是为了让使用者登录系统,分享 Linux 系统的软硬件资源,用户的 UID 在500~60000之间。
◆ 可以用 id 命令来查看用户的 UID:
◆ 打开终端,输入 id 后发现,我们的用户名为 “ubuntu”,UID 为 999,属于 “普通用户”。
● 用户组是由若干相关用户构成的集合,属于该组的用户对某些文件具有相同的存取权限,通过用户组,可以使多用户实现对资源的共享。
● 一个用户可属于多个用户组,这多个用户组中,必须有一个是主用户组,其他则为附加用户组。
● 创建文件的用户成为该文件的属主用户,该用户的主用户组则成为该文件的属组,每个文件的属主用户和属组是唯一的。
有点像 QQ 群,每个人都能建群和进群,但是每个人只能建一个群,当一个群主。但是 ta 可以进很多群。然后,对于某个人来说,ta 所建群对于 ta 说来就是 “主用户组”,而 ta 进的其他群就是 “附加用户组”。
然后,每个进群的人,都可以在群里上传文件。然后对于每个文件来说,都有两个 “属性”。一个属性是——文件是被谁上传的(这个相当于是“属主用户”),另一个属性是——文件所在的群(这个就相当于是 “属组” )。
▼ groupadd 命令:添加指定名称的用户名组
★ 语法:groupadd 用户组名
groupadd grp_1 # 创建用户组 grp_1
▼ groupdel 命令:删除指定名称的用户名组
★ 语法:groupdel 用户组名
groupdel grp_1 # 删除用户组 grp_1
▼ useradd 命令:建立用户
★ 语法:useradd [选项] 用户名
选项 | 含义 |
---|---|
-g |
指定用户所属的主用户组 |
-G |
指定用户所属的附加用户组 |
-n |
取消建立以用户名称为名的用户组 |
-r |
建立系统账户 |
-s |
指定用户的登录 Shell |
-u |
指定用户 ID 号 |
-d |
指定用户登录后的用户主目录 |
… | … |
useradd usr_1 # 创建用户 usr_1, 建立同名用户组 usr_1 作为其主用户组
useradd -u 321 -g grp_1 usr_2 # 建立用户 usr_2, UID 为 321, grp_1 作为主用户组
useradd -g g1 -G g2, g3 usr_3 # 建立用户 usr_3, g1 为主用户组, g2 和 g3 为附加用户组
useradd usr_1 # 显示用户所属的用户组
▼ passwd 命令:建立用户的登录密码
★ 语法:passwd 用户名
passwd usr_1 # 设置usr_1 的登录密码
▼ usermod 命令:修改用户属性
★ 语法:usermod [选项] 用户名
选项 | 含义 |
---|---|
-d |
修改用户登录用户主目录 |
-s |
修改用户登录的 Shell |
-g |
修改用户所属的主用户组 |
-G |
修改用户的附加用户组 |
-U |
修改用户的 ID |
… | … |
usermod -g grp_1 usr_1 # 将用户 usr_1 的主用户组更改为 grp_2
usermod -s /bin/bash usr_1 # 将用户 usr_1 的登录 Shell 更改为 bash
▼ chown 命令:修改文件的所属用户和组
★ 语法:chown [用户]:[用户组] 文件列表
chown usr_1 file_1 # 设置文件 file_1 所属用户为 usr_1
chown usr_1:grg_1 file_2 # 设置文件 file_2 所属用户为 usr_, 所属用户组为 grp_1
● 所有用户、用户组和密码等信息都存放在 /etc 的相关文本文件中。
文件 | 功能 |
---|---|
/etc/group |
保存用户组的信息 |
/etc/passwd |
保存用户名信息 |
/etc/shadow |
保存用户的加密命令 |
/home/username |
查看 用户username 的用户主目录 |
… | … |
◆ 举个栗子:
◆ 说明:
① 我们先查看了 “/etc/group”(即用户组信息) 的 前 5 个,然后查看了 “/etc/group” 的 最后 5 个用户组信息。
② 可以发现,root 属于 GID(组ID) 为 0 的用户组。我们的 ubuntu 属于 GID 为 999 的用户组。
● Linux内核 通过 “i 节点” 来管理文件。每个文件对应一个 “i 节点”,每个 “i 节点” 有唯一的编号。“i 节点” 保存了除文件名外的所有信息。
● 通过 l s ls ls 命令,并配合 − l -l −l 选项可实现对文件属性的查询, l s – l ls\,\,\,\, –l ls–l,如下图所示。
◆ 说明:
① 第 1 个字符用于表示文件类型
② 第 2 至 10 共 9 个字符表示文件的操作权限
③ 图中的 “2” 表示连接数,指文件被引用的次数(也就是能从别处文件进来的“通道数”)
④ 第一个 “ubuntu” 表示文件所属的用户名
⑤ 第二个 “ubuntu” 表示文件所属的用户组。
⑥ 接下来的 “40、60” 指文件的大小(字节数)
⑦ “9月 24 02:27” 值文件最近被修改的日期和时间
⑧ “视频、图片、Desktop等” 是文件的名称。
◆ 对于 ① 的补充:
前缀 | 文件类型 |
---|---|
- |
普通文件 |
b |
块设备文件 |
c |
字符设备文件 |
d |
目录 |
… | … |
◆ 对于 ② 的补充:
<1> 一个文件由 1 个类型和 9 个权限位来描述,9 个权限位分为 3 组,每组 3 个权限位,具体表示如下所示:
<2> 权限对文件和目录的定义:
权限 | 文件 | 目录 |
---|---|---|
r(读) |
查看文件内容 | 浏览目录内容 |
w(写) |
修改文件内容 | 在目录中创建文件或目录 |
x(执行) |
将文件投入运行 | 进入目录 |
-(无) |
没有权限(未定义权限) | 没有权限(未定义权限) |
<3> 权限的定义还可以用 八进制 来表示(可能是为了方便计算机硬件运行什么的)
比如说:如果某组的权限是 “r-x”,则用八进制表示为 4 + 0 + 1 = 5.【注:若某位未设置权限,则值为 0】。在比如说,常用的 “rwxr-xr–” 用八进制表示 755。
● 除了上述 Linux 系统为三类用户定义的三种权限外,有时系统对权限会有一些特殊要求。比如,当普通用户通过 passwd 命令修改密码时,需要临时扮演角色,使用户临时拥有某种特殊的权力。这就需要 在被执行命令的文件中 定义一些特殊的位,它们分别是 SUID、SGID 和 Sticky 位:【这里只略写,进阶内容会深入地讲】
● SUID 位(Set-User-ID):SUID 是三位特殊权限中的第一位,通过在某文件上设置 SUID 后 ,当用户在访问该文件时,用户将临时拥有该文件的属主用户的权限。
◆ 例如修改用户登录密码时,一般是通过修改 /etc/shadow 文件来实现的,让本来没有相应权限的用户运行该程序时,观察该文件的访问权限如下所示:
从中可以发现,root 用户(属主)具有对该文件 “r和w” 的使用权限,普通用户只有对其 “r(读)” 的使用权限。因此,普通用户若要完成对登录密码的修改,则必须要临时扮演 root 用户的角色。为了达到这一目的,可通过给 /usr/bin/passwd 文件定义 SUID 位来实现。
在图中可发现,对于 “-rwsr-xr-x 1 root root 68208 7月 14 22:08 /usr/bin/passwd” 这语句来说,小写字母 “s” 表示:“x 和 SUID 位同时被设置”。SUID位的设置 “告诉” 内核,无论执行 passwd 命令的用户是谁,在执行 passwd 命令时,ta 都会临时扮演 passwd 文件属主用户的角色。【注:普通用户只能修改自己的密码,因为 passwd 可判断使用者的身份】
● SGID 位(Set-Group-ID):SGID 是三种特殊权限中的第二位,若某文件的所属用户组为 g,且该文件的 SGID位 已被设置,则当用户访问该文件时,用户将临时扮演用户组 g 中用户的角色。若在某目录上设置 SGID位 ,则该目录中建立文件和目录的所属用户组为该目录的所属用户组。
● Sticky 位:Sticky 是三种特殊权限中的第三位。当前该位只对目录有效,若某目录被设置为 Sticky位,且用户在该目录上具有 “w” 和 “x” 权限,用户只能删除属于自己的文件或目录。
● 关于权限显示格式的补充:
权限 | 特殊位的含义 |
---|---|
-rwSr--r-- |
SUID被设置,但所属用户的执行权没被设置 |
-rwsr-xr-x |
SUID和所属用户的执行权被设置 |
-rw-r-Sr-- |
SGID被设置,但所属用户组的执行权没被设置 |
-rwxr-sr-x |
SGID和所属用户组的执行权被设置 |
drwxrw-r-T |
Sticky位被设置,但其他用户的执行权没被设置 |
drwxrw-r-t |
Sticky位和其他用户的执行权被设置 |
… | … |
◆ 详细说明:
① 特殊权限位包括:“ s、S、w、t、T ”。
② 由于没有专门为这些特殊权限定义显示的位置。所以他们分别借用了所属用户、所属用户组和其他用户的执行位。
③ 当所属用户的执行位为 “s” 时,表示所属用户的执行位被设置,且 SUID位 也被设置。
④ 当所属用户的执行位为 “S” 时,表示所属用户的执行位没有被设置,但 SUID位 被设置。
⑤ 同理,当所属用户组的执行位为 “s” 时,表示所属用户组的执行位被设置,且 SGID位 被设置。
⑥ 同理,当所属用户组的执行位为 “S” 时,表示所属用户组的执行位没有被设置,但 SGID位 被设置。
⑦ 若其他用户的执行位为 “t”,表示其他用户的执行权被设置,且 Sticky位 也被设置。
⑧ 若其他用户的执行位为 “T”,表示其他用户的执行权没有被设置,但 Sticky位 被设置。
▼ chmod 命令:更改文件的访问权限
★ 语法一:chmod [augo][±=][rwxst] 文件列表
★ 语法二:chmod 八进制权限值 文件列表
◆ 详细说明:a、u、g、o
选项 | 指示范围 |
---|---|
a |
(all)所有用户 |
u |
(user)属主用户 |
g |
(group)属主用户组 |
o |
(other)其他用户 |
◆ 详细说明:+、-、=
选项 | 功能 |
---|---|
+ |
添加权限 |
- |
删除权限 |
= |
赋值权限 |
◆ 详细说明:r、w、x、s、t
选项 | 功能 |
---|---|
r |
读权限 |
w |
写权限 |
x |
执行权限 |
s |
设置SUID位/SGID位 |
t |
设置Sticky位 |
◆ 举几个栗子如下图所示:【注:touch命令 的功能是创建一个文件】
● 用户信息是 Shell 进程属性的一部分。用户分为实际用户和有效用户。实际用户是指登录用户。有效用户是指临时扮演的用户。
① 当用户访问某文件时,若文件的特殊权限位没有被设置,则访问进程的实际用户就是有效用户。
② 在①的情况下,当进程的有效用户等于文件的所属用户时,文件的所属用户权限起作用。
③ 在①的情况下,当进程的有效用户不等于文件的所属用户时,但进程的有效用户属于文件的所属用户组时,文件的所属用户组权限起作用。否则,其他用户权限起作用。
【注意:一般情况下实际用户 = 有效用户,但一些特殊情况,如文件设置了 SUID位 后则有所不同。】
④ 若文件的 SUID位 被设置,则访问进程的有效用户将被修改为文件的所属用户,用户将临时扮演文件所属用户的角色。
⑤ 同样,若文件的 SGID位 被设置,则用户将临时扮演文件所属用户组成员的角色,访问进程的有效用户组替换为文件的所属用户组。
以上的概念非常绕,我举个抽象的例子帮助理解:
● 前提:当用户访问某文件,若文件的特殊权限位没有被设置时,就相当于:
② 文件 A 的创建者小明,有最高一级权限,能任意修改他自己写的文件。
③ 小红不是文件的创建者,但是她在含有这个文件 A 的 QQ群 里面,对 A 有二级修改权限。而小军即不是文件的创建者,也不在那个 QQ群 里面,对 A 只有三级修改权限。
● 前提:当用户访问某文件,若文件的特殊权限位没有被设置时,就相当于:
④ 小红不是文件的创建者,但是她在含有这个文件 A 的 QQ群 里面,对 A 有最高一级修改权限。
⑤ 小军不是文件的创建者,也不在那个 QQ群 里面,但对 A 有二级修改权限
● umask 是进程的一个属性,用于为进程创建的文件或目录定义默认权限,它是进程运行环境的一部分。Shell 创建的所有子孙都将继承这一属性,用户可通过 umask 命令修改 umask 的值。其中,权限掩码的取值范围为 0000-0777。
umask # 显示当前的 umask 掩码
umask 0123 # 将当前的 Shell 的 umask 掩码修改为 0123
● 设权限掩码为 002,则对应的二进制标识为 000 000 010 共 9 位。前三位代表用户的读、写和执行权限,中间三位代表用户组的读、写和执行权限,后三位代表其他用户的读、写和执行权限。
● 三位权限中,若掩码中某位的值为 1,则在创建文件和目录时,相应位的权限被屏蔽,计算时采用异或方式。
● 出于安全原因考虑,系统不允许创建文件时就赋予它执行权限,必须在创建后用 chmod 命令增加这一权限。因此,创建文件时默认最大权限值为 666 (rw-rw-rw-),而目录允许设置执行权限,因此默认最大权限值为 777 (rwxrwxrwx)。
◆ 举个栗子:设权限掩码为 023,其对应的二进制标识为 000 010 011
[1] 《GNU/Linux编程》
人民邮电出版社
[2] 《百度百科——Shell脚本》
链接: https://baike.baidu.com/item/Shell%E8%84%9A%E6%9C%AC/572265?fr=aladdin.
上一篇文章链接: 【2021年最新版】安装虚拟机 VMware Workstation + 安装Linux操作系统 + 输出“Hello World!”.
下一篇文章链接: 【Linux学习笔记②】——基础入门(下)⭐【进程管理 备份与恢复 元字符与正则表达式】⭐.
后面的 Linux 文章会持续更新,未完待续…⭐️ ⭐️