目录
shell命令以及运行原理
什么是 Shell 命令
- Shell 是一个命令行解释器,它接收用户输入的命令,并将这些命令传递给操作系统内核执行。常见的 Shell 有 Bash(Bourne - Again Shell)、Zsh、Fish 等。Shell 命令就是用户在 Shell 环境下输入的用于完成各种任务的指令。
- 例如,
ls
是一个基本的 Shell 命令,用于列出目录中的文件和子目录。cp
命令用于复制文件,mkdir
用于创建目录等。这些命令可以通过在终端(命令行界面)中输入来执行。Shell 命令的运行原理
- 用户输入阶段
- 当用户在终端中输入一个 Shell 命令(如
ls -l
)时,输入的内容首先会被 Shell 读取。Shell 会对输入的命令进行简单的语法检查,比如检查命令是否完整、参数是否符合语法规则等。- 命令解析阶段
- Shell 会根据其内部的命令查找机制来确定用户输入的命令是什么。它会在系统的环境变量
PATH
所指定的一系列目录中查找对应的可执行文件。例如,对于ls
命令,Shell 会在/bin
、/usr/bin
等PATH
包含的目录中寻找名为ls
的可执行文件。- 如果是一个内置命令(如
cd
命令在 Bash 中是内置命令),Shell 会直接执行其内部的相应代码,而不需要在文件系统中查找。- 进程创建阶段(对于外部命令)
- 如果命令是一个外部命令(不是内置命令),Shell 会创建一个新的子进程。这个子进程会继承 Shell 的一些环境变量和属性。例如,它会继承用户的权限、当前的工作目录等信息。
- 然后,Shell 会将用户输入的命令和参数传递给这个新创建的子进程,子进程会使用
exec
系统调用加载对应的可执行文件。例如,对于ls -l
命令,子进程会加载/bin/ls
这个可执行文件,并将-l
参数传递给它。- 命令执行阶段
- 子进程执行加载的可执行文件。在执行过程中,可执行文件可能会与操作系统内核进行交互。例如,
ls -l
命令执行时,需要向内核请求读取目录中的文件信息,内核会返回相应的文件属性信息(如文件大小、权限、修改日期等)给子进程。- 可执行文件根据接收到的参数和内核返回的信息进行相应的操作。对于
ls -l
,它会根据内核返回的文件属性信息,按照长格式(-l
参数指定)将文件信息输出到标准输出(stdout),通常就是终端屏幕。- 结果返回阶段
- 子进程执行完命令后,会将执行结果(如
ls -l
输出的文件列表)返回给 Shell。如果命令执行过程中出现错误,子进程也会将错误信息(如文件不存在的错误提示)返回给 Shell。- Shell 会将子进程返回的结果(或者错误信息)显示在终端屏幕上,让用户看到命令的执行情况。如果命令是在后台执行(使用
&
符号),Shell 会将子进程放到后台运行,并且可能会返回一个进程 ID(PID)给用户,方便用户后续管理这个后台进程。
Linux权限管理
基本概念
- 在 Linux 系统中,权限管理主要涉及对文件和目录的访问控制。每个文件和目录都有一组权限,用于规定不同用户(所有者、所属组和其他用户)对其的访问方式。这些访问方式包括读取(r)、写入(w)和执行(x)。
用户、组与权限的关系
- 所有者(Owner):每个文件和目录都有一个所有者,通常是创建该文件或目录的用户。所有者对文件和目录具有最高的控制权。例如,用户
alice
创建了一个文件document.txt
,那么alice
就是这个文件的所有者。- 所属组(Group):文件和目录还属于一个组。这个组可以包含多个用户,同一组中的用户对文件和目录可以有相同的访问权限。例如,在一个公司的部门项目中,所有部门成员属于一个组,他们对部门相关的文件可能有相同的访问权限。
- 其他用户(Others):除了所有者和所属组的用户,系统中的其他所有用户都被视为其他用户。
权限表示方法
- 字符表示法
- 对于文件,权限用
-rwxrwxrwx
这样的形式表示。其中,第一个字符如果是-
表示文件,如果是d
表示目录。后面的 9 个字符每 3 个一组,分别代表所有者、所属组和其他用户的权限。例如,-rwxr - xr - x
表示所有者有读、写和执行权限,所属组有读和执行权限,其他用户有读和执行权限。- 对于目录,权限的含义稍有不同。读(r)权限允许用户列出目录中的内容;写(w)权限允许用户在目录中创建、删除或重命名文件;执行(x)权限允许用户进入目录(使用
cd
命令)。- 数字表示法
- 可以将权限用数字来表示,这样更便于计算机处理。读取权限(r)对应数字 4,写入权限(w)对应数字 2,执行权限(x)对应数字 1。没有该权限用数字 0 表示。例如,
rwx
权限对应的数字是 4 + 2+1 = 7,r - x
权限对应的数字是 4+0 + 1 = 5。所以,-rwxr - xr - x
用数字表示就是 755。查看文件和目录的权限
- 使用
ls -l
命令:这是最常用的方法。例如,ls -l /home/user/file.txt
会显示文件file.txt
的详细信息,包括权限、所有者、所属组、大小、修改日期等。权限信息显示在每行的开头,如-rw - r - - r - -
。- 使用
stat
命令:stat
命令可以提供更详细的文件或目录的信息,包括权限、访问时间、修改时间、变更时间等。例如,stat /home/user/file.txt
。修改权限(除了root,不能随意把文件所属组给别人,要用sudo才能执行)
- 使用
chmod
命令
- 基于字符表示法:语法为
chmod [ugoa] [+- =] [rwx] [文件或目录]
。其中,u
代表所有者,g
代表所属组,o
代表其他用户,a
代表所有用户(ugo
的总和);+
表示添加权限,-
表示删除权限,=
表示设置权限。例如,要给文件file.txt
的所有者添加执行权限,可以使用chmod u+x file.txt
。- 基于数字表示法:语法为
chmod [数字] [文件或目录]
。例如,要将文件file.txt
的权限设置为rwx r-x r-x(111 101 101)
(数字表示为 755),可以使用chmod 755 file.txt
。- 使用
chown
命令修改所有者和chgrp
命令修改所属组
chown
命令:语法为chown [新所有者] [文件或目录]
。例如,要将文件file.txt
的所有者从user1
改为user2
,可以使用chown user2 file.txt
。如果要同时修改所有者和所属组,语法为chown [新所有者]:[新所属组] [文件或目录]
。chgrp
命令:语法为chgrp [新所属组] [文件或目录]
。例如,要将文件file.txt
的所属组从group1
改为group2
,可以使用chgrp group2 file.txt
。
文件类型
d: 文件夹 -:普通文件
l: 软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
目录的权限
- 基本概念
- 在计算机系统中,目录(文件夹)权限决定了用户或用户组对该目录及其内部文件和子目录的访问级别。这些权限对于系统安全和资源管理至关重要。
- 权限主要包括读取(Read)、写入(Write)和执行(Execute)三种基本类型,不同的操作系统可能会有一些细微的差别。
- 读取权限(r)
- 含义:具有读取权限的用户可以查看目录中的文件和子目录的名称、属性(如文件大小、创建时间等)。
- 示例:在 Linux 系统中,用户可以使用 “ls” 命令列出目录中的内容。如果没有读取权限,执行该命令时会收到 “权限不够” 的错误提示。在 Windows 系统中,没有读取权限的用户将无法在资源管理器中查看文件夹中的文件和子文件夹的名称。
- 写入权限(w)
- 含义:允许用户在目录中创建新的文件和子目录,也可以修改或删除已有的文件和子目录。
- 示例:在 Linux 中,有写入权限的用户可以使用 “touch” 命令创建新文件,使用 “mkdir” 命令创建新的子目录。在 Windows 中,用户可以在文件夹中新建文件、文件夹,也可以对文件进行修改(如编辑文本文件)和删除操作。不过,写入权限通常是和读取权限一起使用的,因为如果用户不能读取目录内容,很难确定要创建或修改的对象。
- 执行权限(x)
- 含义:对于目录来说,执行权限允许用户进入该目录(在 Linux 中可以使用 “cd” 命令进入)。如果一个目录没有执行权限,用户即使有读取权限也无法查看目录内部的文件细节。
- 示例:在 Linux 系统中,如果一个用户对 “/home/user/documents” 目录没有执行权限,那么当他试图使用 “cd /home/user/documents” 命令进入该目录时,会被拒绝访问。在 Windows 系统中,执行权限的概念相对不那么明显,但在一些特殊情况下(如访问某些受保护的系统目录),也会体现类似的限制。
- 权限组合和用户组权限
- 权限组合:目录权限可以是上述三种基本权限的组合。例如,一个用户可能同时拥有读取和执行权限(rx),这意味着他可以查看目录中的内容并且进入该目录,但不能修改或创建新的文件和子目录。
- 用户组权限:除了针对单个用户设置权限外,还可以对用户组设置权限。例如,在一个公司的网络环境中,所有的财务人员可以属于一个用户组,对于存放财务数据的目录,可以给这个用户组设置特定的权限,如读取和写入权限,方便他们工作,同时限制其他非财务人员的访问。
- 不同操作系统中的目录权限特点
- Linux 系统:
- Linux 使用一套基于文件权限位的机制来管理目录权限。权限通过 “chmod” 命令来设置,可以用数字(如 755,代表所有者有读、写、执行权限,用户组和其他用户有读和执行权限)或字符(如 rwxr - xr - x)的方式来表示。
- 它有严格的用户(所有者)、用户组和其他用户的权限划分。例如,一个文件的所有者可能有完全的权限(rwx),同用户组的用户可能只有读取和执行权限(rx),而其他用户只有执行权限(x)。
目录权限是操作系统安全机制的重要组成部分,合理设置目录权限可以有效保护数据安全和系统稳定。
umask值
- 详细原理
- 在 Linux 系统中,umask 是一个非常重要的权限掩码机制。当创建一个新的文件或目录时,系统会使用 umask 值来确定默认的权限。
- 如前面提到的,文件的最大默认权限是 666(二进制为 110 110 110),这表示所有者、用户组和其他用户都有读写权限,没有执行权限(因为对于普通文件,一般不需要执行权限)。目录的最大默认权限是 777(二进制为 111 111 111),即所有者、用户组和其他用户都有读、写和执行权限。
- umask 的值是一个四位八进制数,不过通常写成三位,因为最左边一位几乎总是 0。它的每一位数字都代表了要从默认权限中去除(屏蔽)的权限。从右到左,第一位数字代表其他用户(Others)的权限屏蔽,第二位数字代表用户组(Group)的权限屏蔽,第三位数字代表所有者(User)的权限屏蔽。
- 每个数字所代表的权限是通过将其转换为二进制来理解的。例如,数字 4(二进制为 100)代表屏蔽读权限,数字 2(二进制为 010)代表屏蔽写权限,数字 1(二进制为 001)代表屏蔽执行权限。
- 设置 umask 值
- 临时设置:可以使用 “umask” 命令来设置当前会话的 umask 值。例如,“umask 027” 会将 umask 值设置为 027。这意味着在这个会话中创建的新文件和目录的默认权限会根据这个 umask 值来调整。
- 永久设置:要永久改变 umask 值,可以在用户的启动文件(如.bashrc 或.bash_profile)中添加 “umask” 命令。这样,每次用户登录时,都会应用这个 umask 值。不同的 Linux 发行版可能有不同的配置文件用于设置系统范围的 umask 值,这通常涉及到系统初始化脚本。
- 示例说明
- 假设 umask 值为 023。
- 对于文件:
- 从最大权限 666 开始。
- umask 的 023 中,3(二进制为 011)表示要屏蔽所有者的写权限和执行权限,2(二进制为 010)表示要屏蔽用户组的写权限。
- 计算过程为:666 - 023 = 644(rw - r - r -)。所以在这个 umask 值下创建的新文件默认权限是 644。
- 对于目录:
- 从最大权限 777 开始。
- 按照 umask 023 来计算,3(二进制为 011)表示要屏蔽所有者的写权限和执行权限,2(二进制为 010)表示要屏蔽用户组的写权限。
- 计算过程为:777 - 023 = 754(rwxr - xr -)。因此,在这个 umask 值下创建的新目录默认权限是 754。
- 实际应用场景
- 安全性考虑:通过合理设置 umask 值,可以提高系统的安全性。例如,在一个多用户环境中,如果希望限制其他用户对新创建文件的访问权限,可以设置一个较大的 umask 值,如 077。这样,新创建的文件默认只有所有者有读写权限,用户组和其他用户没有任何权限。
- 协作环境:在一个团队协作的项目中,可能希望设置一个适中的 umask 值,如 022。这样,新创建的文件默认允许所有者有读写权限,用户组和其他用户有读权限,方便团队成员之间共享和查看文件内容。
粘滞位
- 粘滞位的概念
- 在 Linux 文件系统权限中,粘滞位(Sticky Bit)是一种特殊的权限设置。它主要用于控制用户对目录的删除权限。通常情况下,一个目录如果用户有写权限(
w
权限),那么该用户就可以删除这个目录中的任何文件,而不管这个文件的所有者是谁。但是,当一个目录设置了粘滞位后,只有文件的所有者、目录的所有者或者超级用户(root
)才能删除该目录中的文件。- 粘滞位主要应用在一些共享目录中,比如
/tmp
目录。/tmp
目录是一个临时文件存储目录,多个用户都可以在这个目录下创建和使用文件。如果没有粘滞位,一个用户可能会误删或者恶意删除其他用户的临时文件。设置粘滞位后,就可以避免这种情况的发生。- 粘滞位的表示方式
- 在
ls -l
命令的输出结果中,粘滞位通过其他用户权限部分(第三位用户权限)的t
或者T
来表示。如果权限部分的第三位是t
,表示该目录设置了粘滞位,并且其他用户具有执行权限(x
);如果是T
,表示该目录设置了粘滞位,但是其他用户没有执行权限。- 例如,对于一个目录
/shared
,ls -l
的输出如下:
drwxrwxr - t 2 user1 group1 4096 Jan 1 00:00 /shared
,这里的t
就表示/shared
目录设置了粘滞位,并且其他用户有执行权限。- 设置粘滞位
- 使用 chmod 命令
- 可以使用
chmod
命令来设置粘滞位。对于目录,可以使用chmod +t [目录名]
来设置粘滞位。例如,要给/data/shared
目录设置粘滞位,可以在终端中输入chmod +t /data/shared
。- 如果要通过数字方式设置权限并且包含粘滞位,粘滞位对应的数字是
1
。在权限的数字表示中,权限是按照所有者、所属组、其他用户的顺序,每个部分用三位二进制数表示读(r
- 4)、写(w
- 2)、执行(x
- 1)权限。例如,rwxr - xr - t
对应的数字权限是755
,其中最后一位的5
(二进制101
)中的最后一位1
就表示粘滞位。所以可以通过chmod 1755 [目录名]
来设置权限和粘滞位。- 粘滞位的作用案例
- 假设在一个多用户的服务器环境中,有一个
/shared
目录,用于用户之间共享文件。用户userA
和userB
都在这个目录下有自己的文件。- 如果没有粘滞位,当
userA
对/shared
目录有写权限时,userA
就可以删除userB
在/shared
目录下的文件。这可能会导致数据丢失或者冲突。- 但是当
/shared
目录设置了粘滞位后,userA
只能删除自己在/shared
目录下的文件,而不能删除userB
的文件,除非userA
是/shared
目录的所有者或者是超级用户(root
)。这样就保证了共享目录下文件的安全性和用户之间的独立性。