当前位置: 首页 > news >正文

第一讲 常见的指令, 外壳与权限

1. Linux的认识

1.1. Linux的应用场景

  1. 企业后台最常用

比如淘宝的后端, 知乎文章数据来自知乎公司的服务器, 我们手机和电脑的APP称为 客户端. 一般大型公司都有自己的服务器, 而小中型企业一般是使用的是大公司的服务器. 一般服务器的操作系统是Linux, 比如centos,ubuntu

在个人电脑领域, windows + macos; 企业服务领域, Linux.

  1. 安卓手机,各种平板的操作系统

两者都是在Linux系统上进行升级改造的, 这个问题就是在08年左右谷歌对抗苹果移动智能手机的压力, 开源了Linux的移动版, 后来被国内外各个手机硬件厂商应用, 优化...现在基本所有的安卓手机的操作系统都是Linux内核, 只不过是Linux移动版(Android)的.

  1. 嵌入式领域
  2. 智能家居、汽车领域

1.2. Linux的版本问题

原因:Linux开源, 适用于不同的领域.

Linux主要分为商业版本技术版本

商业版本:指的是Linux各种满足不同上层需求的适应化版本

技术版本:指的是Linux内核版本主版本号 + 次版本号 + 修正次数,(次版本号是偶数是稳定版本奇数测试版本)并且修正次数递增满足一定条件会增加次版本号, 次版本号递增并到达一定数值的时候增加主版本号.

怎么找linux内核源代码? Index of /pub/linux/kernel/v2.6/

1.3. 操作系统的认识

操作系统的概念:是一款进行软硬件资源管理的软件其中,Linux是一款具体的操作系统的品类。

关于软硬件资源管理的理解? 便利化对硬件和软件的使用.

电脑的层状结构:

开机的本质:加载操作系统到内存中。

操作系统的意义:

  • 对下: 提供基本的管理工作,使各种硬件工作在一个稳定、高效、安全的环境之中。(手段)
  • 对上: 提供一个高效、安全、稳定的运行环境,高质量的为用户提供服务. (目的)

1.4. 常用快捷键

  1. ctrl + D 退出登录状态
  2. ALT + Enter 进入/退出全屏
  3. Table 指令补全
  4. ctrl + R 历史指令搜索
  5. ctrl + C 终止程序
  6. table两次
  7. ctrl + table 切换光标所在窗口

2. 常用指令介绍

xshell 用指令登录账号:

命令: ssh username@IPaddress

2.1. ADD

2.1.1. touch [file]

语法touch [options] [file...]

功能:更改文档或目录的日期时间,包括存取时间更改时间(touch 一个已经存在的文件会修改 ACM 时间. ) 或者 创建一个不存在的文件。

豆包 AI: touch 一个已经存在的文件会修改 ACM 时间 -> 直接理解为默认行为即可!

你的理解基本正确,但可以进一步深入和细化解释,下面为你展开分析:

从操作本质看C时间的修改

当你使用 touch 命令时,它本质上是对文件的时间戳属性进行操作。在 Linux 系统里,文件的时间戳信息(访问时间、修改时间等)是存储在文件的 i - node 中的,i - node 包含了文件的元数据,如权限、所有者、时间戳等。所以,使用 touch 命令更新时间戳这种操作属于对文件属性的修改。

由于状态改变时间(C)记录的是文件 i - node 信息发生改变的时间,当 touch 命令更新了文件的时间戳属性,也就是改变了 i - node 里的内容,那么文件的状态改变时间(C)必然会更新为当前系统时间。

从操作系统判断机制看M时间的修改

操作系统判断文件内容是否被修改,很多时候是基于文件的时间戳和 i - node 信息。虽然 touch 命令并没有真正改变文件的实际数据内容,但从操作系统的角度来看,文件的时间戳是文件信息的一部分。当 touch 命令更新了文件的修改时间,操作系统会认为文件的内容“逻辑上”被修改了。

这是因为修改时间(M)的设计初衷就是记录文件内容最后一次被修改的时间,而 touch 命令改变了这个时间戳,所以操作系统会将修改时间更新为当前时间,以此来反映文件在时间上的“修改”状态。

总结

你理解的“touch 修改的本质是属性即 C 时间,因为 OS 的判断机制间接修改了 M 时间”是合理的。touch 命令对文件的操作直接影响了文件的属性(时间戳属性),从而更新了状态改变时间(C);而操作系统基于其对文件修改的判断机制,将修改时间(M)也更新为当前时间。不过要注意,在默认情况下 touch 也会更新访问时间(A),但这可能会受文件系统挂载选项(如 noatimerelatime)的影响。

  • touch当前路径下创建一个普通文件

  • 通常, 他还可以用来改变一个文件的access时间

2.1.1.1. 文件的属性信息

在linux下, 我们可以用指令stat去查看一个文件的属性, 包含文件名, 时间等等, 这其中就包含access时间.

  • Access:文件最近被访问的时间(访问)
  • Modify : 文件内容最近被修改的时间(修改)
  • Change : 文件属性最近被修改的时间(改变)

2.1.2. mkdir [directory]

语法:mkdir [options] [dirname...]

功能:在当前目录下创建一个名叫"dirname"的目录

  • mkdir -p 创建嵌套目录

2.1.3. cp [file/directory]

语法:cp [options] [src] [dest]
功能:复制文件或目录
说明:如果dest是一个目录, 那就拷贝到这个目录下, 如果dest还带一个文件名, 那么就是拷贝到目录下并且改名字. 拷贝目录需要带-r(递归拷贝).
常用选项:

  • -f 强行复制文件或目录时,不用给询问是否的信息, 不论目的文件或目录是否已经存在
  • -i 覆盖文件之前先询问用户
  • -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

  • -R(新标准支持) 或--recursive 递归处理,将指定目录下的文件及子目录一并处理, 这个玩意跟-r是一样的, 不过可能所有的系统更加统一一些.

2.1.4. echo [file]

语法:echo "str" (> [file])

  • > 重定向符号,可以用来创建一个新文件 或者说是 清空文件 这等同于文件以写的方式打开写入数据再关闭

  • >> 追加重定向(默认是新开一行) 这等同于文件以追加的方式打开,追加数据再关闭

2.1.4.1. 重定向

输出重定向的理解: 在Linux中, 一切皆文件, 因此一般我们要输出到显示器文件的"xxx"内容, 被重定向到普通文件, 又因为是输出(写), 因此叫做输出重定向.

实际上, 文件重定向就是类似于以写的方式向里面写入一些"xxx"然后关闭, 类似于下面代码展示.

输入重定向(读): 同理, 只不过从输出(写)变成了输入(读). 一般写作: cat < 输入重定向

追加重定向: echo "xxx" >> filename

2.1.4.2. 一切皆文件

Linux一切皆文件的理解: 我们如何理解Linux中一切皆文件的模式呢? 主要是Linux可以以一种相对统一的管理模式处理各种东西, 比如对鼠标, 键盘, 显示器, 操作系统只需要对其进行写入不同的数据即可, 而对于软件, 也同样是给他读写不同的数据就可以进行方便的管理. 即使是我们自己的账号终端, Linux也是以一种文件的形式看待的. 比如 dev/pts/ 是一个模拟物理终端的设备文件.

2.2. DELETE

2.2.1. rmdir&&rm

语法rmdir [-options] [dirname]

适用对象:具有当前目录操作权限的所有使用者

功能:删除空目录

注:remdir 只能删除空目录的命令

-p 当父目录也变成空目录的话,连带父目录一块删除。

rm命令可以同删除文件或目录

语法:rm [-f -i -r -v][dirname]

适用对象:所有使用者

  • -f 强制删除,无需询问确认, 是无需确认哦
  • -r 删除该目录下的所有文件, 删除一个目录需要带上这个选项

  • -i 删除前需要确认

注:rm删除是彻底删除,找回难度大。

* 通配符...

2.2.2. 关机(几乎用不到)

语法:shutdown [options]

  • -h 系统服务停掉,立即关机
  • -r 系统服务停掉,重新启动(实测下来默认 1 分钟之后重启关机)
  • -t sec 设定sec秒后关机

一般不建议关闭云服务器.

2.3. FIND

2.3.1. whoami [user]

语法:whoami [user]

功能:查看使用Linux的人

2.3.2. pwd [working path]

· pwd 查看当前所处路径

2.3.2.1. 路径

路径是个啥?

/:斜杠, Linux的路径分隔符

\:反斜杠, Windows的路径分隔符

路径的意义: 系统层面标识一个特定的文件,标识一个文件的唯一性,这个类似于每个人所对应的身份证号一样。

路径的分类:

  • 绝对路径: 上面两个截图都是绝对路径.

  • 相对路径 其中,···就是一种相对路径,通常是用作当前文件路径的定位。
    • ..就常常被用作回到上一级目录

    • .一般就是方便执行本目录下的可执行文件...

Linux下的目录结构: 一个多叉树.

比如某个路径: /home/bit/test.c

2.3.3. stat [file]

语法:stat [file]

功能:查看指定文件名的详细属性

ACM时间:

  • access time:表示最后一次访问(仅仅是访问,没有改动)文件的时间。
  • modify time:表示最后一次修改文件内容的时间。
  • change time:表示最后一次对文件属性改变的时间,包括权限,大小,属性等等。

2.3.4. ls [file/directory]

语法:ls [options] [file/directory]

  • ls 查看当前路径下的文件名属性
  • -a 列出目录下的所有文件,包括隐含文件

  • -d 仅显示指定目录的属性信息, 而不是显示目录里面的内容

比如说, 我们仅仅想看一下这个目录的属性, 而不是看目录里面有什么内容, 一般情况下, 我们ls 111就是查看的目录的内容, 如果我们想看目录本身的属性, 可以后面加个-d选项, 即ls -d 111

  • -l 列出该文件的详细信息, 即文件的所有属性(常用)

  • -1 一行输出一个文件
  • -R 列出所有子目录下的文件(递归)
  • ls data*1 此处号是通配符的含义,标识查明以data开头,1结尾的数据。
2.3.4.1. 知识点补充: 文件的理解

文件 = 文件属性 + 文件内容

理解: 无论是文件属性还是文件内容都属于数据, 都需要保存在计算机内部进行存储.

注:这里的文件属性也属于数据,也需要占用空间,存储起来也需要占用硬盘空间的。

隐藏文件: linux中, 以点开头的命名的文件叫做隐藏文件.

比较典型的两个隐藏目录, 一个是·, 当前路径; 另一个是··上一级路径

这个玩意类似于windows的退回到前一级目录的按钮:

2.3.5. which [Instruction Path]

语法:which [instruction]

功能:打印出指定指令所在的系统路径

2.3.5.1. 指令是什么?

指令, 可执行二进制文件, 程序都是一种东西, 都是可以被计算机运行的代码而已. 也属于文件的一种, 因此指令 = 文件内容 + 文件属性.

因此安装和卸载在做什么? 安装就是把可执行程序文件拷贝到计算机中, 卸载就是把可执行程序文件在计算机中删除.

2.3.5.2. alias 指令

alias 是给另一个指令取别名

比如上图, ll指令就是ls -l --color=auto这条指令的别名

当然, 我们自己也可以用alias给其他指令取别名. 比如我把回到上一层目录的指令cd ..取名为back

2.3.6. man [instruction]

Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是man

语法: man [options] instruction

注: man默认情况下从上往下进行查找. 对于man的使用, 主要是用来查2号手册, 即系统调用.

man-pages的安装:

yum -y install man-pages

2.3.7. find [file]

语法:find [path] [-name] [filename]

find命令主要是可以用来查找某个文件的, 主要针对的是文件, 而which是针对的是指令.

2.3.8. cat [file] 适用于比较短的代码

语法:cat [options] [file]

功能:查看目标文件的内容

  • -b 对非空输出行编号
  • -n 对所有行输出行编号
  • -s 不输出多余空格
  • tac 反向打印输出代码信息
  • [无] 默认从键盘读数据,然后回显到显示器上

cat 如果直接写, 后面不写filename, 那么就是默认从键盘文件中读数据然后回显给显示屏文件. 这个可以结合输入重定向来理解.

2.3.9. more [file]

语法:more [options] [file]

功能:功能类似cat

  • -n 对输出的所有行进行编号
  • q 退出more
  • / 查找

为了方便演示效果, 我们可以写一个大文件:

i=1; while [ $i -le 10000 ]; do echo "hello linux : $i"; let i++; done >> big.txt

2.3.10. less [file]

语法:less [file]

功能:查询文件

与之相似的是:less,head,tail

管道:[资源] | [拿取],一般用于指令集联

继续前面more的例子, 我们可以用less进行查看:

查看日志:

less /var/log/

2.3.11. head -line

该命令可以查看一个文件中的前几行...

2.3.12. tail -line

该命令可以查看一个文件中的后几行

2.3.12.1. 管道 |

如何拿到一个文件的中间一部分内容呢? 比如拿到8000到8010行代码:

方法很简单, 可以先搞一个head -8010放到temp.txt文件中, 然后再看该文件的最后十行即可.

当然, 这种方法比较挫, 所以我们可以借用管道去传递数据.

2.3.13. wc [filename]

wc -l, 用来查看一个文件多少行.

  • 3: 行数
  • 5: 文件单词数
  • 25: 字节数
  • test: 文件名

2.3.14. tree [directory]

  • tree 以树状结构对目标目录进行展现

tree的安装:

yum install -y tree

2.3.15. grep [document content]

语法:grep [content] [filepath]

  • -v 不包含 content 的信息(反向选择)
  • -i 忽略大小写
  • -n 带行号

grep命令会读取文件内容, 然后按关键字过滤内容, 类似于我们windows中的ctrl + f.

2.3.16. cal [calendar]

cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。

语法:cal [options] [month] [year]

功能:用于查看日历等时间信息,如只有一个参数,则标识年份(1-9999),如有两个参数,则标识月份和年份

  • -3 显示系统最近三个月

  • -j 显示在当年中的第几天

  • -y 显示当前年份的日历

2.3.17. date [time]

语法格式:date [option] [format]

功能:显示时间

2.3.17.1. TimeFormat
  • %H 小时
  • %M 分钟
  • % S秒
  • %X == %H:%M:%S
  • %d
  • %m
  • %Y
  • %F == %Y-%m%d

2.3.17.2. 时间的重要性

时间是计算机中非常重要的概念.

这里涉及到一个概念, 叫做时间戳.

时间戳定义的意义在于: 统一全球时间, 方便网络传播发展.

2.3.17.3. SetTime
  • date-s 设置当前时间,只有root权限才能设置,其他只能查看。
  • date-s20080523 设置成20080523,这样会把具体时间设置成空00:00
  • date-s 01:01:01 设置具体时间,不会对日期做更改
  • date-s"01:01:01 2008-05-23" 这样可以设置全部时间
  • date-s"01:01:01 20080523" 这样可以设置全部时间
  • date-s"2008-05-23 01:01" 这样可以设置全部时间
  • date-s"2008052301:01" 这样可以设置全部时间
2.3.17.4. Timestamp

时间 -> 时间戳:date +%s

时间戳 -> 时间:date -d@[时间戳]

注:unix时间戳(英文为unix epoch,unix time,posix time或unix timestamp) 是从1970年1月1日(utc/gmt的午夜)开始所经过的秒数,不考虑闰秒。

2.3.18. bc

作用:用来处理基本的运算,Linux下的基本计算器

用法:echo 1+2+3+4+5+6+7 | bc

2.3.19. uname

语法:uname [options] 

功能: uname用来获取电脑和操作系统的相关信息。

补充说明:uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。

常用选项:

  • -a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称
  • -r 内核

2.3.19.1. 知识普及: CPU架构

CPU架构, 一般分为x32和x64,

x86, 即x32

x86_64, 即x64

2.3.19.2. linux版本信息

查看操作系统版本信息

通常, 我们可以在linux中可以直接查看linux系统版本, 这个信息一般存放在/etc/redhat-release文件中.

cat /etc/redhat-release

查看CPU相关信息

cat /proc/cpuinfo

查看内存信息

cat /proc/meminfo

2.3.20. 查看版本信息

cat /proc/meminfo 查看内存信息

cat /proc/cpuinfo 查看cpu信息

2.4. MODIFY

2.4.1. cd [directory]

语法cd [directory]

功能:Change Directory, 改变工作目录

  • cd ·· 返回上一级目录
  • cd 绝对/相对路径 进入指定的路径的目录
  • cd - 跳转到最近的一次路径下

  • cd ~ 进入用户的家目录

    其中, 用户目录下都有自己的桌面\音乐\文档\图片等等属于每个用户的文件夹, 只不过windows把桌面文件夹里面的内容以图形化的形式呈现出来了而已...

2.4.1.1. 用户

用户: 普通用户和超级管理员用户

默认登陆位置: 用户默认登陆位置是所属自己的家目录.

权限: 在Linux下, root是超级管理员账号, 拥有高于操作系统的权限. 而普通用户的权限较小.

2.4.2. mv [file/directory]

用来移动文件或者文件改名。

语法:mv [options] [src] [dest]

  • 当第二个参数是文件名时,mv完成重命名操作。
  • 第二个参数是目录时,mv完成移动操作,其中操作文件或者目录可以有多个。

  • -f 不在询问,直接覆盖
  • -i 若目标文件已经存在,询问是否进行覆盖

2.4.3. clear [Screen]

  • clear 清屏

2.4.4. zip/unzip [file/directory]

语法:zip [options] [destfile.zip] [srctfile...]

功能:将目录或文件压缩成zip格式

  • -r 递归处理,将指定目录下的所有文件和子目录一并处理

需要注意的是, 如果不写-r, zip就只会打包压缩一个空目录...

语法:unzip [filename]

  • -d 指明解压路径

打包和压缩?

实际上, 打包和压缩是两个部分. 打包就是我们把一系列文件"打包"在一起, 就是放在一块, 这样发送文件的时候就很方便, 就不用一个一个发大量文件了.

而压缩呢? 就是把文件尽可能地把文件空间压缩一下, 就是把之前没压缩之前很大地文件, 压缩后可能就变小了很多, 这样很方便地发送.

为什么要打包和压缩?

  • 缩小体积, 下载速度加快. 减轻网络负担, 提高用户体验.
  • 减少文件丢失的可能性.

2.4.5. tar

语法:tar [options] [xxx.tgz] [file/directory]

  • -c 建立一个压缩文件
  • -x 解开一个压缩文件
  • -t 查看tarfile里面的文件
  • -z gzip压缩
  • -j bzip2压缩
  • -v 压缩过程显示文件
  • -f 后直接加档名
  • -C 解压到指定目录

常用组合:czf 压缩 xzf 解压

怎么理解这个组合呢? c就是creat, z就是压缩的意思, f就是file后面紧跟形成新文件的名字. 其中后面可以带-v, 就是加上压缩/解压的过程.

如果想要解压呢? 很简单, 把-c换成-x选项就可以了. 十分简单. 想要压缩几个文件就后面跟上几个文件就行了.

如果想要解压到指定目录呢? -C 解压到指定目录

2.4.5.1. 压缩包的网络传递
2.4.5.1.1. linux与本地windows文件传递

我们在Linux上建立的文件, 可以传到我们本地windows平台, 需要用到一个工具叫lrzsz, 具体去参见下一节内容的linux基础开发工具来看就好. 下面进行实践:

不过这里需要说一下相关的指令, rz, 就是receive zmodem, 就是接收文件; sz, 就是send zmodem, 即发送文件的含义.

2.4.5.1.2. 两台linux机器文件互传

同样, 我们也可以把一台linux上的文件发送给另一台linux机器上.

需要用到scp网络拷贝命令, 指令格式是:

scp filename username@publicNetworkAddress:/folder

2.4.6. sz rz [xxx.zip/xxx.tgz]

该命令依赖于工具lrzsz

rz的含义是receive zmodem, zmodem是一种协议, 而sz是一种send zmodem, 具体的详情还是见下一节内容.

  • sz 下载到本地
  • rz 上传到云服务器
  • scp Linux机器之间的文件传输

3. shell命令以及运行原理

3.1. 是什么?

//shell外壳
/usr/bin/bash

从技术角度,Shell的最简单定义:命令行解释器(command Interpreter),常见的shell程序是命令行图形化界面。其中,shell是对外壳程序的总称,bash是具体化的一个外壳程序。

外壳程序是什么? 外壳程序也属于软件, 是包裹在操作系统外部的, 更接近于用户的一层软件层面, 这个软件层对于指令而言就是命令行解释器, 它将用户的命令翻译给操作系统(内核)进行处理, 同时, 将内核的处理结果返回给用户.

对于外壳的名称来说, shell指的是所有外壳程序的总称, 而bash, sh, 指的是一个特定的外壳程序.

3.2. 为什么?

为什么要存在外壳程序?

  • 建立用户与内核的联系。将使用者的命令翻译给核心(kernel)处理。同时,将核心的处理结果翻译给使用者。
  • 对用户请求进行合法检查,变相一定程度上保护了操作系统内核。

3.3. 怎么办?

shell外壳是怎么处理用户请求的呢? 对于一些非法命令是怎么进行处理呢?

创建子例程进行执行 对于真正的shell, 只在等待用户结果, 每次去进行命令, shell都会生成一个进程去处理, 这主要是应对用户的可能存在问题的指令从而避免shell的崩溃.

4. 权限

4.1. 权限是什么?

所谓权限的概念, 只不过是通过一定的标准或者条件, 去限制一部分人禁止通过, 而让另一部分人允许通过. 即访问某种资源是否被允许。eg:vip、门禁、

权限一般由两部分组成, 一种是人的角色, 另一种是事物的属性, 比如说, 你是否是爱奇艺会员? 因为你有爱奇艺VIP会员这个角色, 才能够观看VIP电影, 之后爱奇艺只能够提供观看影视, 观看直播等待服务, 不能提供旅行吃饭等服务, 因此说还与事物的属性有关, 因为爱奇艺只有视频方面的服务嘛..., 不过请注意, 权限关注的不是哪个人, 而是人的角色, 是否是公司的员工? 是否是VIP会员身份? ...

权限的本质:人的角色 + 事物属性

4.2. Linux中的权限??? 角色+文件属性

对于Linux, 也是对人的角色和事物属性起作用的, 对于人的角色来说, 就被分为了 超级管理员身份 和 普通用户身份, 对于前者最典型的特征就是基本不受权限的约束, 而对于后者权限会比较小.

4.2.1. Linux中的人? 与身份转换

Linux有两种人:

  • root 超级管理员
  • 普通用户

4.2.1.1. 普通用户 -> 超级管理员
//方式1: 
su
//方式2: 
su -

有两种方式, 基本上是等价的, 但是略微有点区别, 区别在于su -这种方式是以root做重新登录, 进入会直接到root家目录. 而su是身份原地升级, 变成root, 工作路径不会发生改变.

需要注意的是, 普通用户变成超级管理员需要输入root密码.

指令提权:

为什么sudo输入的是普通用户的密码?

想要进行sudo提权, 需要root超级管理员把普通用户添加进白名单里, 需要添加后的普通用户才可以进行sudo提权.

4.2.1.2. root -> 普通用户
su name

root账号可以直接变成任意已经存在的用户, 不用输入密码.

身份回退?

两种方式, ctrl + d 或者 exit指令

4.2.2. Linux中角色

针对于文件, 账号被分为三类角色, 即具体的角色需要具体的人来充当,扮演:

  • 拥有者
  • 所属组:其意义在于,在团队协作方面,更好的进行权限管理。
  • 其他人(other)

为什么要有 组 的概念? 在多人协作的时候, 更好的进行权限管理.

4.2.3. 文件权限值的表示方法

文件的属性分为三种, 即读r\写w\可执行x, 三三为一组, 分别对应拥有者, 所属组, 和其他人的权限对应. 其中文件属性的第一个字符, d(再上图中)表示文件属性是目录, 或者-表示普通文件...

以任意一组来看, 第一个字符是否具有读权限, 第二个字符表示是否具有写权限, 第三个字符表示是否具有可执行权限.

我们描述一个文件的权限时, 需要先说对应的人(角色), 再说对应的文件属性权限. 以上面例子来说, ..文件对于拥有者来说, 具有读权限和可执行权限, 对于所属组来说也是具有读和可执行权限而对于其他人也是具有读和可执行权限.

  • d 代表目录文件
  • - 代表普通文件
  • 共分为三组,第一组对应所属人权限、第二组对应所属组权限、第三组对应其他人权限
    • 第一个字符,标识读权限 是r否-
    • 第二个字符,标识写权限 是w否-
    • 第三个字符,标识执行权限 是x否-

4.3. 权限的修改

权限的修改有两种方法,一是修改文件的权限,二是修改人物的角色即可。

4.3.1. 第一种做法: 修改文件权限

修改权限的第一种方法就是修改文件的属性权限即可.

语法:chmod [Role] [+/-] [Permissions] [filename]

功能:设置文件的访问权限

  • R-> 递归修改目录文件权限
  • 用户表示符+/-=权限字符
  • +:向权限范围增加权限代号所表示的权限
  • -:向权限范围取消权限代号所表示的权限
  • =:向权限范围赋予权限代号所表示的权限
  • 用户符号:  
  • u:拥有者
  • g:拥有者同组用
  • o:其它用户
  • a:所有用户语法

下面是一些示例:

文件权限属性与角色的关系:

  • 对于文件权限的设置, 可以由 拥有者/root 进行权限设置.

  • 即使是 拥有者, 如果没有给自己设置权限, 自己也是读/写/执行不了的. (root除外)

  • 对于人, Linux角色匹配只识别最近一个, 比如说, 如果一个人既属于拥有者, 所属组, 那么linux只匹配拥有者.

    注意:Linux系统对用户进行识别的时候,只识别一次。如果一个人既属于所有者但没有权限,又属于所有组有权限,那么该人也不能进行文件操作。

实际上, 针对于上面权限, 也有一种八进制数字表示范围:

  • chmod [Role] [0xxx] [filename]

比如, 如下所示:

权限的意义:维护文件针对于普通用户的一般安全性。

除了修改文件属性权限之外, 我们还可以修改文件的拥有者, 所属组等等...即:

下面进行详细谈论:

4.3.2. 第二种做法: 修改文件角色

语法:chown [参数] [用户名] [文件名]

功能:修改文件的拥有者

语法:chgrp [参数] [用户组名] [文件名]

功能:修改文件或目录的所属组

  • -R 递归修改文件或目录的所属组

注意:

  • Linux支持修改角色的功能, 即修改一个文件的所属人, 所属组...
  • 普通用户想要把自己的文件给别人, 需要root权限或者暂时指令提权也可以. 这个问题就是对应现实生活中给别人一个东西需要征得别人同意. 在linux中用root修改对于一个文件的角色即是强制修改.

4.4. 文件类型

4.4.1. Linux下文件类型的标识

对于Linux系统,是通过文件属性中的第一列文件属性标识符来进行区分文件类型的,而不是通过文件后缀名。但是需要注意的是,Linux系统内的其他东西,比如gcc需要后缀进行区分文件类型。

  • - 普通文件:包括文本文件、可执行程序、库等都叫做普通文件
  • d 目录文件
  • b 块设备文件 eg:磁盘, 举例ll dev/vda/这是第一块虚拟内存

  • c 字符设备文件 eg:终端\显示器

  • p 管道文件 mkfifo pipo 创建管道文件

  • l 链接文件 eg:快捷方式

建议: 我们对于Linux文件后缀的态度, 尽量带, 因为有些软件需要后缀使用, 而且也适合于我们windows的习惯.

4.4.2. 文件的可执行权限

文件的可执行权限: 文件的可执行权限是什么意思呢? 下面进行详细讨论.

  • 文件并不是有可执行权限就能够执行, 还看这个文件是否本身就是可执行的.

  • 可执行 = 可执行权限 + 文件本身可执行.

4.4.3. 目录的权限

  • 目录的权限(经典的面试题).
    • x权限:进入一个目录
    • r权限:查看指定目录内的文件信息
    • w权限:能否在指定目录进行新建、删除、修改文件
    • 目录的读权限就是能否查看目录内有那些文件

    • 目录的写权限就是能否增删改目录内的文件

    • 目录的可执行权限就是是否能够进入目录内

如何理解上面内容呢? 我们之前说文件 = 内容 + 属性, 目录也是一种文件, 毕竟Linux一切皆文件, 那么目录的内容是什么? 目录里面所有文件的属性信息, 目录的属性是什么? 也与普通文件一样, 也都是文件权限属性\修改时间,所属人,所属组...

4.4.4. 默认权限的由来? 合理性?

默认权限设置的合理性?

普通文件的默认权限: 0666

目录文件的默认权限: 0777

Centos 7为例, 默认的权限掩码:

mask = 0002

然后计算机权限是如何确定的呢? 公式: 最终权限 = 起始权限 & (~umask)

umask的默认值在不同平台可能存在差异, 不过可以umask自己设置.

然后我们可以运算一下:

666 -> 110 110 110

002 -> 000 000 010

~002-> 111 111 101

& -> 110 110 100 (即我们现在创建一个文件的默认权限: 664)

4.4.5. 删除目录内的文件取决于目录的写权限.

易错点: 为什么我们普通用户可以删除超级用户的文件???

答:删除一个文件与目标文件没关系。而与其所在的目录有关系。删除一个文件就等于修改目录的内容.

4.4.6. 共享文件? 多个用户共同共享?

如果我们需要建立一个共享文件,来被共同访问,应该怎么建立?

首先这个文件不能在自己家目录里建文件。我们只能在系统的非用户目录下进行创建。为啥? 因为只有用户自己有权限, 其他人根本进不去.

把新建目录的组权限放开,然后把该目录设置为粘滞位(o-w,,任何人都可以建立文件,但是只有文件所有者把文件删除掉)。

粘滞位

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由

  1. 超级管理员删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除

即, chmod +t cataloguename

相关文章:

  • 北京工作周期7,8,9,10
  • [2025CVPR]确定性图像转换新突破:双逼近器布朗桥模型(Dual-approx Bridge)技术详解
  • 条件语句易错点
  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 信息设计漫谈
  • STM32入门学习之系统时钟配置
  • 【论文阅读】YOLOv8在单目下视多车目标检测中的应用
  • 第12篇:数据库中间件日志设计与追踪系统落地实践
  • 【HarmonyOS5】掌握UIAbility启动模式:Singleton、Specified、Multiton
  • 相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
  • 基于安卓的线上考试APP源码数据库文档
  • 分享今天做的力扣SQL题
  • vue项目使用svg图标
  • python生成器
  • Linux --进程控制
  • NVM常用命令记录
  • opencv学习笔记2:卷积、均值滤波、中值滤波
  • 【数据结构与算法】从广度优先搜索到Dijkstra算法解决单源最短路问题
  • Linux权限探秘:驾驭权限模型,筑牢系统安全
  • 主流嵌入式Shell工具性能对比
  • 视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲
  • 学做古典家具网站/百度快照优化培训班
  • 培训机构网站设计/qq空间刷赞推广网站
  • wordpress php版本/广州seo培训
  • 做快递网站制作/网站优化靠谱seo
  • 手机网站设置方法/优化关键词的公司
  • 帝国cms做网站/仿站定制模板建站