Shell运行原理与Linux权限 📅 2026/7/29 6:35:31 个人主页小小、码农的 CSDN 博客系列方向linux系统学习宣言行动胜于空谈实践出真知学完本文你应该能够看懂下面这张图中的命令提示符和文件权限信息。1 Shell运行原理1.1 Shell是什么我们平时使用Linux接触最多的是命令行。但命令行并不是Linux内核本身用户也不能直接操作内核。在用户和内核之间还有一层外壳程序。这层外壳程序就是Shell。Shell最简单的定义是命令行解释器它主要完成两件事接收并解析用户输入的命令将程序的执行结果显示给用户。所以我们输入的命令并不是直接交给内核而是先由Shell解析再交给系统执行。Windows中的图形界面也是一种外壳程序。我们双击文件夹时并不是直接操作Windows内核而是通过图形界面完成操作。Linux中的Shell也是同样的道理只不过交互方式从“点击”变成了“输入命令”。注意Shell是外壳程序的统称常见的Shell有bash、sh、zsh等。Ubuntu中通常使用Bash可以通过下面的命令查看当前用户的默认Shellecho$SHELL1.2 Shell如何执行命令当我们输入ls -l时Shell会先解析出命令名ls和选项-l再判断这条命令应该怎样执行。像cd这样的命令属于Shell内建命令需要由当前Shell直接执行。因为cd要改变的就是当前Shell所在的目录如果放到子进程中执行子进程退出后当前Shell的目录不会发生变化。像ls、cp这样的外部命令Shell通常会创建一个子进程来执行。子进程结束后Shell本身仍然存在并继续等待下一条命令。这也解释了一个常见现象某个程序即使运行失败终端一般仍然可以继续使用因为出问题的是子进程而不是Shell本身。tips:有关子进程问题我们会后面会详细介绍这里你可以理解为子进程是bash的代工厂1.3 命令提示符Shell等待用户输入命令时会显示命令提示符。lenovoLAPTOP-V44L1625:~/code$这段提示符可以拆成四部分lenovo当前用户名LAPTOP-V44L1625主机名~/code当前工作目录其中~表示当前用户的家目录$普通用户的命令提示符。如果当前用户是root提示符通常为#。2 Linux用户权限2.1 root用户与普通用户Linux是一个多用户操作系统。为了防止普通用户随意修改系统文件Linux将用户分为root用户和普通用户。root用户超级用户UID为0可以完成绝大多数系统管理操作普通用户只能在系统授予的范围内进行操作。root用户的命令提示符通常为#普通用户的命令提示符通常为$。查看当前用户whoami查看当前用户的UID和所属组idroot的权限很高但这也意味着一次误操作可能影响整个系统。日常使用时应该尽量使用普通用户需要管理员权限时再进行提权。2.2 创建与删除普通用户在Ubuntu、Debian等系统中可以使用adduser创建普通用户。语法adduser 用户名功能创建用户并为其设置密码和家目录。如果只需要修改某个用户的密码可以使用passwd用户名普通用户的家目录通常位于/home/用户名。进入/home目录后就可以看到已经创建的普通用户目录。删除用户及其家目录userdel-r用户名注意-r会同时删除用户的家目录执行前要先确认目录中没有需要保留的文件。2.3 用户切换有时当前用户的权限不够需要切换到另一个用户完成操作这时可以使用su命令。语法su用户名功能切换到指定用户。从普通用户切换到root时用户名root可以省略su从普通用户切换到其他用户时需要输入目标用户的密码。root切换到普通用户时通常不需要输入普通用户的密码这也体现了root的高权限。su还可以写成su -二者的区别是su 用户名主要完成身份切换通常会保留当前目录和部分环境su - 用户名相当于目标用户重新登录会加载目标用户的登录环境并进入其家目录。如果想切回上一个Shell可以执行exit也可以按CtrlD。值得一提的是如果你使用的是wsl的ubuntu你是无法使用su的因为被默认禁用了那你该如何切换到root呢sudo-i2.4 指令的短暂提权假设当前是普通用户现在需要向/usr/bin目录写入文件。由于该目录通常属于root普通用户会被系统拒绝。难道每执行一条管理员命令都要先切换到root吗当然不用。如果只想提升当前命令的权限可以使用sudo。语法sudo要执行的命令功能临时提升当前命令的权限。使用sudo时通常输入的是当前用户自己的密码而不是root密码。那是不是任何普通用户都能通过sudo获得管理员权限并不是。系统会根据/etc/sudoers中的规则进行判断只有被授权的用户才能使用sudo。Ubuntu中通常把可信用户加入sudo组sudousermod-aGsudo用户名如果需要修改sudo规则应使用sudovisudovisudo会在保存前检查语法。直接修改/etc/sudoers一旦写错可能导致sudo无法使用。3 Linux文件权限前面讨论的是“当前用户是谁”接下来讨论“这个用户能对文件做什么”。Linux中的文件权限需要同时考虑访问者的身份和文件允许的操作。3.1 文件访问者的分类对于一个文件访问者可以分为三类uuser文件拥有者ggroup文件所属组oothers其他用户。为什么有了拥有者和其他用户还要再增加一个所属组假设一个项目由多名成员共同开发。如果只区分拥有者和其他用户那么文件一旦向“其他用户”开放项目外的人也可能获得相同权限。有了所属组就可以只把权限开放给同组成员而不必开放给所有人。因此所属组主要解决的是多用户之间的协作问题。3.2 查看文件权限使用ls -l或ll可以查看文件的详细信息。文章开头的截图中有这样一行drwxr-xr-x 7 lenovo lenovo 4096 Jul 27 20:07 summer_cpp_linux/其中开头的drwxr-xr-x就是文件类型和权限d | rwx | r-x | r-x │ │ │ └── 其他用户权限 │ │ └──────── 所属组权限 │ └────────────── 拥有者权限 └────────────────── 文件类型第一个字符表示文件类型常见的文件类型有-普通文件d目录l符号链接。后面的9个字符每3个为一组依次表示拥有者、所属组和其他用户的读。写、执行权限。继续看后面的字段drwxr-xr-x 7 lenovo lenovo 4096 Jul 27 20:07 summer_cpp_linux/ │ │ │ │ │ │ 权限 拥有者 所属组 大小 最后修改时间 文件名3.3 Linux如何确定使用哪组权限假设某个文件的拥有者和所属组都是lenovo。当用户访问该文件时系统会按下面的顺序确定权限当前用户是文件拥有者使用拥有者权限当前用户不是拥有者但属于文件所属组使用所属组权限前两项都不满足使用其他用户权限。权限只确定一次。例如一个用户既是文件拥有者又属于文件所属组系统仍然只看拥有者权限。即使拥有者没有读权限而所属组有读权限也不会再使用所属组权限。3.4 文件的rwx权限对于普通文件rread读取文件内容wwrite修改文件内容xexecute将文件作为程序执行。没有某项权限系统就会拒绝对应操作。例如没有r权限就不能读取文件内容没有w权限就不能修改文件内容。这里还要注意x权限。给文件增加x只表示系统允许执行它并不代表这个文件一定能够正确运行。文件本身还需要是有效的可执行程序或脚本。3.5 目录的rwx权限rwx作用于目录时含义发生了变化r查看目录中的文件名w在目录中创建、删除或重命名条目x进入目录并访问目录中的文件。目录权限一般需要组合使用。正常查看目录通常需要rx在目录中创建或删除文件通常需要wx。有一个很容易弄错的问题删除文件需要文件本身的w权限吗答案是不需要。删除文件修改的是父目录中的记录所以能否删除一个文件主要取决于父目录是否具有wx权限。下面直接用一个测试目录验证。开始时将目录权限设为700即只有拥有者具有rwx权限。每组测试前先恢复700再单独去掉一项权限避免不同权限互相干扰。去掉r权限去掉拥有者的r权限后目录还保留wx此时ls无法列出目录内容因为读取目录中的文件名需要r权限。但cd、touch和rm仍能执行因为进入目录需要x创建和删除文件需要wx。去掉w权限恢复目录权限后再去掉拥有者的w权限。此时目录保留rxls和cd可以正常执行但touch和rm失败。原因很直接查看目录需要rx而创建或删除文件需要wx。缺少w目录中的条目就不能被修改。去掉x权限最后恢复目录权限并去掉拥有者的x权限。此时目录只保留rw此时ls仍能读出目录中的文件名但cd、touch和rm都会失败。因为x控制目录的进入和访问没有x即使拥有r和w也无法正常操作目录中的文件。这组实验也说明目录权限不能拆开死记。查看目录通常需要rx修改目录内容通常需要wx其中x是访问目录的基础。3.6 使用chmod修改文件权限文件拥有者和root可以使用chmod修改文件权限。字符修改法语法chmod[角色][操作][权限]文件名角色u拥有者g所属组o其他用户a所有用户。操作增加权限-移除权限重新设置权限。例如chmodux test.shchmodg-w test.txtchmodor test.txtchmodurw,gr test.txt8进制修改法每组权限只有r、w、x三个位置每个位置只有“有权限”和“无权限”两种状态因此可以使用数字表示r 4 w 2 x 1将一组中存在的权限相加rwx 4 2 1 7 rw- 4 2 6 r-x 4 1 5 r-- 4 4 --- 0三位数字依次对应拥有者、所属组和其他用户chmod644test.txt# rw-r--r--chmod755test.sh# rwxr-xr-xchmod700private.sh# rwx------chmod 777会给所有用户开放全部权限。它虽然简单但也可能把本不该开放的写权限交给其他用户因此不能把它当成解决权限问题的固定写法。3.7 修改文件的拥有者和所属组chmod修改的是访问权限。如果要修改文件属于谁需要使用chown或chgrp。修改拥有者sudochown新拥有者 文件名同时修改拥有者和所属组sudochown新拥有者:新所属组 文件名只修改所属组chgrp新所属组 文件名普通用户通常不能随意把文件的所有权转交给别人所以chown往往需要管理员权限。此处补充截图使用ls -l对比执行chown前后的拥有者和所属组。3.8 文件的默认权限与umask新建文件和目录时它们的权限还会受到umask影响。普通文件的基础权限通常为666目录的基础权限通常为777最终权限可以理解为基础权限 (~umask)。查看当前umaskumask假设umask为022普通文件666 → 644即 rw-r--r-- 目录 777 → 755即 rwxr-xr-x这里进行的是按位屏蔽不能简单理解成普通的十进制减法。此处补充截图查看umask再新建文件和目录使用ls -ld验证默认权限。3.9 粘滞位假设有一个共享目录它的权限为777所有用户都可以在里面创建和删除文件。这样虽然方便协作但用户A也可能删除用户B创建的文件。为目录增加粘滞位chmodt 目录名也可以使用数字写法chmod1777目录名设置后目录权限的最后一位会显示为tdrwxrwxrwt此时通常只有文件拥有者、目录拥有者和root可以删除文件。系统中的/tmp目录就是最常见的例子。此处补充截图执行ls -ld /tmp标出权限末尾的t。4 权限问题的排查遇到Permission denied时先不要急着使用sudo更不要直接执行chmod 777。可以先检查下面几项whoami# 当前用户id# 当前用户所属的组ls-l文件# 文件的权限、拥有者和所属组ls-ld目录# 目录本身的权限排查时依次判断当前用户是拥有者、所属组成员还是其他用户当前操作需要r、w、x中的哪一种权限这次操作由文件权限控制还是由父目录权限控制应该修改权限还是修改拥有者或所属组。回到文章开头的截图drwxr-xr-x 7 lenovo lenovo 4096 Jul 27 20:07 summer_cpp_linux/现在可以读出它是一个目录拥有者和所属组都是lenovo拥有者可以查看、进入和修改目录所属组与其他用户可以查看和进入目录但不能在其中创建或删除文件。