我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

【Linux】Shell 命令以及运行原理+权限管理

【Linux】Shell 命令以及运行原理+权限管理 本文面向 Linux 初学者系统讲解 Shell 命令执行原理与 Linux 权限体系两大核心主题。全文目录如下Shell 基础、命令分类、运行原理、PATH 环境变量、权限管理、chmod/chown/chgrp 修改权限、umask 文件掩码、粘滞位。建议按顺序阅读并结合终端实操加深理解。一、什么是 ShellShell 是一个命令行解释器是用户和 Linux 内核之间的桥梁。用户输入命令 → Shell 接收、解析 → 调用 Linux 内核完成任务 → 把结果返回给用户现在终端里这个环境就是bashBourne Again ShellUbuntu 默认的 shell。内核kernel不能直接接收文字命令Shell 负责翻译。类比内核 工厂Shell 前台接待员你用户跟接待员说需求接待员转告工厂干活。二、Shell 命令分类两大类1. 内置命令shell builtin命令集成在 bash 程序内部不需要单独外部程序文件。特点执行快不创建新进程例子cd、pwd、echo、exit、type原理bash 自己代码里就实现了功能直接调用不用去磁盘找程序。2. 外部命令可执行程序独立的可执行文件存放在系统 PATH 路径下/bin/usr/bin你刚才用的ls、tar、apt、sudo全部都是外部命令查看命令位置type tar或者which tar比如tar本质就是/usr/bin/tar这个二进制程序。三、外部命令完整运行原理以你执行tar -cvf dirb.tar dirb举例读取命令bash 读取你敲的整行字符串tar -cvf dirb.tar dirb命令解析、分词按空格分割成tar、-cvf、dirb.tar、dirb识别命令名是tar查找程序去环境变量PATH里面的目录依次搜索找到/usr/bin/tarfork 创建子进程bash父进程调用系统函数fork()复制出一个子进程子进程几乎和父 bash 一模一样是独立新进程exec 程序替换子进程调用exec系统调用把自己的内存替换成/usr/bin/tar程序不再是 bash传入参数-cvf dirb.tar dirbtar 程序开始执行打包逻辑等待子进程结束父 bash 调用wait()卡住等待 tar 子进程运行完毕子进程退出tar 执行完子进程销毁bash 重新弹出命令提示符$等待你输入下一条命令✅ 核心一句话外部命令会 forkexec 创建子进程执行内置命令直接在当前 bash 进程运行不创建子进程。为什么cd是内置命令如果 cd 是外部命令fork 出来子进程修改目录只会修改子进程的工作目录父 bash 目录完全不变就达不到切换目录效果。所以 cd 必须内置。四、PATH 环境变量PATH是冒号分隔的目录列表外部命令就在这里查找。查看 PATHecho $PATH当你输入lsshell 依次去 PATH 里的目录找有没有ls这个可执行文件。如果命令不在 PATH 里必须写绝对路径执行例如/usr/bin/tar五、简单区分内置 / 外部命令type cd type tarcd is a shell builtin→ 内置tar is /usr/bin/tar→ 外部程序六、补充命令执行小细节命令行先做通配符展开*.txt会在传给程序前替换成所有 txt 文件名引号双引号 保留变量单引号 原样输出不解析变量;分隔多条命令ls;pwd顺序执行不管前面成功失败前面成功才执行后面mkdir test cd testLinux 权限的概念Linux 下有两种用户超级用户root、普通用户。• 超级用户可以在 Linux 系统下做任何事情不受限制• 普通用户在 Linux 下做有限的事情。• 超级用户的命令提示符是“#”普通用户的命令提示符是“$”。命令su [用户名]功能切换用户。例如要从 root 用户切换到普通用户 user则使用 su user。要从普通用户 user 切换到 root 用户则使用 su rootroot 可以省略此时系统会提示输入 root 用户的密码。一、Linux权限管理1. ⽂件访问者的分类⼈• 文件和文件目录的所有者u---User属主• 文件和文件目录的所有者所在的组的用户g---Group属组• 其它⽤⼾o---Others外国⼈2. ⽂件类型和访问权限事物属性• ⽂件类型d⽂件夹-普通⽂件l软链接类似Windows的快捷⽅式b块设备⽂件例如硬盘、光驱等p管道⽂件c字符设备⽂件例如屏幕等串⼝设备s套接⼝⽂件• 基本权限读r/4Read对⽂件⽽⾔具有读取⽂件内容的权限对⽬录来说具有浏览该⽬录信息 的权限写w/2Write对⽂件⽽⾔具有修改⽂件内容的权限对⽬录来说具有删除移动⽬录内 ⽂件的权限执⾏x/1execute对⽂件⽽⾔具有执⾏⽂件的权限对⽬录来说具有进⼊⽬录的权 限 ◦ “—”表⽰不具有该项权限字符含义作用文件作用目录rread 读查看文件内容列出目录里的文件名lswwrite 写修改 / 覆盖文件内容在目录里新建、删除、重命名文件xexecute 执行运行可执行程序 / 脚本进入目录cd二、字符表示方法长列表 ls -l执行ls -l会看到类似-rw-r--r-- 1 cl cl 123 xxx.txt权限串- rw- r-- r--第 1 位文件类型不属于权限preul-普通文件d目录l软链接第 2~4 位u 属主权限第 5~7 位g 用户组权限第 8~10 位o 其他用户权限示例拆解-rw-r--r---普通文件rw-属主可读、可写、不可执行r--组用户仅可读r--其他人仅可读字符方式修改权限 chmod# 给属主增加执行权限 chmod ux test.txt # 去掉组的写权限 chmod g-w test.txt # 给所有用户加上读权限 chmod ar test.txt # 组合写法u加xo去掉w chmod ux,o-w test.txt三、八进制数值表示方法规则r4w2x1每一类用户的权限把对应数字相加得到一个 0~7 的数字表格权限数值r--4-w-2--x1rw-426r-x415rwx4217---0三组数字依次对应u g o组合成 3 位八进制数。例子rw-r--r--u: rw- 426 g: r-- 4 o: r-- 4 权限644普通文件默认推荐rwxr-xr-xu: rwx7 g: r-x5 o: r-x5 755目录 / 可执行程序常用rwx------u:7g:0o:0 700只有所有者能读写执行八进制 chmod 修改权限# 设置为644 chmod 644 test.txt # 设置目录755 chmod 755 dirb高频背诵总结字符r w x分 u (属主) g (组) o (其他)ls -l查看。八进制r4,w2,x1三组数字u g o。文件类型位不属于权限位第一位- / d / l不是 rwx 权限。目录 x 权限控制能否 cd 进入目录。练习ls -l dirb.tar # 看dirb.tar的权限字符换算成八进制比如输出-rw-r--r--→ 644一、chown修改文件拥有者属主 user格式chown [参数] 用户名 文件名实例chown user1 f1 # 将f1的属主改为user1 chown -R user1 filegroup1 # -R 递归把目录及其内部所有文件的属主全部改成user1-Rrecursive 递归目录权限修改必备对子文件子目录生效二、chgrp修改文件 / 目录所属组 (group)格式chgrp [参数] 用户组名 文件名常用选项-R递归修改所属组chgrp users /abc/f2 # 将/abc/f2 的所属组改为 users补充chown 可以一次性同时改属主 属组写法chown user1:group1 test.txt三、umask 文件掩码作用控制新建文件、目录的默认权限原始预设最大权限新建普通文件初始上限0666rw-rw-rw-新建目录初始上限0777rwxrwxrwx实际权限公式实际权限 预设权限 ~umask通俗理解减去 umask 里有的权限系统默认root 超级用户umask 0022普通用户umask 0002umask # 查看当前掩码 umask 044 # 设置掩码为044示例普通用户 umask0002 新建文件666 - 002 664 →-rw-rw-r--新建目录777 - 002 775 →drwxrwxr-x⚠注意umask只影响新建文件已经存在的文件权限不会改变四、file 指令辨识文件类型语法file [选项] 文件/目录-c显示执行过程排错-z尝试解析压缩包内部文件类型file dirb.tar不看后缀直接读取文件头部识别真实类型Linux 不依赖扩展名五、sudo 权限分配1修改/etc/sudoers授权注意/etc/sudoers权限必须是 740不能随便改chmod 740 /etc/sudoers vi /etc/sudoers配置格式接受权限的用户 登陆主机(以哪个用户执行) 允许执行的命令列表2sudo 调用授权命令sudo -u 用户名 命令 # 示例以root身份执行useradd添加u2用户 sudo -u root /usr/sbin/useradd u2六、目录权限【重中之重极易踩坑】目录的 r/w/x 和文件的 r/w/x含义完全不一样x 执行权限能否cd进入这个目录preblockquote目录没有 x 权限就算有 r也无法进入、访问里面文件r 读权限ls列出目录内文件名前提必须有 x 权限有 x 无 r可以 cd 进目录但是 ls 看不到文件名但如果你知道文件名可以直接访问这个文件w 写权限在目录内新建、删除、重命名文件核心考点只要你拥有目录的 w 权限你就可以删除目录里面的文件不管这个文件本身有没有写权限也不管文件是谁创建的案例验证chmod 0777 /home/ # /home目录全部用户rwx touch /home/root.c # root创建文件root.c su - litao # 切换普通用户litao rm /home/root.c # litao可以直接删掉root创建的文件原因litao 对/home目录拥有 wx 权限删除文件是修改目录内容不是修改文件本身。七、粘滞位Sticky BitSBIT【考试重点】✅一句话粘滞位是目录的特殊权限专门解决目录 777 开放写权限时用户可以删除别人文件的问题。⚠粘滞位只对目录生效对普通文件基本无效。1. 核心作用给目录设置粘滞位之后 哪怕所有人对这个目录拥有w写权限目录内的文件只能被下面 3 类人删除 / 重命名文件的所有者目录的所有者root 超级用户普通用户只能删除自己创建的文件不能删除别人的文件。对应你笔记里的案例/home权限 777没粘滞位 → litao 可以删掉 root 创建的root.c如果给/home加上粘滞位就算目录是 777litao 就删不掉 root 的文件。2. 字符表示ls -ld 查看粘滞位占用其他用户 o 的 x 权限位置目录本身有 x 权限 → 显示小写t例drwxrwxrwt经典/tmp权限目录本身没有 x 权限→ 显示大写Tls -ld /tmp # 输出 drwxrwxrwt 末尾的t就是粘滞位3. 八进制表示特殊权限在最高位SUID4SGID2粘滞位 1完整 4 位权限1 777→17771代表开启粘滞位后面 3 位是 ugo 普通权限。示例chmod 1777 shared_dir含义目录权限 rwxrwxrwx 开启粘滞位。4. 设置 / 删除粘滞位命令# 符号方式推荐 chmod t shared_dir # 添加粘滞位 chmod -t shared_dir # 移除粘滞位 八进制方式 chmod 1777 shared_dir5. 典型应用/tmp 目录系统临时目录/tmp默认带粘滞位权限1777所有用户都可以在 /tmp 里新建文件但是只能删除自己的临时文件不能删除别人的6. 背诵考点粘滞位作用对象仅目录。作用共享目录开放写权限时限制用户只能删除自己的文件不能删除他人文件。字符标记权限串最后一位t有 x /T无 x。八进制1xxx最高位 1 代表粘滞位。可删除文件的三类用户文件属主、目录属主、root。7. 关联回顾删除文件看上级目录的 w 权限不是文件本身权限。无粘滞位目录 o 有 w → 任何人都可以删目录里任意文件。有粘滞位目录 o 有 w但是只能删自己的文件。八、权限总结进入目录cd 目录名必须要有目录的x可执行权限。目录的 r/w/x 和文件含义完全不一样x能不能cd进入目录最关键r进入目录后能不能用ls列出里面的文件名w能不能在目录里新建、删除、重命名文件分 4 种组合情况目录有 x无 r✅ 可以cd进入目录 ❌ls看不到文件列表 ✅ 如果你知道文件名可以直接访问这个文件比如cat test.txt目录有 r无 x你刚才 dirc 就是这个情况d----w--w-没有 x ❌不能 cd 进入目录哪怕有 r 读权限也不行 ❌ 无法访问目录里面任何文件目录有 rx✅ cd 进入 ✅ ls 列出所有文件目录有 w无 x❌ 不能 cd 进入 ❌ w 权限完全失效无法新建 / 删除文件一句话记忆口诀cd 看 xls 看 r删建看 w。没有 xr 和 w 基本都废掉
返回列表