Linux笔记
第一章 首次登录和在线求助
1、在命令行模式下执行命令
- 【Tab】(连按两次):具有“命令补全”和“文件补全”的功能,它可以避免我们打错命令或文件名。
- 【Ctrl】+c:中断目前的程序
- 【Ctrl】+d:可直接离开命令行模式
2、在线求助man page和info page
1 | 用户在shell环境中可以操作的命令或可执行文件 |
2 | 系统内核可调用的函数与工具 |
3 | 一些常用的函数与函数库 |
4 | 设备文件的说明,通常在/dev下的文件 |
5 | 配置文件或者是某些文件的格式 |
6 | 游戏 |
7 | 惯例与协议等 |
8 | 系统管理员可用的管理命令 |
9 | 跟kernel有关的文件 |
3、正确的关机方法
第二章 Linux的文件权限与目录配置
1、Linux文件权限概念
- 数字类型改变文件权限 各权限分数对照表:r(4)、w(2)、x(1),如文件权限为 [-rwxrwx---],该文件的权限数字就是770
- 符号类型改变文件权限 通过u,g,o来代表user,group,others3种身份的权限,a代表全部身份
- r:可读文件的内容
- w:可编辑、新增或者修改文件内容
- x:该文件具有可被系统执行的权限,文件是否可执行是由是否具有“x”这个权限决定的,与文件名没有关系。
- r:表示具有读取目录列表的权限,所以可用ls命令读取列表
- w:表示具有更改目录列表结构的权限,如新建文件目录、删除文件目录、重命名、转移文件目录位置(若用户具有该目录的w权限,即使不具有该目录下文件的任何权限,也可以把这些文件删除)
- x:表示用户能否进入该目录成为工作目录的用途;工作目录就是你目前所在的目录,不具备该权限的用户不能进入该目录
- 普通文件(-)——纯文本文件、二进制文件、数据格式文件
- 目录(d)
- 连接文件(l)——类似windows下的快捷方式
- 设备与设备文件——块设备文件(b)、字符设备文件(c)
- 套接字(s)
- 管道(p)
第三章 Linux文件与目录管理
1、目录与路径
相对路径:相对于目前路径的文件名写法
举例来说,你目前在/home这个目录下,如果想要进入/var/log这个目录时,可以这么写
1、cd /var/log(绝对)
2、cd ../var/log(相对)
.:代表当前目录,也可以使用./来表示
..:代表上一层目录,也可以../来表示
- .:代表此层目录
- ..:代表上一层目录
- -:代表前一个工作目录
- /:代表根目录 根目录的上一层(..)与根目录自己(.)是同一个目录
- ~:代表用户身份所在的主文件夹
- ~account:代表account这个用户的主文件夹
- cd(切换目录)
cd [相对路径或绝对路径]
cd ~hjy:去到hjy这个用户的主文件夹
cd ~:回到自己的主文件夹
cd :没加上任何路径,默认回到自己的主文件夹
cd ..:表示去到上层目录
cd -:回到前一个目录 - pwd(显示目前所在目录)
pwd:显示当前所在目录
pwd -P:正确显示实际路径,而不是连接文件的路径。如/var/mail是连接文件 - mkdir(新建目录) 参数:-m(设置目录权限)、-p(可创建多层目录)
mkdir test:创建一个名为test的目录
mkdir -p test/test1:创建多层目录
mkdir -m 711 test:创建自定义权限的test目录 - rmdir(删除“空”的目录) 参数:-p(连同上层“空”的目录一起删除)
2、文件与目录管理
- ls [-al等参数] 目录名称
- ls [--color={never,auto,always}] 目录名称
- ls [--full-time] 目录名称
- cp(复制文件或目录):默认下,cp的源文件于目的文件的权限是不同的,目的文件的所有者会是命令操作者本身,因此文件备份时,需要加上-p参数
复制(cp)这个命令是非常重要的,不同身份者执行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大。
范例一:将主文件夹下的.bashrc复制到/test下,并更名为bashrc
范例二:在root身份下切换目录到/tmp,并将/var/log/wtmp复制到/tmp且查看属性
可看到在不加参数时,文件的属性/权限会改变,如果想要全部属性一模一样,显示如下( 如果在一般用户下执行,权限也是不一样的)
- rm(移除文件或目录)
rmdir仅能删除空目录,要删除非空目录需使用“rm -r”命令
参数-r:递归删除目录,要慎用!
参数-i:删除前询问用户是否操作,默认加上
- mv(移动文件与目录,或更名)
范例一:复制一个文件,创建一个目录,将文件移到目录中,并把目录重命名
3、文件内容查阅
- cat:由第一行开始显示文件内容
- tac:从最后一行开始显示
- nl:显示时输出行号
- more:一页一页显示文件内容
- less:与more类似,但可以向前翻页
- head:只看头几行
- tail:只看后几行
- modification time(mtime):当文件内容数据更改时就会更新该时间
- status time(ctime):当文件状态改变是就会更新该时间,如更改权限属性
- access time(atime):当文件数据被访问时就会更新该时间,如cat命令读取文件
4、文件与目录的默认权限与隐藏权限
- 创建文件时,默认权限为-rw-r--r--
- 创建目录时,默认权限为drwxr-xr-x
- chattr:设置文件的隐藏属性
部分重要参数:
+a:文件只能添加数据,而不能删除也不能修改数据,只有root才能设置这个属性
+i:使文件无法删除、改名、设置连接,也无法写入或添加数据,只有root才能设置这个属性
- lsattr:显示文件的隐藏属性
- SUID
当s出现在文件所有者的x权限上时,则该文件具有SUID权限,SUID有以下限制与功能:
- SUID权限仅对可执行二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序所有者的权限
- SGID
当s出现在文件用户组的x权限上时,则该文件具有SGID权限,与SUID不同的是,SGID可针对文件或目录设置。
对于文件,SGID有以下限制与功能:
- SGID对可执行二进制程序有效
- 执行者对于该程序需要具有x的可执行权限
- 执行者在执行的过程中将会获得该程序用户组的支持
如:一般用户对于locate命令具有可执行权限,当执行时,用户组身份会升级为slocate身份,所以可以查询mlocate.db数据库。对于目录,SGID有以下限制与功能:
- 用户若对此目录具有r与x的权限时,该用户能够进入此目录
- 用户在此目录下的有效用户组将会变成该目录的用户组
- 若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同
- SBIT
SBIT仅对目录有效,其作用:
- 当用户对于此目录具有w,x权限时
- 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件
若一般用户具有该目录的w权限,即使不具有该目录下文件的任何权限,也可以把这些文件删除;一旦该目录设置SBIT权限,除了root可以删除所有文件外,一般用户即使有该目录的w权限,也只能删除自己建立的文件。
- SUID为4
- SGID为2
- SBIT为1
5、命令与文件的查询
- which——搜索命令所在路径位置及其别名
范例一:
- whereis——搜索命令所在路径及帮助文档所在位置
参数-b(只查找可执行命令),-m(只查找帮助文件)
范例一:
- locate
在后台数据库(/var/lib/mlocate)中按文件名搜索,搜索速度更快,不需遍历整个操作系统。该数据库更新比较慢(需1天),所以新建的文件不能立刻用locate搜索到,可用updatedb命令更新数据库即可,如下图
范例一:
- find
在系统中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配。
find [搜索范围] [搜索条件]:在搜索范围内查找,搜索范围要尽可能小,不然会费时间。
-
- 不区分大小写:find /root -iname install.log
- 查找没有所有者文件,可清除:find /root -nouser
- 查找一定时间内改动过的文件,如
- +4代表大于等于5天前的文件名:find /var -mtime +4
- -4代表小于等于4天内的文件名:find /var -mtime -4
- 4代表4~5那一天的文件名:find /var -mtime 4
- +4代表大于等于5天前的文件名:find /var -mtime +4
- 等等.....用法较灵活
- grep
在文件中搜索符合条件的字符串,如果需要匹配使用正则表达式匹配,正则表达式是包含匹配
6、权限与目录间的关系(极重要)
- 让用户能进入某目录成为“可工作目录”的基本权限是什么
- 可用命令:cd
- 目录所需权限:用户对该目录至少具有x权限
- 额外需求:若ls查阅目录,则用户还需要r权限
- 用户在某目录内读取一个文件的基本权限是什么
-
- 可用命令:cat、more、less
- 目录所需权限:用户对该目录至少具有x权限
- 文件所需权限:用户对文件至少需要具有r的权限
- 让用户可以修改一个文件的基本权限是什么
- 可用命令:nano、vi
- 目录所需权限:用户对该文件所在的目录至少具有x权限
- 文件所需权限:用户对文件至少需要具有r,w的权限
- 让一个用户创建一个文件的基本权限是什么
- 目录所需权限:用户对该目录需要具有w,x的权限,重点在w
- 让用户进入某目录并执行该目录下的某个命令的基本权限是什么
- 目录所需权限:用户对该目录需要具有x的权限
- 文件所需权限:用户对该文件需要具有x的权限
第四章 Linux磁盘与文件系统管理
1、认识EXT2文件系统
- 磁盘的组成:
- 盘片(记录数据)
- 机械手臂与磁头(读取盘片上的数据)
- 主轴马达(转动盘片,让磁头读取数据)
- 盘片上的物理组成:
- 扇区为最小的物理存储单位,每个扇区为512bites
- 柱面为由扇区组成的圆,是分区的最小单位
- 第一个扇区最重要,该扇区记录两个重要的信息
- 主引导分区(MBR):可以安装引导加载程序的地方,有446bytes
- 分区表:记录整个硬盘分区的状态,有64bytes
- 磁盘文件名
- /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名
- /dev/hd[a-d][1-63]:为IDE接口的磁盘文件名
- 磁盘分两种接口:IDE接口和SATA接口
-
主机通常提供两个IDE接口——IDE1和IDE2,一个IDE接口可接两个IDE设备——Master(主设备),Slave(从设备)
IDE Master Slave IDE1 /dev/hda /dev/hdb IDE2 /dev/hdc /dev/hdd -
一个SATA接口只能连接一个SATA设备,与IDE不同的是,SATA接口的磁盘没有一定的顺序,即两个SATA磁盘分别插到SATA1,SATA4插槽上,则两设备的文件名分别是/dev/sda和/dev/sdb。
-
- 磁盘分区
- 由于分区表最多只有64bytes,主分区与扩展分区最多可以有4个(硬盘的限制)
- 扩展分区最多只能有一个(操作系统的限制),其中扩展分区还可以再分出逻辑分区
- 主分区和逻辑分区能够格式化后作为数据访问的分区,而扩展分区无法格式化
- 逻辑分区的数量依操作系统而不同,在Linux系统中,IDE硬盘最多有59个逻辑分区(5号到63号),SATA硬盘则有11个逻辑分区(5号到15号)
- data block(数据块)——用于放置文件内容
在Ext2文件系统中所支持的block大小有1KB、2KB及4KB三种,在格式化时block大小就固定了,且每个block都有编号,以方便inode的记录。
-
- block大小与数量在格式化时就固定了
- 每个block内最多只能放置一个文件的数据,若文件大于block大小,会占用多个block;若小于block大小,则会造成磁盘空间浪费
例:假若你的Ext2文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes, 请问此时你的磁盘浪费多少容量?
由亍于Ext2 文件系统中一个 block 仅能容纳一个文件,因此每个 block 会浪费4096 - 50 = 4046 (byte), 系统中总共有10000个小文件,所有文件容量为:50 x 10000 (bytes) = 488.3Kbytes,但此时浪费的容量为:4046 x 10000 (bytes) = 38.6MBytes 。想一想,不到 1MB的总文件容量却浪费将近 40MB 的容量,且文件越多将造成越多的磁盘容量浪费。
- inodetable inode用来记录文件属性,一个文件占用一个inode,同时记录文件数据所在的block号码
- inode记录的文件属性包括:该文件的访问模式、所有者和组、大小、创建时间和改变时间等。
- 每个inode大小均固定为128bytes
- 一个文件占用一个inode,所以文件系统能够创建的文件数量与inode数量有关
- 系统读取文件时需先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能读取block的内容
- superblock——用于记录整个文件系统相关信息的地方
一般一个文件系统只有一个superblock,即除第一个block group外,后续的不一定有,就算有,也是作为救援的备份。superblock记录的主要信息有:
-
- inode和block的总量
- 未使用和已使用的inode/block数量
- block与inode大小(block为1k,2k,4k,inode为128bytes)
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息
- 一个validbit数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1
- 文件系统描述——用于描述各个block group的开始与结束的block号码
- 块对应表
- 添加文件时会用到block,根据块对应表可快速找到空位置来处理文件
- 删除文件时,原本占用的block就会释放出来
- inode对应表——功能与块对应表差不多,不同的是,块对应表记录的是使用与未使用的block号码,而inode对应表记录的是使用与未使用的inode号码
- 先确定用户对于欲添加文件的目录是否具有w,x权限,若有则添加
- 根据inode对应表找到没有使用的inode的号码,并将新文件的权限/属性写入
- 根据块对应表找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据
- 将写入的inode与block数据同步更新inode对应表与block对应表,并更新superblock的内容
- 预备:当写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息
- 实际写入:开始写入文件的权限与数据,开始更新metadata数据
- 结束:完成后,在日志记录块当中完成该文件的记录
2、文件系统的简单操作
- df:列出文件系统的整体磁盘使用量
- du:统计磁盘上的文件大小
- 硬连接(hard link)
文件名只与目录有关,但文件内容则与inode有关, 硬连接使得多个文件名对应同一个inode,它只是新建一个文件名连接到该inode号码的关联记录而已。这样做的好处是安全,如果误删了其中一个文件名,inode和block还是存在的,还有另一个文件名连接数据,也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。但硬连接是有限制的:
-
- 不能跨文件系统
- 不能连接到目录,只能文件之间连接
- 软连接
-
- 与Windows的快捷方式是一样的
- 会占用一个inode结点和block块,但block中保存的只是原文件的文件名和inode结点号
- 软连接的文件权限都为lrwxrwxrwx
- 当源文件删除时,软连接的文件会打开不了
3、磁盘的分区、格式化、检测与挂载
- 新增磁盘分区
- 删除磁盘分区
(2)磁盘格式化—— mkfs、 mke2fs
- 把分区分割成等大小的block,每个block默认大小为1K/2K或4k
- 建立inode分区表,用来记录文件属性,同时记录文件数据所在的block号码
- 使用mount为手动挂载的分区,不是永久的,在系统启动后需要再次挂载
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中
- 单一的目录不应该重复挂载多个文件系统
- 挂载点理论上应该为空,如果不为空,则挂载后原目录下的内容会暂时消失,当新分区被卸载后原目录下的内容会再次显示
- a、挂载文件系统
系统默认的过载目录是/mnt,但并非必须在这里,则需要创建目录成为挂载点,下图是分区/dev/sdb1的挂载与卸载
- b、挂载CD光盘
虚拟机下模拟安装了CD光盘,如下,现要对其进行挂载
- mknod
mknod 设备文件名 [bcp] [Major] [Minor]b:设置设备名称成为一个外部存储设备文件,例如硬盘c:设置设备名称成为一个外部输入设备文件,例如鼠标、键盘p:设置设备名称成为一个FIFO文件
Linux下设备都是用文件来代表的, 利用的是major和minor数据来代表设备,如下面8为主设备代码,而0~2为次设备代码,这些号码都是有意义的。
- e2label:用来设置文件系统卷标(label)的方法
- tune2fs
4、设置开机挂载
- /(根分区)
- swap分区(虚拟内存)
- /boot(启动分区):用于系统启动
5、内存交换空间(swap,虚拟内存)
第五章 文件与文件系统的压缩与打包
1、压缩命令
压缩命令 | 压缩格式 |
zip | .zip |
gzip | .gz |
bzip2 | .bz2 |
- zip——需要定义压缩名,压缩后原文件还在,压缩文件可以在windows下解压
- 压缩文件:对原文件进行压缩得到压缩文件,删除原文件,解压后可恢复原文件
-
- 压缩目录:对原目录进行压缩得到压缩目录,删除原目录,解压后可恢复原目录
- gzip:不需定义压缩名,压缩后原文件消失,压缩文件可以在windows下解压
压缩文件如下,如需压缩目录,可参考上面加上参数“-r”, 但压缩目录时,只压缩目录下的子文件,不会压缩目录本身
- bzip2:不需定义压缩名,压缩后原文件消失,但可通过参数“-k”保留原文件,该命令不能压缩目录
2、打包命令
第六章 vim程序编辑器
1、VI的使用
- 命令模式:可移动光标,删除,复制操作
- 输入模式:按i键进入输入模式,按Esc键退出
- 底行模式:输入“:wq”保存退出
第七章 认识shell与学习bash
1、认识shell
- 接受用户输入命令
- shell把命令翻译成二进制数据后传递给内核
- 由内核来调用计算机硬件来处理
2、shell的变量功能
- “=”两边不能直接接空格,如name = "hjy"
- 变量名只能是字母、数字和下划线,且开头不能是数字
- 变量值有空格时可使用双引号“ " ”或单引号“ ' ”
- 双引号内特殊字符(如$),保留原本特性
-
- 单引号内特殊字符(如$),仅为一般字符
- 单引号内特殊字符(如$),仅为一般字符
- 使用转义符“\”将特殊符号(如$、\)变成一般符号
- 取消变量值可使用“unset 变量名”
- 若变量需要在子进程中使用,需要以export来使变量变成环境变量
- 在一串命令中,在反单引号“ ` ”内的命令会被先执行
- read——读取来自键盘输入的变量
- declare——声明变量类型
参数:-a——定义数组类型;-i——定义数字类型;-x——定义环境变量;-r——定义readonly类型,不可更改重设; 若+a、+i、+x、+r表示取消声明
同样能实现运算的还有如下方法:
-
- 使用expr
-
- 使用$((..)) 或 $[..]
- array——定义数组
(4)变量内容的删除、替代与替换
- 变量内容的删除、替代
- #:从头开始,将符合的“最短”数据删除
- ##:从头开始,将符合的“最长”数据删除
- %:从尾开始,将符合的“最短”数据删除
- %%:从尾开始,将符合的“最长”数据删除
- 变量内容替换
知识点 1、env或export命令可查看环境变量,而set命令可查看所有变量 2、set -u可判断变量是不存在还是为空 |
3、命令别名与历史命令
4、数据流重定向
- /dev/null垃圾桶黑洞设备:可将错误输出忽略掉,不显示也不储存,一般使用“2> /dev/null”
- 使用数据流重定向的情况有如下:
- 输出的信息较重要,而且我们需要将它存下来
- 后台程序,不希望干扰屏幕正常输出
- 一些已知错误信息,想以“2> /dev/null”将它丢掉
- 正确和错误信息需要分开输出
- &&:查阅目录/tmp/abc是否存在,若存在则新建/tmp/abc/hehe
- ||:查阅目录/tmp/abc是否存在,若不存在则创建,否则不做任何事
5、管道命令(pipe)
注: 管道命令必须能够接受来自前一个命令的数据成为standard input继续处理
- cut——将一段信息的某一段切出来,处理的信息是以行为单位。
参数:-d——接分隔字符;-f——取出分隔后的第几段;-c——以字符的单位取出固定字符区间
- grep——分析一行信息,如果有匹配的,就将该行拿出来。
grep在数据中查找一个字符串时,是以行为单位来进行数据的选取的!
- sort——依据不同的数据类型进行排序
- wc——输出信息的整体数据(行,字数,字符数)
- uniq——重复的行只显示一个
- tee——可将数据流存到文件/设备的同时,输出到屏幕以便继续处理
(4)字符转换命令
- tr——删除一段信息中的文字,或者进行文字信息的转换
参数:-d——删除字符串;-s——替换字符串
- col——过滤控制字符
- join——将两个文件当中有相同数据的那一行加在一起
在join之前,文件内容要事先经过sort处理
- paste——将两个文件贴在一起,中间以[tab]键隔开
- expand——将[tab]键转换为空格键
- split——将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件
(6)参数代换
- xargs——读入stdin的数据,并且以空格符或断行符进行分辨,将stdin的数据分隔为arguments
第八章 正则表达式与文件格式化处理
1、正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用通配符。
2、基础正则表达式
- grep命令
grep在数据中查找一个字符串时,是以行为单位来进行数据的选取的!
常用参数:
-
- -c:统计找到“查找字符串”的次数
- -i:忽略大小写
- -n:顺便输出行号
- -v:反向选择,显示没有“查找字符串”的行
- -A:后加数字n,除列出该行外,后续n行也列出来
- -B:后加数字n,除列出该行外,前面n行也列出来
范例1:统计/etc下连接文件的数量
范例2:列出文件中以“.”结尾,并含有2个“o”或以上的行 文件链接: http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt
- cut命令——将一段信息的某一段切出来,处理的信息是以行为单位。
参数:-d——接分隔字符;-f——取出分隔后的第几段;-c——以字符的单位取出固定字符区间
- sed命令——用来将数据进行替换、删除、新增、选取
格式:sed [参数] ‘[动作]’ 文件名参数:
-
- -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择则只会把经过sed命令处理的行输出到屏幕
- -e:允许对输入数据应用多条sed命令
- -i:会直接修改读取的文件,而不是由屏幕输出,不加时只是临时修改,对原文件没有作用
动作:[n1 [,n2] ] 动作参数
-
- a:新增,在当前行后添加一行或多行
- c:行替换,用c后的字符串替换n1,n2之间的行
- d:删除,删除指定行
- i:插入,在当前行前插入一行或多行
- p:打印,输出指定行
- s:字符串替换,用一个字符串替换另一个字符串,格式:s/old/new/g
范例一:将/tmp/regular文件内容列出,并删除2-19行
范例二:由范例一后,在第二行后新增两行( 使用$可代表最后一行,如‘2,$d’)
范例三:将/tmp/regular文件内容列出,并替换2-20行
范例四:仅列出/tmp/regular文件的第5-7行
范例五:仅列出/tmp/regular文件的第5-7行后,将数字用--代替
范例六:利用sed直接在/tmp/regular文件最后一行添加“# This is a test”
3、文件格式化与相关处理
(1)printf——格式化打印
格式:printf ‘打印格式’ 实际内容
格式样式
| 变量格式
|
知识点 1、printf与print区别
|
(2)awk——好用的数据处理工具
awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或[tab]键。
格式:awk '条件1{动作1} 条件2{动作2}...' filename
awk的处理流程:
-
- 读入第一行$0,并将字段填入$1,$2,$3等变量
- 根据条件,判断是否需要进行后面的动作
- 做完所有的动作与条件类型
- 若后续还有行,则重复前3个步骤
范例一:变量NR、NF的使用
范例二:在/etc/passwd以“:”作为分隔,把第3字段小于5以下的数据列出,并且只列出第一列和第3列
上图第一行没有正确输出,因为读入第一行时,默认还是以空格符间隔,可利用BEGIN关键字
(3)文件比较工具
- diff命令——通常用于同一文件的新旧版本区别,以行为单位比较
- cmp命令——以字节为单位比较两个文件
- patch命令
与diff命令密切相关,使用patch命令更新新版本。参数:-pN——后面N表示取消N层目录的意思;-R——代表还原,将新文件还原成原来旧的版本范例一:先制作补丁文件,然后由补丁文件更新旧文件,然后恢复出旧文件
第九章 学习shell script
1、script的编写与执行
- 直接命令执行:shell.sh文件必须要具备r、x的权限
- 绝对路径:如使用/bin/ls来执行命令
- 相对路径:如目前工作目录在/bin,则使用./ls来执行
- 变量PATH功能:将shell.sh放入PATH指定的目录内
- 以bash进程来执行:通过“bash shell.sh”或者“sh shell.sh”来执行,只需要r权限即可执行
参数:-n——仅查询语法问题;-v——在执行script之前,将script的内容输出屏幕;-x——将script执行过程显示在屏幕上
2、script的执行方法区别
- 利用直接执行的方法来执行script——在新开辟的子bash(子进程)中执行
前面提到的方法(如绝对、相对和PATH),script是在子进程的bash内执行的,而 子进程执行完后,子进程内的各个变量值不会转回到父进程中。
- 利用source来执行脚本——在原bash(父进程)中执行
用source执行完后,script中的变量都会在原bash中生效,如前面新建别名后,需要执行“source .bashrc”即可生效。
3、判断式——test命令,[]判断符
- test命令
- []判断符
中括号[]的使用方法与test几乎一样,使用[]作为shell的判断式时,有以下注意:
-
- []两端需要有空格符来分隔
- []内的每个组件都需要有空格符来分隔
- []内的变量最好以双引号括起来
- []内的常量最好以单/双引号括起来
script特殊变量有:
- $0:表示脚本文件名
- $1:表示第一个参数
- $#:表示后接的参数个数
- $@:表示"$1"、"$2"、"$3"...,每个变量是独立的
- $*:表示“"$1c$2c$3c$4"”,其中c为分隔符,默认是空格符,所以本例代表“"$1 $2 $3 $4"”
4、条件判断式
(2)利用case...esac判断
(3)利用function功能
script的执行方式是由上而下,由左而右,因此在script当中的function的设置一定要在程序的最前面。另外,function也是拥有内置变量的,它的内置变量与script类似,后接的变量为$1,$2,但$0仍表示文件名。
5、循环(loop)
- while do done
while [ condition ]do执行程序done当condition成立时就进行循环,直到condition的条件不成立才停止。
- until do done
until [ condition ]do执行程序done当condition成立时就终止循环,否则就继续进行循环。
另一种for循环
第十章 Linux账号管理与ACL权限设置
1、Linux的账号与用户组
- /etc/passwd:管理用户UID/GID的重要参数
每一行代表一个账号,但里面大部分系统账号是系统正常运行所必须要的。每一行用“:”分隔成7个字段,如下,其中GID
- /etc/shadow:管理密码
- /etc/group:记录GID与用户组名的对应关系
- /etc/gshadow:管理用户组密码
一个用户可以加入多个用户组,那么到底以哪个用户组为准?——这里需要涉及到初始用户组和有效用户组了。
- 初始用户组
在/etc/passwd的第4列GID就是所谓的初始用户组,当用户登录系统后就立刻拥有该用户组的相关权限。
- 有效用户组
使用命令groups查看当前用户的所有用户组,输出的第一个用户组即为有效用户组,有效用户组的作用是新建文件时,所建文件的用户组用有效用户组来表示。
-
- groups命令——有效与支持用户组的查看
- newgrp命令——有效用户组的切换
2、账号管理
- 新增用户——useradd
新建用户,默认做了以下这些事:
-
- 在/etc/passwd里创建一行与账号相关的数据,包括创建UID/GID主文件夹
- 在/etc/shadow里面将此账号的密码相关参数填入,但未设置密码
- 在/etc/group里面加入一个与账号名称一模一样的组名
- 在/home下创建一个与账号同名的目录作为用户主文件夹,且权限为700
- 修改密码——passwd
新增的用户由于没有设置密码,暂时不能登录; 帮别的账号设置密码需要使用“passwd 账号”的格式,使用“passwd”表示修改自己的密码; 一般用户更改密码时需要知道旧密码,而root不需要,并且一般用户只能修改自己的密码,不能修改别人的密码(需要在root登录的情况下修改)。范例一:给haha用户设置密码
范例二:直接更改密码,不需要输入两次,仅用在script大量新建用户账号中,缺点是密码留在命令中,不安全。
范例三:让某个账号暂时无法使用密码登录
- 列出密码详细信息——chage
- 账号相关数据的微调——usermod
- 删除用户——userdel
用于删除用户的相关数据,主要删除:
-
- 用户数据:/etc/passwd、/etc/shadow
- 用户组数据:/etc/group、/etc/gshadow
- 用户文件数据:/home/username、/var/spool/mail/username(需要加入参数-r)
- finger——将用户的属性列出来,几乎都是/etc/passwd中信息
- chfn——修改/etc/passwd中的第5个属性——用户注释信息
- chsh——修改/etc/passwd最后一个属性——shell环境
- id——查看用户的UID与GID
- groupadd——新增用户组
- groupmod——用户组相关数据的微调
- groupdel——删除用户组
注:当某个账号的初始用户组使用该用户组时,就不能删除该用户组。若必须要删除该用户组,可以
-
- 修改该账号在/etc/passwd的GID
- 删除该账号用户
- gpasswd——用户组管理员功能
参数:
-
- 若无任何参数,表示设置该用户组密码(/etc/gshadow)
- -A:使某个用户成为该用户组的管理员
- -r:将该用户组密码删除
- -a:将某位用户加入到该用户组
- -d:将某位用户从该用户组删除
3、主机的具体权限规划:ACL的使用
- 其他用户的权限设置为可读可写(则所有用户都可以操作该文件,不可取)
- 将haha添加进root用户组(赋予了过多的权限,所有属于用户组root的文件,haha都拥有其等同的权限)
- 设置sudo,,使haha能够以hjy的身份对文件进行读写操作(虽然可以达到只限定haha一人拥有对tmptf文件的读写权限,但是需要对sudoers文件进行严格的格式控制,而且当文件数量和用户很多的时候,这种方法就相当地不灵活了。)
- setfacl——设置文件/目录的ACL规定
部分参数:
-
- -m:设置acl参数
- -x:删除acl参数
- -b:删除所有acl参数
给用户分配权限:u:用户:权限;给用户组分配权限:g:用户组:权限
- getfacl——取得文件/目录的ACL规定
其中 mask表示最大有效权限,用户或用户组所设置的权限必须存在于mask的权限范围内才能生效。如下把mask的权限范围改成r--
- ACL权限设置能被子文件或子目录所继承
4、用户身份切换
- su
用法如下:
-
- 若要完整切换到新用户的环境,必须要使用“su - username”,才会连同PATH/USER/MAIL等环境变量都转换成新用户的环境
- 若仅想执行一次root命令,可以利用“su - -c '命令串'”方式处理
- 使用root切换成为任何用户时,不需要密码
缺点:当主机是多人管理时,若大家都使用su切换成root用户身份,这样每个人都得需要知道root的密码,这样很不安全。
- sudo
sudo可以把本来只能root执行的命令赋予普通用户执行,且sudo操作的对象是系统命令,仅有/etc/sudoers内的用户才能执行sudo这个命令。
sudo执行流程:
-
- 当用户执行sudo时,系统在/etc/sudoers文件中查找该用户是否有执行sudo的权限
- 若用户具有,便让用户输入用户自己的密码来确认
- 若密码输入成功,便开始进行sudo后续接的命令(root执行sudo时不需要输入密码)
- 若切换的身份与执行者身份相同,那也不需要输入密码
用visudo命令修改/etc/sudoers文件
/etc/sudoers是有语法的,需要使用visudo命令修改,而不是使用vim,离开修改界面,系统会检测语法错误。
范例一:赋予一般用户拥有root重启系统的执行权执行visudo命令,在 /etc/sudoers文件中添加以下内容
切换到hjy的shell环境,查看该用户被root允许执行的命令,再使用sudo执行该命令
范例二:赋予一般用户拥有创建用户以及修改别人密码的执行权,但不能修改root的密码,也禁止设置root密码为空
切换到hjy的shell环境,查看该用户被root允许执行的命令,再使用sudo执行新增用户命令与修改密码
5、用户的特殊shell与PAM模块
- 用户执行passwd,并输入密码
- passwd调用PAM模块进行验证
- PAM模块会到/etc/pam.d中查找与passwd同名的配置文件
- 依据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析
- 将验证结果回传给passwd这个程序
- passwd会根据回传结果决定下一个操作(重新输入新密码或通过验证)
第十一章 磁盘配额(Quota)与高级文件系统管理
1、磁盘配额(Quota)的应用与实践
- Quota一般用途
- 网络服务
- WWW Server,例如:每个人的网页空间的容量限制
- mail Server,例如:每个人的邮件空间限制
- file Server,例如:每个人最大的可用的网络硬盘空间
- Linux主机
- 限制用户组使用的最大磁盘配额
- 限制用户使用的最大磁盘配额
- 网络服务
- Quota的使用限制
- 仅能针对整个文件系统:若/dev/sda1是挂载在/home下,那么/home下面所有目录都会受到限制
- 内核必须支持Quota
- 只对一般用户有效
- Quota的规范
- 文件数量限制与容量限制(inode与block)
- 限制inode用量:用户可以新建文件的数量
- 限制block用量:用户磁盘容量的限制
- soft/hard限制值
- hard限制值:表示用户的用量不能超过该值,若超过,系统会锁住该用户的磁盘使用权
- soft限制值:当低于该值,可正常使用该磁盘,若大于soft而小于hard,则系统会给予7天警告要求磁盘整理,若过了期限,则soft限制值将替代hard限制值作为Quota的限制,此时系统会锁住该用户的磁盘使用权
- 文件数量限制与容量限制(inode与block)
如:hard为500MB,soft为400MB,若使用容量高达450MB,系统会给予警告,7天后还没有整理磁盘,则hard限制值会变成400MB,此时系统会锁住该用户的磁盘使用权
- 先创建3个用户quota*,所属用户组为quotagrp
:
- 观察Quota报告数据
*列出文件系统的Quota挂载参数
*列出/home这个支持quato的载点使用情况
- 新建Quota配置文件
Quota是通过分析整个文件系统中每个用户拥有的文件总数与总容量,再将这些数据记录在该文件系统的最顶层目录,然后在该配置文件中再使用每个账号的限制值去规定磁盘的使用量。quotacheck:扫描支持Quota参数(usrquota,grpquota)的文件系统,并创建Quota的配置文件
此时会自动在/mnt/music文件系统创建Quota的配置文件
- Quota启动、关闭与限制值设置
- quotaon——启动quota的服务
参数:-u——启动aquota.user;-g——启动aquota.group;-v——显示启动过程;-a——根据/etc/mtab启动相关quota一旦启动一次,下次系统启动就会自动执行该命令。
-
- quotaoff——关闭quota的服务
- edquota——编辑账号/用户组的限值与宽限时间
参数:-u——后接用户;-g——后接用户组;-t——修改宽限时间;-p——复制范本编辑用户quotauser1设置限额
其余4个用户设置一样,可使用quota复制
blocks和inodes是系统自己算的,上面的80是我自己打上去的,保存退出时就出错,不知道为什么我的是0,到此弄不下去了
2、软件磁盘阵列(RAID)
- RAID-0(等量模式):性能最佳
使用同型号同容量的磁盘来组成,效果更佳,数据会交错存放到各磁盘中,如左下图有100MB数据需要写入,每个磁盘会分配到50MB。缺点:只要RAID-0有任何一块磁盘损毁,在RAID上的所有数据都会丢失而无法读取。
- RAID-1(映像模式):完整备份
使用同型号同容量的磁盘来组成,该模式主要是让同一份数据完整保存在两块磁盘上,用于数据的备份,当有一个磁盘损毁时,数据还是可以保留下来。缺点:由于磁盘一半容量用于备份,则总容量只是全部磁盘容量的一半
- RAID 0+1,RAID 1+0
由于具有RAID-0的优点,所以性能得以提升,由于具有RAID-1的优点,所以数据得以备份,但同时总容量会少一半用来作为备份。
- RAID-5:性能与数据备份的均衡考虑
第十二章 例行性工作(crontab)
1、仅执行一次的工作调度——at
工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行。
- atd的启动
要使用单一工作调度,Linux系统上必须要有负责这个调度的atd服务,默认是开启的。启动方法如下:
- at的访问控制——使用/etc/at.allow与/etc/at.deny
- 若系统中有/etc/at.allow文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令(/etc/at.deny文件会被忽略)
- 若系统中没有/etc/at.allow文件,而有/etc/at.deny文件(黑名单),那么除了黑名单上的用户外,其他用户都可以使用at命令(对root不起作用)
- 若两个文件都不存在,那么只有root用户可以使用at命令
- 范例一
hello.sh内容如下
2分钟后执行hello.sh这个脚本文件, 使用at时会进入一个at shell的环境来让用户执行工作命令(最好是使用绝对路径)
通过atq命令查看有多少at的工作调度,可用atrm命令删除指定工作调度
- 范例二——设置2018/5/15 22:32关机
- batch:系统有空时才进行背景任务
batch会在CPU的工作负载小于0.8时,才进行你所下达的工作任务!使用 uptime命令查看负载
2、循环执行的例行性工作调度——crontab
例行性工作调度是由crond这个系统服务来控制。当用户使用crontab这个命令来新建工作调度后,该项工作就会被记载到/var/spool/cron/里面,而且是以账号来作为判别。如hjy执行crontab后,工作会被记载到/var/spool/cron/hjy里。不要使用vim编辑该文件,因为可能由于语法错误而导致无法执行cron。
crond所执行的每一项工作都会被记录到登录文件/var/log/cron中,所以可查看该文件判断Linux是否植入木马。
- crond服务的启动
crond服务是默认启动的,若没启动可执行以下命令
- crontab的访问控制——使用/etc/cron.allow与/etc/cron.deny
- 若系统中有/etc/cron.allow文件,那么只有写入/etc/cron.allow文件(白名单)中的用户可以使用crontab命令(/etc/cron.deny文件会被忽略)
- 若系统中没有/etc/cron.allow文件,而有/etc/cron.deny文件(黑名单),那么处了黑名单上的用户外,其他用户都可以使用crontab命令(对root不起作用)
- 若两个文件都不存在,那么只有root用户可以使用crontab命令
- crontab命令
参数:-e——编辑crontab工作任务(若只删除指定任务,重新编辑即可);-l——查阅crontab工作任务;-r——删除所有的crontab任务
编辑例行性命令的的格式如下,具有六个字段:
范例:没隔2分钟执行一次hello.sh文件
此时才/var/spool/cron/目录下会创建一个root文件,用来记录root用户的例行性任务
- 把需要定时执行的脚本复制到/etc/cron.daily、/etc/cron.hourly、/etc/cron.weekly、/etc/cron.monthly目录中的任意一个
- 编辑/etc/crontab这个配置文件。
crond服务会每分钟去读取一次/etc/crontab、/var/spool/cron和/etc/cron.d/*里面的内容,并执行,当修改完/etc/crontab之后需要重启crond这个服务。
- 由/etc/anacrontab分析到cron.daily这项工作名称的天数为1天
- 由/var/spool/anacron/cron.daily取出上一次执行anacron的时间
- 和当前时间做比较,若时间差超过1天,证明有cron任务漏执行,就执行cron.daily工作
- 执行这个工作只能在3:00-22:00之间
- 根据/etc/anacrontab的设置将延迟5分钟,再随机延迟0-45分钟后再执行
- 使用run-parts脚本执行/etc/cron.daily目录下所有可执行文件
第十三章 程序管理
1、什么是进程
- 进程与程序
- 程序:通常为二进制程序放置在存储媒介中,以物理文件的形式存在
- 进程:进程是一个正在运行的程序;程序被触发后,执行者的权限与属性、程序代码与所需数据等都会被加载到内存中,系统并给予这个内存内的单元一个标识符(PID)。
- 子进程与父进程间fork and exec
进程都会通过父进程以复制的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终就成为一个子进程的存在。
- 常驻进程(即服务daemon)
常驻在内存中的进程服务,主要负责系统所提供的功能以服务用户各项任务,如atd、crond,一般daemon类型的程序都会在文件名后加"d"。
2、工作管理
- 当前bash只能管理自己的工作,而不能管理其他bash的工作
- 前台:可控制与执行命令的环境称为前台工作
- 后台:可自行运行的工作,无法使用Ctrl+c终止它,可使用bg/fg调用该工作放入后台的工作不能够与用户互动
- 直接将命令丢到后台中执行——&
为了防止后台工作的信息输出到前台,应该设置数据流重定向,如下是将/etc打包的工作放入后台进行
- 将目前的工作丢到后台中“暂停”——Ctrl+z
存在以下情况:正在使用vim,需要寻找某个文件放哪,不需要结束vim,只要把vim丢到后台等待即可
- 查看目前的后台工作状态——jobs
+代表最后一个被放置后台的工作号码,-代表最后第二个被放置后台的工作号码,而超过最后第三个以后的工作就不会有+/-号存在
- 将后台工作拿到前台来处理——fg
直接执行fg默认将+号的工作拿到前台;“fg -”则将将-号的工作拿到前台;“fg %4”则将工作号码为4的工作拿到前台
- 让后台暂停的工作变成运行中——bg
- 管理后台的工作——kill
格式:kill -signal %jobnumber
使用kill -l查看能够使用的信号
部分重要signal:
-
- -1:让进程立即关闭,然后重新读取配置文件后重启
- -2:等同于Ctrl+c一样中断一个进程
- -9:强制删除一个工作(通常是不正常的工作)
- -15:以正常的方式结束一个工作(默认值)
- -17:等同于Ctrl+z来暂停一个进程的进行
- 把需要后台执行的命令加入/etc/rc.local文件(该文件会在系统启动的时候运行)
- 使用系统定时任务crontab,让系统在指定的时间执行某个后台命令
- 使用nohup命令
3、进程管理
- 仅查看自己的bash相关进程——ps -l
- 查看系统所有进程——ps aux(注意没有“-”)
- 动态查看进程的变化——top
top主要分为两个界面:上界面为整个系统的健康状态(主要由这个看系统目前性能,如下),下界面为每个进程的资源使用情况。每2s更新一次
- 以树的形式查看进程——pstree
1 | 让进程立即关闭,然后重新读取配置文件后重启 |
2 | 等同于Ctrl+c一样中断一个进程 |
9 | 强制删除一个工作(通常是不正常的进程) |
15 | 以正常的方式结束一个工作(默认值) |
17 | 等同于Ctrl+z来暂停一个进程的进行 |
- kill -signal PID——杀死单一进程
kill可以将信号传给某个工作(%jobnumber)或者某个PID(直接加数字与加上%number的情况是不同的)
- killall -signal 进程名——按进程名杀死一系列进程
killall可将以某个命令启动的所有进程同时杀死
(3)进程的优先级
- Priority与Nice值
PRI值越低代表越优先,不过PRI是由内核动态调整的,用户无法直接调整PRI值,但可通过修改NI值来修改PRI值。
PRI与NI相关性如下:PRI(new)=PRI(old)+NI
修改NI值有如下注意事项:
-
- NI值可调整范围:-20~19
- root可调整自己与他人进程的NI值,且范围为-20~19
- 一般用户仅可修改自己的NI值,且范围为0~19(避免一般用户抢占资源)
- nice命令——执行时立即给予新的NI值
- renice命令——重新调整已存在进程的NI值
(4)系统资源的查看
- free——查看内存使用情况
- uname——查看统与内核相关信息
- uptime——查看系统启动时间与工作负载(显示top界面第一行)
- netstat——跟踪网络
- dmesg——分析内核产生的信息
- vmstat——检测系统资源变化
注:缓存(cache)是用来加速数据从硬盘中读取的;而缓冲(buffer)是用来加速数据写入硬盘的
第十四章 系统服务
1、daemon(守护进程)与服务(Service)
2、通过systemctl管理服务
(1)通过 systemctl 管理单一服务(service unit)的启动/开机启动与观察状态
如服务atd的操作:
(2)通过systemctl观察系统上所有的服务
范例一:列出系统上有启动的uint
范例二:列出所有已安装的uint
(3)通过systemctl管理不同的操作环境(target unit)
范例一:列出与操作界面有关的target项目
范例二:查看当前是否图形界面,然后转为文字界面
范例三:在重启下,将目前图形界面改为纯文本界面,关掉图形界面