第三章 Linux的目录结构

3.1 基本介绍

  • 在 Linux 世界里,一切皆文件
  • linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录

“/”,然后在此目录下再创建其他的目录。

  • 结构图:

    img

    image-20210720151643657

3.2 目录介绍

  • /bin:(usr/bin)[重点]
    bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令

  • /boot:
    这里存放的是启动 Linux 时使用的一些核心文件,包括一些链接文件以及镜像文件

  • /dev :
    dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的(一切皆是文件)。

  • /etc:[重点]
    etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home:[重点]
    用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /lib:
    lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库

  • /lost+found:
    这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /mnt:[重点]
    系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt:[重点]
    opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc:
    proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    1
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all  
  • /root:[重点]
    该目录为系统管理员,也称作超级权限者的用户主目录

  • /run:
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

  • /sbin:
    s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序

  • /srv:
    该目录存放一些服务启动之后需要提取的数据。

  • /sys:

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp:
    tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr:
    usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

    • /usr/bin:
      系统用户使用的应用程序。

    • /usr/sbin:
      超级用户使用的比较高级的管理程序和系统守护程序。

    • /usr/src:
      内核源代码默认的放置目录。

    • /usr/local:[重点]

      这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序。

  • /var:[重点]
    var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /media:[重点]
    linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /selinux:
    这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

3.3 总结

  1. Linux有且只有一个根目录 /
  2. Linux的各个目录的内容是规划好的,不要乱放文件
  3. Linux以文件形式管理我们的设备,一切皆文件
  4. 几个特殊目录的标识:
    • 根目录:/
    • 当前目录:. or ./
    • 上一级目录:.. or ../
    • 家目录:~ or ~/

第四章 Linux常用命令

4.1 文件处理命令

4.1.0 通配符与命令格式

(1)通配符
  • *:匹配0或多个任意字符
  • ?:匹配单个任意字符
  • [ ]:匹配一组字符中的单个,如[1-5] [a-f]
(2)命令格式

命令格式 :命令 [-选项] [参数]

例 : ls -la /etc

说明:1)个别命令使用不遵循此格式

2)当有多个选项时,可以写在一起

3)简化选项与完整选项-a 等于 –all

4.1.1 文件处理命令ls

(1) ls
  • 命令英文原意:list

  • 命令所在路径:/bin/ls

  • 执行权限:所有用户

  • 功能描述:显示目录文件

  • 语法:ls 选项[-ald] [文件或目录]

    • -a (–all)显示所有文件,包括隐藏文件
    • -l (–list) 详细信息显示(权限,所有者等)
    • -m (–format=commas) 用逗号分隔的列表显示
    • -d 查看目录属性
    • -1(–format=single-column)用单独一列的方式查看结果
    • -r (–reverse) 以反序来显示
    • -X (–sort==extension) 根据文件扩展名进行字母顺序排序
    • -t (–sort==time) 根据日期和时间排序
    • -S (–sort==size) 根据文件大小排序
    • -h (–human-readable) 用 K M G 显示文件大小
    • -R (–recursive)递归遍历目录,显示该目录及其子目录的内容
    • -F (–classify) 显示文件的类型,*代表可执行文件,/代表目录
    • –color 用不同颜色显示文件类型,绿:可执行文件,蓝:文件夹,黑:普通
    1
    2
    3
    4
    #举例:
    ls -al #显示所有文件详细信息
    ls -alh #显示所有文件详细信息(包括文件大小)
    ls -alhS #按文件大小排序显示所有文件详细信息

    tip: 显示详细信息第一列字符 -rwxr-xr-x含义,分为四个字段- rwx r-x r-x

    • 第一个字段:- 表示二进制文件,d 表示目录,l 表示软链接文件
    • 第二个字段:u所有者权限。r、w、x分别表示读、写、执行,- 表示无对应权限
    • 第三个字段:g所属组权限
    • 第四个字段:o其他人权限

4.1.2 目录处理命令

(1)mkdir
  • 命令英文原意:make directories

  • 命令所在路径:/bin/mkdir

  • 执行权限:所有用户

  • 语法:mkdir -p [目录名]

  • 功能描述:创建新目录 -p 递归创建( -p 可以递归创建 在没有一级目录的情况下新创建二级目录)

  • tip:创建目录 在/tmp/目录下创建临时文件 只能创建/tmp/……二级目录

  • 范例:

    1
    2
    $ mkdir -p /tmp/Japan/boduo    #(不存在Japan目录,所以要用-p递归创建)
    $ mkdir /tmp/Japan/longze /tmp/Japan/cangjing
(2)rmdir
  • 命令英文原意:remove empty directories

  • 命令所在路径:/bin/rmdir

  • 执行权限:所有用户

  • 语法:rmdir [目录名] font>

  • 功能描述: 删除空目录,只能删除没有文件的空目录 (不经常使用)

  • 范例:

    1
    $ rmdir /tmp/Japan/boduo
(3)cd
  • 命令英文原意:change directory

  • 命令所在路径:shell 内置

  • 命令执行权限:所有用户

  • 语法:cd [目录]

  • 功能描述:切换目录

  • 范例:

    1
    2
    3
    $ cd /tmp/Japan/boduo #切换到指定目录
    $ cd .. #回到上一级目录
    $cd / #回到根目录
(4)pwd
  • 命令英文原意: print working directory
  • 命令所在路径:/bin/pwd
  • 执行权限:所有用户
  • 语法:pwd
  • 功能描述:显示当前目录
  • 范例:$ pwd
(5)cp
  • 命令英文原意:copy

  • 命令所在路径:/bin/cp

  • 执行权限:所有用户

  • 语法:cp -rp [原文件或目录] [目标目录]

    • -r 复制目录
    • -p 保留文件属性,比如保留创建时间,日志文件的复制需要用到
  • 功能描述:复制文件或目录

  • 范例:

    1
    2
    3
    4
    5
    $ cp -r /tmp/Japan/cangjing /root 
    #将目录/tmp/Japan/cangjing 复制到目录/root 下

    $ cp -rp /tmp/Japan/boduo /tmp/Japan/longze /root
    #将/tmp/Japan 目录下的 boduo 和 longze 目录复制到/root 下,保持目录属性
(6)rm
  • 命令英文原意:remove
  • 命令所在路径:/bin/rm
  • 执行权限:所有用户
  • 语法:rm -rf [文件或目录] font>

    • -r 删除目录,一般是rm -rf 连着用
    • -f 强制执行,不在询问
  • 功能描述:删除文件或目录(-r)

  • 范例:

    1
    2
    3
    4
    5
    $ rm /tmp/yum.log 
    #删除文件/tmp/yum.log

    $ rm -rf /tmp/Japan/longze
    #删除目录/tmp/Japan/longze

4.1.3 文件处理命令

(1) touch
  • 命令所在路径:/bin/touch

  • 执行权限:所有用户

  • 语法:touch [文件名] 或 touch[绝对路径+文件名]

  • 功能描述:创建空文件

  • 范例: $ touch Japanlovestory.list

(2) cat
  • 命令所在路径:/bin/cat

  • 执行权限:所有用户

  • 语法:cat [文件名]

  • 功能描述:显示文件内容

    • -n 显示行号
    • -A 显示隐藏字符
  • 范例:

    • $ cat /etc/issue
    • $ cat -n /etc/services
(3) more
  • 命令所在路径:/bin/more

  • 执行权限:所有用户

  • 语法:more [文件名]

    • (空格) 或 f 翻页
    • (Enter) 换行
    • q 或 Q 退出
  • 功能描述:分页显示文件内容,合长的文件内容

  • 范例: $ more /etc/services

(4) less
  • 命令所在路径:/usr/bin/less 执行权限:所有用户

  • 语法:less [文件名]

  • 功能描述:分页显示文件内容(可向上翻页)

  • 范例: $ less /etc/services

  • tips: 按下 / 后可以搜索,会反显高亮 按 q 退出(more 也可以)

(5) head
  • 命令所在路径:/usr/bin/head

  • 执行权限:所有用户

  • 语法:head [文件名]

  • 功能描述:显示文件前面几行

    • -n 指定行数
  • 范例: $ head -n 20 /etc/services

(6) tail
  • 命令所在路径:/usr/bin/tail

  • 执行权限:所有用户

  • 语法:tail [文件名]

  • 功能描述:显示文件后面几行

    • -n 指定行数
    • -f 动态显示文件末尾内容
  • 范例: $ tail -n 18 /etc/services

4.1.4 文件链接命令

(5)ln
  • 命令英文原意:link

  • 命令所在路径:/bin/ln

  • 执行权限:所有用户

  • 语法:ln -s [原文件] [目标文件]

    • -s 创建软链接
  • 功能描述:生成链接文件

  • 范例:

    1
    2
    3
    4
    5
    6
    7
    $ ln -s /etc/issue /tmp/issue.soft 

    #创建文件/etc/issue 的软链接/tmp/issue.soft

    $ ln /etc/issue /tmp/issue.hard

    #创建文件/etc/issue 的硬链接/tmp/issue.hard
  • 软链接

    • 软链接的作用和Windows中的快捷方式是差不多的。他只不过是指向源文件安装路径的符号链接,所以大小也很小
    • 而且它的文件类型是lrwxrwxrwx 看似三种用户都可以拥有所有权限。其实,真正拥有的权限是源文件所决定的权限 ,所以这种显示也是软链接的一大特征之一。
  • 硬链接

    • 硬链接就是把源文件拷贝到目标位置,而他与cp -p 最大的一点区别就是他可以同步更新,源文件有变化硬链接文件也会同时发生变化,但是如果源文件丢失或者被删除,硬链接也并不会消失
    • 可以通过i节点来区分,源文件和硬链接文件的i节点是一样的,所以他们会同步更新
    • 但是他不能跨分区放置硬链接比如:/分区 硬链接 不能放到/boot 分区
    • 而且不能对目录使用

4.2 权限管理命令

4.2.1 权限管理命令 chmod

(1)chmod
  • 命令英文原意:change the permissions mode of a file

  • 命令所在路径:/bin/chmod

  • 执行权限:所有用户

  • 语法:chmod [{ugoa}{+-=}{rwx}] [文件或目录]

    • -R 递归修改

    • u :所有者 g :所属组
      o :其他人 a :所有用户

      1
      2
      3
      4
      chmod g+x,o+r /tmp/testfile
      #就是把testfile文件的所属组增加执行权限,其他人增加读权限
      chmod a=rwx /tmp/testfile
      #就是testfile文件的所有用户增加读写执行权限
  • 功能描述:改变文件或目录的权限

  • 权限的数字表示 :chmod [rwx的和,rwx的和,rwx的和]] [文件或者目录]

    • r —- 4 w —- 2 x —- 1

      例如:rwxrw-r- - 它的权限位数字表示就是 764
      具体算法:
      r+w+x=4+2+1=7
      r+w=4+2+0=6
      r=4+0+0=4

  • chmod -R [rwx的和,rwx的和,rwx的和] [文件或目录]
    这条命令与mkdir -p递归创建目录一样 这个命令把一个目录下的所有子目录的操作权限全部修改为同样的

(2)创建用户命令
  • useradd [用户名] 创建普通用户
  • passwd [用户名] 用户密码
  • su - [用户名] 切换普通用户
(3)权限对文件和目录的含义
代表字符 权限 对文件的含义 对目录的含义
r 读权限 可以查看文件内容 可以cat/more/head/tail/less
w 写权限 可以修改文件内容 可以vim 可以在目录中创建,删除文件,可以touch/mkdir/rmdir/rm
x 执行权限 可以执行文件 可以script(脚本) command(命令) 可以进入目录 可以cd

4.2.2 其他权限管理命令

(1)chown
  • 命令英文原意:change file ownership
  • 命令所在路径:/bin/chown
  • 执行权限:所有用户
  • 语法:chown [用户] [文件或目录]
  • 功能描述:改变文件或目录的所有者 范例:$ chown shenchao fengjie
  • 改变文件 fengjie 的所有者为 shenchao
(2)chgrp
  • 命令英文原意:change file group ownership
  • 命令所在路径:/bin/chgrp
  • 执行权限:所有用户
  • 语法:chgrp [用户组] [文件或目录]
  • 功能描述:改变文件或目录的所属组
  • 范例:$ chgrp lampbrother fengjie

改变文件 fengjie 的所属组为 lampbrother

(3)umask
  • 命令英文原意:the user file-creation mask
  • 命令所在路径:Shell 内置命令
  • 执行权限:所有用户
  • 语法:umask [-S]
  • -S 以 rwx 形式显示新建文件缺省权限

  • 功能描述:显示、设置文件的缺省权限

  • 范例: $ umask -S

tips: 新建文件是默认没有 x 权限(比如:防止木马病毒攻击)

4.3 文件搜索命令

4.3.1 文件搜索命令find

(0)find [搜索范围] [匹配条件]
(1)按关键字 -name | -iname
  • find [搜索范围] -name [关键字] 在特定路径下搜索文件名作为关键字的文件或者目录

  • find [搜索范围] -name [关键字] 这样为带有关键字开头的任何文件都可以被搜索出来*

  • find [搜索范围] -name * [关键字] * 这样为带有关键字的任何文件都可以被搜索出来

  • find [搜索范围] -name [关键字]??? 这样搜索的是关键字后带三个字符的 几个问号为几个字符

  • find [搜索范围] -iname [关键字] 不区分大小写搜索

  • ```shell
    $ find /etc -name init
    #在目录/etc 中查找文件 init
    #-iname 不区分大小写
    $ find /etc -name init
    #在目录/etc 中查找文件名包含 init
    $ find /etc -name init???
    #在目录/etc 中查找文件名 init 开头并有 3 个字符的
    $ find /etc -name init*
    #在目录/etc 中查找文件名 init 开头的
    #tips:* 匹配任意字符,?匹配单个字符

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18



    ##### **(2)按文件大小 -size**

    - **<font color='orange'>find [搜索范围] -size [数据块] </font>**

    - **数据块前面加+表示查找大于这个大小的文件,-表示查找小于这个大小的文件,不加表示查找等于这个大小的文件(一般不常用)**

    - **1个数据块=512字节=0.5KB (1KB=2个数据块)**
    **size后接的数据只能为数据块需要换算,比如需要查找大于100MB的文件**
    **100MB=102400KB=204800个数据块**
    **find /etc -size +204800**
    **数据块为Linux存储文件最小单位**

    - ```shell
    $ find / -size +204800
    #在根目录下查找大于 100MB 的文件
(3)按所有者 -user
  • find [搜索范围] -user [所有者名]
(4)按所属组 -group
  • find [搜索范围] -group [所属组名]
(5)按时间 -amin|-cmin|-mmin
  • 按访问的时间:find [搜索范围] -amin [时间] a:access

  • 按修改属性的时间:find [搜索范围] -cmin [时间] c:change

  • 按修改内容的时间find [搜索范围] -mmin [时间] m:modify

  • +:超过多长时间 -:多长时间以内

(6)其他
  • find [搜索范围] -size [数据块] -a -size [数据块]
    -a:两个条件同时满足
    -o:两个条件满足任意一个即可

    1
    2
    find /etc -size +163840 -a -size -204800
    #在/etc下查找大于80MB小于100MB的文件
  • find [搜索范围] -name [关键字] -a -type f
    在特定路径下搜索文件名作为关键字的文件
    -type 根据不同类型查找
    f:文件
    d:目录
    l:软链接

  • -exec:查找到文件之后并且对其进行各种操作 {} \ ;不能丢

    find [搜索范围] -name [关键字] -exec ls -l {} \ ;
    查找到文件之后并且对其进行查看ls操作。

  • -ok:用于询问确认 一般在删除操作的时候使用,比如:
    find -user yangyang -ok rm {} \ ;
    删除yangyang用户的文件 他会挨个询问你是不是确定删除

  • find [搜索范围] -inum [i节点值] 根据i节点查询
    find /etc -inum 12345 -exec rm {} \ ;
    删除这个i节点文件 非常方便
    也可以用来查询一个文件的硬链接
    find /etc inum 12345 -exec ls -l {} \ ;
    因为硬链接和文件肯定在同一个分区,并且i节点一样

4.3.2 其他文件搜索命令

(1)locate
  • 命令名称:locate
    • 命令所在路径:/usr/bin/locate
    • 执行权限:所有用户
    • 语法:locate 文件名
    • 参数:-i 不区分大小写
    • 功能描述:在文件资料库中查找文件,速度更快。
    • 范例:$ locate inittab
    • tips:
      • 新建文件 locate 不到,可以 updatedb,更新文件资料库后查找
      • /tmp 临时文件不在文件资料库内
(2)which
  • 命令名称:which

  • 命令所在路径:/usr/bin/which

  • 执行权限:所有用户

  • 语法:which 命令

  • 功能描述:搜索命令所在目录及别名信息

  • 范例:$ which ls

(3)whereis
  • 命令名称:whereis

  • 命令所在路径:/usr/bin/whereis

  • 执行权限:所有用户

  • 语法:whereis [命令名称]

  • 功能描述:搜索命令所在目录及帮助文档路径

  • 范例:$ whereis ls

(4)grep
  • 命令名称:grep

  • 命令所在路径:/bin/grep

  • 执行权限:所有用户

  • 语法:grep -iv [指定字串] [文件]

  • 功能描述:在文件中搜寻字串匹配的行并输出

    • -i 不区分大小写
    • -v 排除指定字串
  • 范例:

    • grep mysql /root/install.log
    • # grep -v ^# /etc/inittab 去除以#开头的所有行信息,^表示以 XXX 开头

4.4 帮助命令

(1)man
  • 命令英文原意:manual

  • 命令所在路径:/usr/bin/man

  • 执行权限:所有用户

  • 语法:man [命令或配置文件]

    • (空格) 或 f 翻页
    • (Enter) 换行
    • q 或 Q 退出
  • 功能描述:获得帮助信息

  • 范例:

    • $ man ls

      查看 ls 命令的帮助信息

    • $ man services

      查看配置文件 services 的帮助信息

    • 1 命令的帮助 5 配置文件的帮助

    • man 5 passwd -> 查看配置文件的帮助

(2)whatis
  • 语法:whatis 命令

  • 功能描述:获得命令的简单介绍信息

  • 范例:whatis ls

    1
    2
    3
    [zlx@zlx-vmwarevirtualplatform 桌面]$ whatis ls
    ls (1) - list directory contents
    ls (1p) - list directory contents
(3)apropos
  • 语法:apropos 配置文件名称
  • whatis 类似于精确查找
  • apropos 模糊查找关键字 [功能等于 man -k ] [可以 tab 快速补全]
(3)help
  • 命令所在路径:Shell 内置命令

  • 执行权限:所有用户

  • 功能描述:获得 Shell 内置命令的帮助信息

  • 范例:

    • $ help umask

      查看 umask 命令的帮助信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [zlx@zlx-vmwarevirtualplatform 桌面]$ help umask
    umask: umask [-p] [-S] [模式]
    显示或设定文件模式掩码。

    设定用户文件创建掩码为 MODE 模式。如果省略了 MODE,则
    打印当前掩码的值。

    如果 MODE 模式以数字开头,则被当作八进制数解析;否则是一个
    chmod(1) 可接收的符号模式串。

    选项:
    -p 如果省略 MODE 模式,以可重用为输入的格式输入
    -S 以符号形式输出,否则以八进制数格式输出

    退出状态:
    返回成功,除非使用了无效的 MODE 模式或者选项。

4.4 帮助命令

(1)man
  • 命令英文原意:manual

  • 命令所在路径:/usr/bin/man

  • 执行权限:所有用户

  • 语法:man [命令或配置文件]

    • (空格) 或 f 翻页
    • (Enter) 换行
    • q 或 Q 退出
  • 功能描述:获得帮助信息

  • 范例:

    • $ man ls

      查看 ls 命令的帮助信息

    • $ man services

      查看配置文件 services 的帮助信息

    • 1 命令的帮助 5 配置文件的帮助

    • man 5 passwd -> 查看配置文件的帮助

(2)whatis
  • 语法:whatis 命令

  • 功能描述:获得命令的简单介绍信息

  • 范例:whatis ls

    1
    2
    3
    [zlx@zlx-vmwarevirtualplatform 桌面]$ whatis ls
    ls (1) - list directory contents
    ls (1p) - list directory contents
(3)apropos
  • 语法:apropos 配置文件名称
  • whatis 类似于精确查找
  • apropos 模糊查找关键字 [功能等于 man -k ] [可以 tab 快速补全]
(3)help
  • 命令所在路径:Shell 内置命令

  • 执行权限:所有用户

  • 功能描述:获得 Shell 内置命令的帮助信息

  • 范例:

    • $ help umask

      查看 umask 命令的帮助信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [zlx@zlx-vmwarevirtualplatform 桌面]$ help umask
    umask: umask [-p] [-S] [模式]
    显示或设定文件模式掩码。

    设定用户文件创建掩码为 MODE 模式。如果省略了 MODE,则
    打印当前掩码的值。

    如果 MODE 模式以数字开头,则被当作八进制数解析;否则是一个
    chmod(1) 可接收的符号模式串。

    选项:
    -p 如果省略 MODE 模式,以可重用为输入的格式输入
    -S 以符号形式输出,否则以八进制数格式输出

    退出状态:
    返回成功,除非使用了无效的 MODE 模式或者选项。

4.5 用户管理命令

(1)useradd
  • 命令所在路径:/usr/sbin/useradd

  • 执行权限:root

  • 语法:useradd 用户名

  • 功能描述:添加新用户

  • 范例: $ useradd zlx

(2)passwd
  • 命令所在路径:/usr/bin/passwd

  • 执行权限:所有用户

  • 语法:passwd 用户名

  • 功能描述:设置用户密码

  • 范例:$ passwd zlx

  • tips:普通用户只能更改自己密码,root 用户可以更好所有人密码

(3)who
  • 命令所在路径:/usr/bin/who

  • 执行权限:所有用户

  • 语法:who

  • 功能描述:查看登录用户信息

  • 范例: $ who

  • tips

    • 第一列 登陆用户名
    • 第二列 登陆终端 【tty表示本地终端 pts表示远程登陆终端】
    • 第三列 登陆时间
    • 第四列 登陆主机的IP地址 【如果没有写表示本机登陆】
    1
    2
    [zlx@localhost ~]$ who
    zlx tty2 2021-08-15 15:07 (tty2)
(4)w
  • 命令所在路径:/usr/bin/w

  • 执行权限:所有用户

  • 语法:w

  • 功能描述:查看登录用户详细信息

  • 范例: $ w

  • 第一行显示 “16:02:04 up 56 min, 1 user, load average: 0.03, 0.05, 0.01”

    • 第一个 表示当前时间
    • 第二个 表示服务区系统连续运行时间,没有重启或者关机,衡量服务区稳定性
    • 第三个 表示当前总共有多少个用户登陆
    • 第四个 表示负载均衡指数,分别记录了过去一分钟,五分钟,十五分钟系统的负载情况,加起来除以三就是平均负载指数,系统的负载情况主要是指 CPU和内存的负载情况,数字大表示负载严重
    • uptime命令也可以显示此项数据
  • 第二行显示 “USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT”

    • IDLE:表示用户登录过来后空闲多久
    • JCPU:表示累计占用CPU时间
    • PCPU:表示用户登录后执行的操作占用的CPU时间
    • WHAT:表示执行的操作
    1
    2
    3
    16:02:04 up 56 min,  1 user,  load average: 0.03, 0.05, 0.01
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    zlx tty2 tty2 15:07 56:16 59.42s 0.15s /usr/libexec/gsd-disk-

4.6 压缩解压命令

(1)gzip 和 gunzip
  • gzip [文件名] : 压缩文件,只能压缩文件不能压缩目录,而且不保留原文件压缩后格式为:.gz
  • gunzip [压缩包名] :解压缩.gz文件
  • gzip -d [压缩包名] :解压缩.gz文件
(2)tar
  • 压缩 c:
    • tar [选项] [压缩后文件名] [目录]
      • -c 打包
      • -v 显示详细信息
      • -f 指定文件名
      • -z 打包同时压缩
    • 例子:
      • tar -cfv Japan.tar Japan
        打包目录Japan 并且以Japan.tar命名
      • tar -zcfv Japan.tar.gz Japan
        打包并且压缩 目录Japan 以Japan.tar.gz命名
  • 解压缩 x:
    • tar [选项] [压缩文件名] [目录]
      • -x 解包
      • -v 显示详细信息
      • -f 指定解压文件名
      • -z 解压缩
    • 例子:
      • tar -xfv Japan.tar Japan
        解包目录Japan.tar并且以Japan命名
      • tar -zxfv Japan.tar.gz
        解压缩并且解包目录Japan.tar.gz以Japan命名
(3)zip 和 unzip
  • zip [选项] [压缩后文件或目录名] [文件或目录]:原文件会保留 而且提示压缩比 deflated
    没有gzip压缩比大,不常用。
  • 压缩后格式为:.zip zip -r:压缩目录
  • unzip [压缩文件] :解压zip文件

#####

(4)bzip2 和 bunzip2
  • bzip2 [选项] [文件名] :压缩文件,大型文件一般用这个压缩
  • 例子:
    • bzip2 -k Japan
      -k:保留原文件 如果不需保留可去掉。生成Japan.bz2压缩文件
    • 他还可以与tar结合使用
      tar -cjfv Japan.tar.bz2 Japan
  • bunzip2 [选项] [压缩文件名]: 解压文件
    • -k:保留压缩包
    • 与tar结合使用
      tar -xjfv Japan.tar.bz2 Japan

4.7 网络命令

(1)write
  • 指令所在路径:/usr/bin/write

  • 执行权限:所有用户

  • 语法:write <用户名>

  • 功能描述:给用户发信息,以 Ctrl+D 保存结束

  • 范例: # write linzhiling

  • tips:输入错误,control+delete 删除

(2)wall
  • 命令英文原意:write all

  • 指令所在路径:/usr/bin/wall

  • 执行权限:所有用户

  • 语法:wall [message]

  • 功能描述:发广播信息

  • 范例: # wall ShenChao is a honest man!

(3)ping
  • 命令所在路径:/bin/ping

  • 执行权限:所有用户

  • 语法:ping 选项 IP 地址

  • -c 指定发送次数

  • 功能描述:测试网络连通性

  • 范例: # ping 192.168.1.156

(4)ifconfig
  • 命令所在路径:/sbin/ifconfig

  • 执行权限:root

  • 语法:ifconfig 网卡名称 IP 地址

  • 功能描述:查看和设置网卡信息

  • 范例:# ifconfig eth0 192.168.8.250

(5)mail
  • 命令所在路径:/bin/mail 执行权限:所有用户

  • 语法:mail [用户名]

  • 功能描述:查看发送电子邮件

  • 范例:# mail root

(6)last
  • 命令所在路径:/usr/bin/last

  • 执行权限:所有用户

  • 语法:last

  • 功能描述:列出目前与过去登入系统的用户信息

  • 范例:# last

(7)lastlog
  • 命令所在路径:/usr/bin/lastlog

  • 执行权限:所有用户

  • 语法:lastlog

  • 功能描述:检查某特定用户上次登录的时间

  • 范例:

    • #lastlog
    • #lastlog -u 502
(8)traceroute
  • 命令所在路径:/bin/traceroute 执行权限:所有用户

  • 语法:traceroute

  • 功能描述:显示数据包到主机间的路径

  • 范例:# traceroute www.lampbrother.net

(9)netstat
  • 命令所在路径:/bin/netstat

  • 执行权限:所有用户

  • 语法:netstat [选项]

  • 功能描述:显示网络相关信息

  • 选项:

    • -t : TCP 协议
    • -u : UDP 协议
    • -l : 监听
    • -r : 路由
    • -n : 显示 IP 地址和端口号
  • 范例:

    • # netstat -tlun 查看本机监听的端口
    • # netstat -an 查看本机所有的网络连接
    • # netstat -rn 查看本机路由表
    • 查看某一端口是否被占用:netstat -tunlp |grep 2181
(10)setup
  • 命令所在路径:/usr/bin/setup

  • 执行权限:root

  • 语法:setup

  • 功能描述:配置网络

  • 范例:# setup

4.8 挂载命令

(1)mount
  • 命令位置:/bin/mount
  • 执行权限:所有用户
  • 命令语法:mount [-t 文件系统] 设备文件名 挂载点
  • 范例:# mount -t iso9660 /dev/sr0 /mnt/cdrom
(2)步骤分析
  • 第一步

    放入光盘,虚拟机中放入,或者服务器下载ios文件

  • 第二步

    创建一个空目录,设为挂载点 mkdir /media/cdrom

    /media用来做光盘挂载的,/mnt 也可以

  • 第三步

    输入命令 mount -t iso9660 /dev/sr0 /media/cdrom

    设备文件名默认就是/dev/sr0,文件系统为iso9660 它是国际标准的cd文件格式,它告诉mount命令,我要挂载的是一个标准的cd。

    /dev/cdrom也可以写 /dev/sr0,/dev/cdrom是sr0的软链接

  • 第四步

    进入挂载后的盘符 cd /media/cdrom

  • 第五步

    卸载光盘

    先退出/media/cdrom,输入命令:cd;然后再输入命令:umount /dev/sr0

    注意:如果之前挂载过其他盘,需要卸载之后才能挂载,输入命令:
    umount /dev/sr0

4.9 关机重启命令

(1)shutdown
  • 语法:shutdown [选项] 时间

  • 选项:

    • -c:取消前一个关机命令
      -h:关机
      -r:重启

    • 时间选项

      now 现在关机
      20:30 八点半关机

  • 范例:

    • shutdown -h now 关机
    • shutdown -c 取消上一次设定的关机时间
    • 在服务器上重启需要谨慎,需要先停掉服务,否则物理内存会坏
      而且远程服务器只能重启,关机后需要管理员手动开机
(2)其他关机命令
  • halt
  • poweroff 相当于直接断电
  • init 0
  • 推荐使用shutdown关机,会保存正在运行的服务
(3)其他重启命令
  • reboot
  • init 6
(3)系统的运行级别
  • init 0-6

    • 0:关机
    • 1:单用户 进入选项菜单 只有root用户登陆进去 相当于Windows安全模式F8,只不过没有图形界面
    • 2:不完全多用户,不含NFS服务,没有图形界面 NFS网络文件系统,Linux之间文件传输共享方式,除了NFS服务,和3一样。
    • 3:完全多用户,没有图形界面
    • 4:未分配,没有图形界面
    • 5:图形界面
    • 6:重启
  • 查询系统运行级别:runlevel

  • 退出登录命令:logout

    注意:在服务器中一定要在操作完成之后退出登陆,否则其他人会直接进入你的服务器,造成非常大的损失。最基本的安全意识一定要有!!!

第五章 文本编辑器vim

5.1 vim常用操作

5.1.1 vim简介

  • Vim 是一个功能强大的全屏幕文本编辑器, 是 Linux/UNIX 上最常用的文本编辑器, 它的作用是建立、编辑、显示文本文件。

  • Vim 没有菜单,只有命令。

5.1.2 vim工作模式

image-20210817092541707

(1)三种模式
  • 命令模式:vi/vim+文件名进入命令模式,不可以输入文字,只能识别命令

  • 插入模式:按i/a/o命令进入,可继续输入文字,按Esc退出

  • 编辑模式:在命令模式下按“:”,即可进入编辑模式,可以输入编辑命令,比如保持并退出。

(2)插入命令

a i o

命令 描述
a 在光标所在字符后插入
A 在光标所在行行尾插入
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行
(3)定位命令

G

命令 描述
:set nu 设置行号
:set nonu 取消行号
gg 到第一行
G 到最后一行
nG 到第n行
: n 到第n行 和上面一样的格式
$ 移动到行尾
0 移动到行首
(4)删除命令

x d

命令 描述
x 删除光标所在处的字符
nx 删除光标所在处后n个字符
dd 删除光标所在行
ndd 删除下面n行
dG 删除光标所在行到文件末尾的内容
D 删除光标所在处到行尾内容
:m,nd 删除指定范围的行 m-n的行全部被删除
(5)复制和剪切命令

yy dd p

命令 描述
yy 复制当前行
nyy 复制当前行以下n行
dd 剪切当前行
ndd 剪切当前行以下n行
p 粘贴在当前光标所在行下
P 粘贴在当前光标所在行上
(6)替换和取消命令

r R

命令 描述
r 替换光标所在处字符
R 从光标所在处开始替换字符,按Esc结束
u 撤消上一操作
(7)搜索和替换命令
  • /string 搜索指定字符串string,与less命令操作类似

    • 搜索时忽略大小写:set ic
    • 搜索时不忽略大小写:set noic
    • n 搜索指定字符串的下一个出现位置
  • :%s/oldString/newString/g 不询问,全文替换指定字符串

  • :%s/oldString/newString/c 询问确认,全文替换指定字符串

  • :m,ns/oldString/newString/g 在一定范围内替换指定字符串

(8)保持和退出命令
命令 描述
:w 保存修改
:w new_filename 另存为指定文件
:wq 保存修改并退出
ZZ 快捷键,保存修改退出
:q! 不保存修改退出
:wq! 保存修改并退出(所有者或root可用)

5.2 vim使用技巧

  1. :r !命令
    • 描述:在当前vim文档中,导入命令执行结果
    • 例子:r !date 直接把当前时间导入当前的Vim文档
  2. :map [快捷键] [触发命令]
    • 描述:定义快捷键
    • 注意:其中快捷键需要按ctrl+v+需要设定的键位,设定好之后颜色会变,比如想设定ctrl p为快捷键那么就按ctrl+v+p 会出现^P ,不能按shift+6出现的^,这两个虽然看起来一样但是颜色不一样。触发命令按需要执行的命令的先后顺序来排列,比如给脚本加注释#键就可以把[触发命令]设为I#
    • 例子:map ^P I# 给脚本行首加#注释
  3. :m,ns/^/#/g
    • 描述:指定连续行注释
  4. :m,ns/^#//g
    • 描述:取消连续行注释
  5. :m,ns/^/ \ / \ //g
    • 描述:给连续行首加//
    • 注意//是//的转义
  6. :ab [a内容][b内容]
    • 描述:替换,会自动把b内容替换成a
    • 例子:ab mymail 1530268781@qq.com 当你在vim文档中输入mymail时按回车或者空格会自动变成1530268781@qq.com
  7. 注意:定义的快捷键或ab的内容重启后会消失,这时需要我们在用户的家目录下写配置文件.vimrc,保持快捷键
    • root用户在/root/.vimrc
    • 其他用户在/home/username/.vimrc中编辑

vim键盘图

第六章 软件包管理

6.1 软件包管理简介

6.1.1 源码包

可以看到源代码,但是安装时间较慢;脚本安装包 类似Windows安装软件, 他是写了安装界面的源码包

  • 优点:
    • 1.开源,如果有足够的能力,可以修改源代码
    • 2.可以自由选择所需的功能
    • 3.软件是编译安装,所以更适合自己的系统,使用更加稳定也效率更高
    • 4.卸载方便,直接删除安装目录
  • 缺点:
    • 1.安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
    • 2.编译过程时间较长,安装比二进制安装时间长
    • 3.因为是编译安装,安装过程中一旦报错新手很难解决

6.1.2 二进制包

RPM包,系统默认包,厂商已经进行了编译,看不到源代码,但是安装时间较快

  • 优点:

    • 1.包管理系统简单,只通过几个命令就可以实现包的安装,升级,查询和卸载
    • 2.安装速度比源码包安装快得多
  • 缺点:

    • 1.经过编译,不再可以看到源代码
    • 2.功能选择不如源码包灵活
    • 3.依赖性 :依赖性指的是要想安装A包就得先安装B包,要想安装B包又得先安装C包,所以只能以CBA的顺序安装RPM包,删除的时候得按ABC顺序删除安装包,基本上所有的RPM包全有依赖性
    1
    2
    3
    4
    5
    rpm 是由红帽公司开发的软件包管理方式,使用 rpm 我们可以方便的进行软件的安装、查询、卸载、升
    级等工作。但是 rpm 软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个 rpm 包组成时。
    yum(全称为 Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包
    管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关
    系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

6.2 rpm命令管理

6.2.1 包命名与依赖性

(1)rpm包命名规则

Httpd-2.2.15.el6.centos.1.i686.rpm

  • Httpd 软件包包名
  • 2.2.15 软件版本
    15 软件发布的次数
  • el6.centos 适合的Linux平台
  • i686 适合的硬件平台 noarch 表示任何硬件平台都可以安装
  • rpm rpm包扩展名
    如果自己组建rpm包,都以rpm结尾,这样更加清晰,其他管理员可以明白
  • 注意:Httpd-2.2.15.el6.centos.1.i686.rpm为包全名,Httpd 为包名是有区别的,Linux系统命令严格区分两者
(2)依赖性
  • 树形依赖:a→b→c
  • 环形依赖:a→b→c→a
    环形依赖需要把a,b,c三个同时安装
  • 模块依赖:模块依赖查询网站:www.rpmfind.net
    如果安装时遇到问题,出现依赖性错误
    被依赖文件以.so.[数字]结尾的为库依赖,需要直接安装这个软件,错误会自动解决
    安装这个包时需要进入网站 www.rpmfind.net.查询被依赖文件

6.2.2 安装、升级与卸载

(1)包全名与包名
  • 包全名:操作的包是没有安装的软件包时, 使用包全名。而且要注意路径
  • 包名::操作已经安装的软件包时,使用包名。是默认在搜索/var/lib/rpm中的数据库
(2)rpm安装
  • rpm –ivh 包全名

  • 选项:

    • -i(install) 安装
    • -v(verbose) 显示详细信息
    • -h(hash) 显示进度
    • –nodeps 不检测依赖性。 一般不用,安装时都得显示依赖性
(3)rpm包升级
  • rpm -Uvh 包全名

  • 选项:

    • -U(upgrade) 升级
(4)rpm卸载
  • rpm -e 包名

  • 选项:

    • -e(erase) 卸载
    • –nodeps 不检查依赖性

6.2.3 查询

(1)查询是否安装
  • rpm -q 包名

    • 查询包是否安装
    • 选项: -q 查询(query)
  • rpm –qa

    • 查询所有已经安装的 RPM
    • 选项:-a 所有(all)
  • rpm -qa | grep [关键字]

    • 查询所有含义关键字的包,| 为管道符 。作用是管道符左边命令的输出就会作为管道符右边命令的输入
    • 注意:
      1、管道命令只处理前一个命令正确输出,不处理错误输出。
      2、管道命令右边命令,必须能够接收标准输入流命令才行。
(2)查询软件包详细信息
  • rpm –qi 包名

  • 查询安装过的软件包的详细信息

  • 选项:

    • -i 查询软件信息(information)
    • -p 查询未安装包信息(package)
(3)查询包中文件安装位置
  • rpm –ql 包名

  • 选项:

    • -l 列表(list)
    • -p 查询未安装包信息(package)
(4)查询系统文件属于哪个rpm包
  • rpm –qf 系统文件名

  • 选项:

    • -f 查询系统文件属于哪个软件包(file)
(5)查询软件包的依赖性
  • rpm –qR 包名

  • 选项:

    • -R 查询软件包的依赖性(requires)
    • -p 查询未安装包信息(package)

6.2.4 校验和文件提取

(1)rpm包校验
  • rpm –V 已安装的包名

  • 选项:

    • -V 校验指定 RPM 包中的文件(verify)
  • 验证内容中的 8 个信息的具体内容如下:

    • S 文件大小是否改变
    • M 文件的类型或文件的权限(rwx)是否被改变
    • 5 文件 MD5 校验和是否改变(可以看成文件内容是否改变)
    • D 设备的中,从代码是否改变
    • L 文件路径是否改变
    • U 文件的属主(所有者)是否改变
    • G 文件的属组是否改变
    • T 文件的修改时间是否改变
  • 文件类型

    • c 配置文件(config file)

    • d 普通文档(documentation)

    • g “鬼”文件(ghost file),很少见,就是该文件不应该被这个RPM包包含

    • l 授权文件(license file)

    • r 描述文件(read me)

(2)rpm包中文件提取
  • rpm2cpio 包全名 | cpio -idv .文件绝对路径
    • rpm2cpio :将 rpm 包转换为 cpio 格式的命令
    • cpio :是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
  • cpio 选项 < [文件|设备]
    • 选项:
      • -i:copy-in 模式,还原
      • -d:还原时自动新建目录
      • -v:显示还原过程

6.3 rpm包管理

6.3.1 IP地址配置和网络yum源

(1)IP地址配置
  • 红帽使用setup 命令配置IP,子网掩码,网关,DNS
    然后service network restart 重启网络服务

  • CentOS7使用nmtui命令配置IP,子网掩码,网关,DNS
    然后service network restart 重启网络服务

  • 启动网卡

    vi /etc/sysconfig/network-scripts/ifcfg-eth0

    把 ONBOOT=“no” 改为 ONBOOT=“yes“

  • 重启网络服务

    service network restart

(2)网络yum源
  • vi /etc/yum.repos.d/CentOS-Base.repo
    其中:

    • CentOS-Base.repo为网络yum源
    • CentOS-Media.repo为本地磁盘yum源
  • 进入yum内部配置文件中可以看到以下内容:

  • [base]:容器名称,一定要放在[]中

  • name:容器说明,可以自己随便写

  • mirrorlist:镜像站点,这个可以注释掉

  • baseurl:我们的yum源服务器的地址。默认是CentOS的官方的yum源服务器,是可以使用的,如果觉得慢可以改成你喜欢的yum镜像源地址

  • enabled:此容器是否生效
    如果不写或者写成enable=1都是生效的,写成enable=0就是不生效

  • gpgcheck:如果1是指RPM的数字证书生效,如果是0则不生效

  • gpgkey:数字证书的公钥文件保存位置。不用修改

image-20211215145608598

1
2
3
镜像列表系统使用客户机的连接IP地址和每个镜像的更新状态来选择地理位置上的当前镜像接近客户。
你应该在CentOS更新中使用这个,除非你手动选择其他镜像。
如果镜像列表不适合您,您可以尝试注释掉的baseurl行。

6.3.2 yum命令

(1)常用yum命令
  • 查询

    • yum list #查询所有可用软件包列表
    • yum search 关键字 #搜索服务器上所有和关键字相关的包
  • 安装

    • yum –y install 包名
    • install 安装
    • -y 自动回答 yes
  • 升级

    • yum -y update 包名、
    • update 升级
    • -y 自动回答 yes

    ==注意:yum -y update 后必须加包名,否则就是全盘更新,包括Linux内核也会更新,Linux内核在更新完成之后需要在本地进行配置,内核才可以启动,如果你是在服务器上跑这条命令,服务器直接崩溃,永远无法连接,再也不能启动!!!==

  • 卸载

    • yum -y remove 包名
    • remove 卸载
    • -y 自动回答 yes

    ==注意:yum -y remove卸载会把包所有的依赖包都会卸载,有时候会把系统文件也同时卸载,小心使用,尽量不要多用!==

  • Linux服务器安装软件包原则:

    最小化安装,不安装多余软件,使用什么软件安装什么软件,手工装,尽量不卸载,尤其yum卸载尽量不要用!!!

(2)yum软件组管理命令
  • yum grouplist

    #列出所有可用的软件组列表

  • yum groupinstall 软件组名

#安装指定软件组,组名可以由 grouplist 查询出来

  • yum groupremove 软件组名

    #卸载指定软件组

  • tips:安装软件包组 有空格 用””括起来

6.3.3 光盘yum源搭建

(1)光盘yum源搭建
  • 第一步:挂载光盘

     **mount /dev/cdrom /mnt/cdrom/** 
    
  • 第二步:让网络yum源失效

    把/etc/yum.repos.d/文件里除了CentOS-Media.repo文件的其他文件全部改名,把repo后缀改了,随便改一个,比如.bak
    ​ 还可以让每个文件里面的enabled=0

改名具体命令: mv CentOS-Base.repo \ CentOS-Base.repo.bak

  • 第三步:修改光盘yum源文件

    vim CentOS-Media.repo

1
2
3
4
5
6
7
8
9
10
11
[c6-media] 	#叫什么都可以
name=CentOS-$releasever - Media # 名称叫什么都可以
baseurl=file:///mnt/cdrom
#地址为你自己的光盘挂载地址
# file:///media/cdrom/
# file:///media/cdrecorder/
#注释这两个不存在的地址 ( 不注释也没事,但是会显示报错)
gpgcheck=1
enabled=1
#把 enabled=0 改为 enabled=1,让这个 yum 源配置文件生效
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
(2)Linux系统中挂载和使用光盘基本步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1. 创建挂载点 
mkdir /mnt/cdrom
在 /mnt 目录下创建一个空文件夹 cdrom 作为光盘的挂载点(任何一个空目录都可以作为挂载点)。

2. 打开光驱,放入光盘
如果用的是 VMware 中的虚拟机,进入虚拟机设置,选择“CD/DVD”硬件,勾选“已连接”和“启动时连接”,在连接处,选择“使用 ISO 映像文件”,浏览选择本地电脑中下载好的 ISO 光盘镜像文件,确定即可。

3. 执行挂载命令
mount -t iso9660 /dev/sr0 /mnt/cdrom
或者
mount /dev/sr0 /mnt/cdrom
iso9660 是光盘的默认文件系统。
由于 linux 系统可以自动识别光盘的文件系统,故“-t iso9660”也可以省略不写。
光盘的设备文件名是固定的,一般为/dev/cdrom 或/dev/sr0。
挂载成功后,就可以通过挂载点读取光盘里面的数据。

4. 查看光盘中的数据
cd /mnt/cdrom
ls -l
注意:操作完成之后,如果要取出光盘,必须解除挂载。

5. 解除挂载
不能在挂载点目录下解除挂载,必须先切换到其他目录(如用户家目录)。
切换到用户家目录
umount /dev/sr0
或者
umount /mnt/cdrom

6.4 源码包管理

6.4.1 源码包和rpm包的区别

(1)区别

安装之前的区别:概念上的区别

安装之后的区别:安装位置不同

(2)rpm包安装位置

安装在默认位置中

默认安装路径 类型
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置
(3)源码包安装路径

安装在指定位置中,一般是 /usr/local/软件名/

(4)安装位置不同带来的影响
  • RPM 包安装的服务可以使用系统服务管理命令(service)来管理,例如 RPM 包安装的 apache 的启动方法是:

    • /etc/rc.d/init.d/httpd start

    • service httpd start

    • RPM包的启动文件全在/etc/rc.d/init.d/里,servic会搜索RPM包所有的安装路径,所以service才能启动RPM包软件,但是启动不了源码包软件,因为源码包在/usr/local里,和RPM包不一样

  • 而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所以只能用绝对路径进行服务的管理,如:

    • /usr/local/apache2/bin/apachectl start

6.4.2 源码包安装过程

以“安装Apache”为例说明

(1)安装准备
  • 安装C语言编译器

    yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake

  • 下载源码包

    http://mirror.bit.edu.cn/apache/httpd/

    选择任何版本,比如:httpd-2.4.43.tar.bz2 版本

(2)注意事项
  • 源码包保存位置:/usr/local/src

  • 软件安装位置:/usr/local

  • 如何确定安装过程报错:

    安装过程停止,并出现error,warning或者no提示,即发生错误

  • 把电脑下载好的源码包传输到Linux系统或者服务器上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Windows下载WinSCP软件进行本机与虚拟机或者远程传输

    Mac连接远程阿里云服务器,终端使用命令 scp进行传输:
    scp -r localfile.txt username@192.168.0.1:/home/username/
    其中,
    1)scp是命令,-r是参数
    2)localfile.txt 是文件的路径和文件名
    3)username是服务器账号,一般为root
    4)192.168.0.1是要上传的服务器ip地址
    5)/home/username/是要拷入的文件夹路径,一般为/root 家目录
    例子:
    scp -r /Users/yangyangyang/Desktop/httpd-2.4.43.tar.bz2 root@47.95.5.171:/root
(3)解压下载的源码包
  • bar.bz2压缩包:使用命令 tar -jxvf httpd-2.4.43.tar.bz2
  • tar.gz压缩包:使用命令tar -zxvf
(4)进入压缩目录
  • 输入命令:cd httpd-2.4.43
    • INSTALL:安装说明
    • README:使用说明
  • 进入安装说明:vi INSTALL
    $ ./configure –prefix=PREFIX 编译前准备
    $ make 进行编译
    $ make install 编译安装
    $ PREFIX/bin/apachectl star 启动命令
  • 这些为详细的安装步骤,其中:
    ./configure为软件配置与检查 我们也称编译前准备
    1.定义需要的功能选项。
    2.检测系统环境是否符合安装要求
    3.把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑。
(5)定义安装路径

退出之后
​ 输入命令:./configure –prefix=/usr/local/apache2
​ 如果报错显示:
​ 进以下网址寻求解决办法
http://www.cnblogs.com/yuzhaokai0523/p/4382974.html

(6)进行编译

输入命令:make 进行编译

(7)进行安装

输入命令:make install 编译安装

(8)启动

输入命令:/usr/local/apache2/bin/apachectl start

$ PREFIX/bin/apachectl star中 $ PREFIX为软件安装路径

(9)启动apach遇到错误

httpd: Could not reliably determine the server’s fully qualified domain name

解决办法:

1.cd /usr/local/apache2/conf
​ 2.vi httpd.conf
​ 找到#ServerName www.example.com:80
​ 并且在下面一行添加
​ ServerName localhost:80 # localhost可以换成阿里云的IP
​ 3.保存并退出
​ 4.再重新启动apache
​ /usr/local/apache2/bin/apachectl start

6.5 脚本包安装

6.5.1 脚本安装包

  • 脚本安装包并不是独立的软件包类型,常见安装的是源码包。

  • 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装。

  • 非常类似于 Windows 下软件的安装方式。

6.5.2 Wemin

(1)Wemin的作用

Webmin 是一个基于 Web 的 Linux 系统管理界面。您就可以通过图形化的方式设置用户帐号、Apache、DNS、文件共享等服务。

(2)安装过程

第七章 用户和用户组管理

7.1 用户配置文件

7.1.1 用户信息文件 /etc/passwd

(1)用户管理简介
  • 越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。

  • 在 Linux 中主要是通过用户配置文件来查看和修改用户信息

  • 通过命令:man 5 passwd 来查看passwd配置文件帮助信息 5代表配置文件

(2)/etc/passwd 配置文件
  • 第 1 字段:用户名称

  • 第 2 字段:密码标志

  • 第 3 字段:UID(用户 ID)

    • 0: 超级用户
    • 1-499: 系统用户(伪用户)
    • 500-65535: 普通用户(centos7 从 1000 开始计算)
  • 第 4 字段:GID(用户初始组 ID)[不推荐修改初始组]

  • 第 5 字段:用户说明

  • 第 6 字段:家目录

    • 普通用户:/home/用户名/
    • 超级用户:/root/
  • 第 7 字段:登录之后的 Shell

  • image-20211217154607305

(3)初始组和附加组
  • 初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。

  • 附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。

(2)Shell是什么
  • Shell 就是 Linux 的命令解释器。

  • 在/etc/passwd 当中,除了标准 Shell 是/bin/bash 之外,还可以是/sbin/nologin,/usr/bin/passwd 等。

  • tips:暂时禁用用户,可以把/bin/bash -> /bin/nologin

7.1.2 影子文件/etc/shadow

(1)影子文件/etc/shadow
  • 第 1 字段:用户名

  • 第 2 字段:加密密码

    • 加密算法升级为 SHA512 散列加密算法
    • 如果密码位是“!!”或“*”代表没有密码,不能登录
  • 第 3 字段:密码最后一次修改日期

    • 使用 1970 年 1 月 1 日作为标准时间,每过一天时间戳加 1
  • 第 4 字段:两次密码的修改间隔时间(和第 3 字段相比)

  • 第 5 字段:密码有效期(和第 3 字段相比)

  • 第 6 字段:密码修改到期前的警告天数(和第 5 字段相比)

  • 第 7 字段:密码过期后的宽限天数(和第 5 字段相比)

    • 0:代表密码过期后立即失效
    • -1:则代表密码永远不会失效。
  • 第 8 字段:账号失效时间

  • 要用时间戳表示

  • 第 9 字段:保留

image-20211217155913026

(2)时间戳换算
  • 把时间戳换算为日期
    • date -d “1970-01-01 16066 days”
  • 把日期换算为时间戳
    • echo $(($(date –date=”2014/01/06” +%s)/86400+1))
1
2
3
4
[root@iZwz9evxymdqdx2e88fv2sZ ~]# date -d "1970-01-01 16066 days"
Fri Dec 27 00:00:00 CST 2013
[root@iZwz9evxymdqdx2e88fv2sZ ~]# echo $(($(date --date="2014/01/06" +%s)/86400+1))
16076

7.1.3 组信息文件

(1)组信息文件/etc/group
  • 第一字段:组名
  • 第二字段:组密码标志
  • 第三字段:GID
  • 第四字段:组中附加用户

7.1.4 组密码文件

(1)组密码文件/etc/gshadow
  • 第一字段:组名
  • 第二字段:组密码 (不推荐使用,可以理解为给组设置个小组长)
  • 第三字段:组管理员用户名
  • 第四字段:组中附加用户

7.2 用户管理相关文件

(1) 用户的家目录
  • 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是 700

  • 超级用户:/root/,所有者和所属组都是 root 用户,权限是 550

(2)用户的邮箱
  • /var/spool/mail/用户名/
(3)用户模板目录
  • /etc/skel/

7.3 用户管理命令

7.3.1 用户添加命令 useradd

(1)useradd命令格式
  • useradd [选项] 用户名

  • 选项:

    • -u UID: 手工指定用户的 UID 号
    • -d 家目录: 手工指定用户的家目录
    • -c 用户说明: 手工指定用户的说明
    • -g 组名: 手工指定用户的初始组
    • -G 组名: 指定用户的附加组
    • -s shell: 手工指定用户的登录 shell。默认是/bin/bash
(2)添加默认用户
  • [root@localhost ~]# useradd lamp

  • [root@localhost ~]# grep “lamp” /etc/passwd l

  • [root@localhost ~]# grep “lamp” /etc/shadow

  • [root@localhost ~]# grep “lamp” /etc/group

  • [root@localhost ~]# grep “lamp” /etc/gshadow

  • [root@localhost ~]# ll -d /home/lamp/

  • [root@localhost ~]# ll /var/spool/mail/lamp

(3)指定选项添加用户
  • groupadd lamp1

  • useradd -u 550 -g lamp1 -G root -d /home/lamp1 \ -c “test user” -s /bin/bash lamp1、

(4)用户默认值文件

里面定义了建立用户的默认信息

  • /etc/default/useradd

    • GROUP=100 #用户默认组

    • HOME=/home #用户家目录

    • INACTIVE=-1 #密码过期宽限天数(7)

    • EXPIRE= #密码失效时间(8)

    • SHELL=/bin/bash #默认 shell

    • SKEL=/etc/skel #模板目录

    • CREATE_MAIL_SPOOL=yes #是否建立邮箱

  • /etc/login.defs

    • PASS_MAX_DAYS 99999 #密码有效期(5)

    • PASS_MIN_DAYS 0 #密码修改间隔(4)

    • PASS_MIN_LEN 5 #密码最小 5 位(PAM)

    • PASS_WARN_AGE 7 #密码到期警告(6)

    • UID_MIN 500 #最小和最大 UID 范围

    • GID_MAX 60000

    • ENCRYPT_METHOD SHA512 #加密模式

7.3.2 修改用户密码 passwd

(1)passwd 命令格式
  • passwd [选项] 用户名

  • 选项:

    • -S 查询用户密码的密码状态。仅 root 用户可用。
    • -l 暂时锁定用户。仅 root 用户可用
    • -u 解锁用户。仅 root 用户可用
    • –stdin 可以通过管道符输出的数据作为用户的密码。
(2)查看密码状态
  • passwd -S lamp

  • lamp PS 2013-01-06 0 99999 7 -1

    • 用户名 密码设定时间(2013-01-06) 密码修改间隔时间(0) 密码有效期(99999 ) 警告

      时间(7) 密码不失效(-1)

(3)锁定用户和解锁用户
  • passwd -l lamp

  • passwd -u lamp

(4) 使用字符串作为用户的密码
  • echo “123” | passwd –stdin lamp(shell 脚本可能会用到)

7.3.3 修改用户信息 usermod

(1)命令
  • usermod [选项] 用户名

  • 选项:

    • -u UID: 修改用户的 UID 号
    • -c 用户说明: 修改用户的说明信息
    • -G 组名: 修改用户的附加组
    • -L: 临时锁定用户(Lock)
    • -U: 解锁用户锁定(Unlock)
(2)举例
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# usermod -c "test user" lamp
修改用户的说明

[root@localhost ~]# usermod -G root lamp
把 lamp 用户加入 root 组

[root@localhost ~]# usermod -L lamp
锁定用户

[root@localhost ~]# usermod -U lamp
解锁用户

7.3.4 修改用户密码状态 chage

(1)命令
  • chage [选项] 用户名

  • 选项:

    • -l: 列出用户的详细密码状态
    • -d 日期: 修改密码最后一次更改日期(shadow3 字段)
    • -m 天数: 两次密码修改间隔(4 字段)
    • -M 天数: 密码有效期(5 字段)
    • -W 天数: 密码过期前警告天数(6 字段)
    • -I 天数: 密码过后宽限天数(7 字段)
    • -E 日期: 账号失效时间(8 字段)
(2)举例
1
2
3
[root@localhost ~]# chage -d 0 lamp 
这个命令其实是把密码修改日期归 0 了(shadow 第 3 字段)#这样用户一登陆就要修改
密码

7.3.4 删除用户 userdel

(1)删除用户 userdel
  • userdel [-r] 用户名

  • 选项:

    • -r 删除用户的同时删除用户家目录
(2)查看用户ID
  • id 用户名

7.3.5 切换用户 su

  • su [选项] 用户名

  • 选项

    • - : 选项只使用“-”代表连带用户的环境变量一起切换 (env 命令查看当前环

      境变量)

    • -c 命令: 仅执行一次命令,而不切换用户身份

    • 例子

      • $ su – root

        #切换成 root

      • su - root -c “useradd user3”

        #不切换成 root,但是执行 useradd 命令添加 user1 用户

7.4 用户组管理命令

(1)添加用户组
  • groupadd [选项] 组名

  • 选项:

    • -g GID #指定组 ID
(2)修改用户组
  • groupmod [选项] 组名

  • 选项:

    • -g GID #修改组 ID

    • -n 新组名 #修改组名

    • 例:[root@localhost ~]# groupmod -n yxlm lol

      #把组名 lol 修改为 yxlm

(3)删除用户组
  • groupdel [选项] 组名

  • tips:删除组的时候,组内不允许有初始用户存在。

    1
    2
    3
    4
    5
    6
    7
    8
    $ groupadd lol

    $ useradd -g lol timo

    $ useradd -G lol yasuo

    因为 timo 是初始组是 lol。删除 lol 会导致 timo 没有初始组。所以不可删。需要先删除用户。
    而 yasuo 是附加组。可删。
(4) 把用户添加入组或从组中删除
  • groupdel [选项] 组名

  • 选项:

    • -a 用户名: 把用户加入组
    • -d 用户名: 把用户从组中删除

第八章 权限管理

8.1 ACL权限

8.1.1 ACL权限简介与开启

(1)ACL权限简介

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的

read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行

r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

image-20211221150819748

(2)查看分区ACL权限是否开启
  • dumpe2fs -h /dev/sda3

    #dumpe2fs 命令是查询指定分区详细文件系统信息的命令

  • 选项: -h 仅显示超级块中信息,而不显示磁盘块组的详细信息

(3)临时开启分区ACL权限
  • mount -o remount,acl /

    #重新挂载根分区,并挂载加入 acl 权限

(4)永久开启ACL权限
  • vim /etc/fstab
    显示:UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 / ext4 defaults 1 1
  • 在ext4后面的 defaults加,acl 成为
    UUID=59d9ca7b-4f39-4c0c-9334-c56c182076b5 / ext4 defaults,acl 1 1
  • 然后输入:mount -o remount /
    重新挂载文件系统或重启系统,使修改生效
  • Linux现在一般所有分区全部默认开启ACL,不用修改配置

8.1.2 ACL权限查看与设定

(1)查看ACL权限
  • getfacl 文件名

    查看ACL命令 查看ACL权限

(2)设定ACL权限
  • setfacl [选项] 文件名

  • 选型:

    • -m:设定ACL权限
      例子:
      • setfacl -m u:st:rx /tmp/project 给用户st设定ACL权限读和操作
      • setfacl -m g:tg1:rwx /tmp/project 给用户组tg1设定ACL权限读,写和操作
        -x:删除指定的ACL权限
    • -b:删除所有的ACL权限
    • -d:设定默认的ACL权限
    • -k:删除默认ACL权限
    • -R:递归设定ACL权限
  • 举例

    • 给用户设定ACL权限
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@localhost ~]# useradd zhangsan 
    [root@localhost ~]# useradd lisi
    [root@localhost ~]# useradd st
    [root@localhost ~]# groupadd tgroup
    [root@localhost ~]# mkdir /project
    [root@localhost ~]# chown root:tgroup /project/
    [root@localhost ~]# chmod 770 /project/
    [root@localhost ~]# setfacl -m u:st:rx /project/
    #给用户 st 赋予 r-x 权限,使用“u:用户名:权限”格式
    • 给用户组设定ACL权限
    1
    2
    3
    [root@localhost /]# groupadd tgroup2 
    [root@localhost /]# setfacl -m g:tgroup2:rwx project/
    #为组 tgroup2 分配 ACl 权限。使用“g:组名:权限”格式

8.1.3 最大有效权限与删除ACL权限

(1)最大有效权限mask
  • mask是用来指导最大有效权限的。如果给用户赋予了ACL权限,是需要和mask 的权限“相与”才能得到用户的真正权限
  • setfscl -m m:rx 文件名
    设定mask权限为r-x。使用“m:权限”格式
  • 为了防止用户或者用户组给的权限过高,提前设定
(2)权限删除
  • setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
  • setfacl -x g:组名 文件名 #删除指定用户组的ACL权限
  • setfacl -b 文件名 #删除文件的所有ACL权限

8.1.4 ACL权限递归与默认

(1)递归ACL权限
  • 递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限
  • 命令:
    • setfacl -m u:用户名:权限 -R 目录名
    • -R必须在这个位置
(2)默认ACL权限
  • 默认ACL权限的作用是,如果给父目录设定默认ACL权限,那么父目录中所有新建的子文件和子目录都会继承父目录的ACL权限
  • 命令:
    • Setfacl -m d:u:用户名:权限 目录名
    • 可以在权限后面加-R来进行递归

8.2 文件特殊权限

8.2.1 SetUID

(1)SetUID的功能
  • 只有可以执行的二进制程序才能设定 SUID 权限

  • 命令执行者要对该程序拥有 x(执行)权限

  • 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)

  • SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

  • passwd 命令拥有 SetUID 权限,所以普通可以修改自己的密码

    • [root@localhost ~]# ll /usr/bin/passwd

      -rwsr-xr-x. 1 root root 25980 2 月 22 2012 /usr/bin/passwd

  • cat 命令没有 SetUID 权限,所以普通用户不能查看/etc/shadow 文件内容

    • [root@localhost ~]# ll /bin/cat -rwxr-xr-x 1 root root 47976 6 月 22 2012 /bin/cat

image-20211222132551724

(2)设定SetUID的方法
  • chmod 4755 文件名 # 4代表SUID
  • chmod u+s 文件名
(3)取消SetUID的方法
  • chmod 755 文件名
  • chmod u-s 文件名
(4)危险的SetUID
  • 关键目录应严格控制写权限。比如“/”、“/usr”等
  • 用户的密码设置要严格遵守密码三原则
  • 对系统中默认应该具有 SetUID 权限的文件作一列表,定时检查有没有这之外的文件被设置了 SetUID 权限

8.2.2 SetGID

(1)SetGID 针对文件的作用
  • 只有可执行的二进制程序才能设置 SGID 权限

  • 命令执行者要对该程序拥有 x(执行)权限

  • 命令执行在执行程序的时候,组身份升级为该程序文件的属组

  • SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

    • [root@localhost ~]# ll /usr/bin/locate

      -rwx–s–x 1 root slocate 35612 8 月 24 2010 /usr/bin/locate

      [root@localhost ~]# ll /var/lib/mlocate/mlocate.db

      -rw-r—– 1 root slocate 1838850 1 月 20 04:29 /var/lib/mlocate/mlocate.db

(2)SetGID 针对目录的作用
  • 普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录

  • 普通用户在此目录中的有效组会变成此目录的属组

  • 若普通用户对此目录拥有 w 权限时,新建的文件的默认属组是这个目录

(3)设定 SetGID
  • chmod 2755 文件名 # 2 代表 SGID

  • chmod g+s 文件名

(4) 取消 SetGID
  • chmod 755 文件名

  • chmod g-s 文件名

8.3.3 Sticky BIT

(1)SBIT 粘着位作用
  • 粘着位目前只对目录有效

  • 普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限

  • 如果没有粘着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。

  • 一但赋予了粘着位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件 。

(2)设置与取消粘着位
  • 设置粘着位

    • chmod 1755 目录名 #1代表粘着位
    • chmod o+t 目录名
  • 取消粘着位

    • chmod 777 目录名
    • chmod o-t 目录名

8.3 文件系统属性chattr权限

(1)chattr命令格式
  • chattr [+ - =] [选项] 文件名或者目录名
    +:增加权限
    -:删除权限
    =:等于某权限
  • 选项:
    • i:如果对文件设置i属性,那么不允许对文件进行删除,改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但是不允许建立和删除文件
    • a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除或者修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除文件
(2)查看文件系统属性
  • lsattr [选项] 文件名
    • -a:显示所有文件和目录
    • -d:若目标是目录,仅列出目录本身的属性,而不是子文件的

8.4 系统命令sudo权限

(1)sudo 权限
  • root 把本来只能超级用户执行的命令赋予普通用户执行。
  • sudo 的操作对象是系统命令
(2)sudo 使用
  • visudo #实际修改的是/etc/sudoers 文件

  • ```shell
    root ALL=(ALL) ALL
    #用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)

    %wheel ALL=(ALL) ALL
    #%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
    #被管理主机的地址:本机IP或者ALL,限制的不是来源IP,而是访问IP

    1
    2
    3
    4
    5
    6

    - **授权 sc 用户可以重启服务器**

    ```shell
    [root@localhost ~]# visudo
    sc ALL= /sbin/shutdown –r now
(3)其他
  • 普通用户执行 sudo 赋予的命令

    sudo [授权命令的绝对路径]
    例子:
    sudo /sbin/shutdown -r now

  • 查看可用的sudo命令

    sudo -l

第九章 文件系统管理

9.1 分区和文件系统

(1)分区类型
  • 主分区:总共最多只能分四个
  • 扩展分区:只能有一个,也算作主分区的一种,也就是说主分区加扩展分区最多有四个。但是扩展分区不能存储数据和格式化,必须再划分成逻辑分区才能使用。
  • 逻辑分区:逻辑分区是在扩展分区中划分的,如果是 IDE 硬盘,Linux 最多支持59 个逻辑分区,如果是 SCSI 硬盘 Linux 最多支持 11 个逻辑分区
(2)分区的表示方法

image-20211223121525506

image-20211223121533212

image-20211223121538848

image-20211223121543169

(3)文件系统
  • ext2:是 ext 文件系统的升级版本,Red Hat Linux7.2 版本以前的系统默认都是ext2 文件系统。1993 年发布,最大支持 16TB 的分区和最大 2TB 的文件(1TB=1024GB=1024*1024KB)
  • ext3: ext3 文件系统是 ext2 文件系统的升级版本,最大的区别就是带日志功能,以在系统突然停止时提高文件系统的可靠性。支持最大 16TB 的分区和最大2TB 的文件
  • ext4:它是 ext3 文件系统的升级版。ext4 在性能、伸缩性和可靠性方面进行了大量改进。EXT4 的变化可以说是翻天覆地的,比如向下兼容 EXT3、最大 1EB 文件系统和 16TB 文件、无限数量子目录、Extents 连续数据块概念、多块分配、延迟分配、持久预分配、快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等。是 CentOS 6.3 的默认文件系统 (1EB=1024PB=1024*1024TB)

9.2 文件系统常用命令

9.2.1 df 命令、du 命令、fsck 命令和 dump2fs 命令

(1)文件系统查看命令 df
  • df [选项] [挂载点]

  • 选项:

    • -a 显示所有的文件系统信息,包括特殊文件系统,如 /proc、/sysfs

    • -h 使用习惯单位显示容量,如 KB,MB 或 GB 等

    • -T 显示文件系统类型

    • -m 以 MB 为单位显示容量

    • -k 以 KB 为单位显示容量。默认就是以 KB 为单位

(2)统计目录或文件大小 du
  • du [选项] [目录或文件名]

  • 选项:

    • -a 显示每个子文件的磁盘占用量。默认只统计 子目录的磁盘占用量

    • -h 使用习惯单位显示磁盘占用量,如 KB,MB 或 GB 等

    • -s 统计总占用量,而不列出子目录和子文件的 占用量

  • du 命令和 df 命令的区别

    • df 命令是从文件系统考虑的,不光要考虑文件占用的空间,还要统计被命令或程序占用的空间(最常见的就是文件已经删除,但是程序并没有释放空间)

    • du 命令是面向文件的,只会计算文件或目录占用的空间

(3)文件系统修复命令 fsck
  • fsck [选项] 分区设备文件名

  • 选项:

    • -a: 不用显示用户提示,自动修复文件系统

    • -y: 自动修复。和-a 作用一致,不过有些文件系统只支 持-y

  • 注意:知道就行,不必操作,有可能弄崩溃系统

(4)显示磁盘状态命令 dumpe2fs
  • dumpe2fs 分区设备文件名

9.2.2 挂载命令

(1)查询与自动挂载
  • mount [-l]

    #查询系统中已经挂载的设备,-l 会显示卷标名称

  • mount –a

    #依据配置文件/etc/fstab 的内容,自动挂载

(2)挂载命令格式
  • mount [-t 文件系统] [-L 卷标名] [-o 特殊选项] 设备文件名 挂载点
  • -t 文件系统:加入文件系统类型来指定挂载的类型,如果文件系统是硬盘,分区就写ext3、ext4 ,如果是光盘,就写iso9660
  • -L 卷标名: 挂载指定卷标的分区,而不是按照设备文件名挂载
  • -o 特殊选项:可以指定挂载的额外选项
参数 说明
atime/noatime 更新访问时间/不更新访问时间。访问分区文件时,是否更新文件 的访问时间,默认为更新
async/sync 异步/同步,默认为异步
auto/noauto 自动/手动,mount –a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动
defaults 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这七个选项
exec/noexec 执行/不执行,设定是否允许在文件系统中执行可执行文件,默认 是exec允许
remount 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限
rw/ro 读写/只读,文件系统挂载时,是否具有读写权限,默认是rw
suid/nosuid 具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有
user/nouser 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载 默认是不允许,只有root可以挂载分区
usrquota 写入代表文件系统支持用户磁盘配额,默认不支持
grpquota 写入代表文件系统支持组磁盘配额,默认不支持

注意:针对的都是分区

9.2.3 挂载光盘与U盘

(1)挂载光盘
  • 建立挂载点

    mkdir /mnt/cdrom/
    mount -t iso9660 /dev/cdrom /mnt/cdrom/

  • 挂载光盘

    mount /dev/sr0 /mnt/cdrom/

  • 卸载命令

    umount 设备文件名或挂载点

    umount /mnt/cdrom

(2)挂载U盘
  • fdisk –l #查看U盘设备文件名
  • mount -t vfat /dev/sdb1 /mnt/usb/
  • 卸载命令
    umount 设备文件名或挂载点

9.2.4 支持NTFS文件系统

(1)下载 NTFS-3G 插件

http://www.tuxera.com/community/ntfs-3g- download/

(2)安装 NTFS-3G
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# tar -zxvf ntfs-3g_ntfsprogs-2013.1.13.tgz 
#解压

[root@localhost ~]# cd ntfs-3g_ntfsprogs-2013.1.13
#进入解压目录

[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# ./configure
#编译器准备。没有指定安装目录,安装到默认位置中

[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make
#编译

[root@localhost ntfs-3g_ntfsprogs-2013.1.13]# make install
#编译安装
(3) 使用

mount -t ntfs-3g 分区设备文件名 挂载点

9.3 fdisk分区

9.3.1 fdisk命令分区过程

  • 通过虚拟机加入新硬盘

    • 查看新硬盘
      fdisk -l
  • 使用fdisk命令分区
    fdisk /dev/sdb 后面不能加数字 因为此时硬盘还没有分区
    通过交互进行分区,交互指令如下:

    命令 说明
    a 设置可引导标记
    b 编辑bsd磁盘标签
    c 设置DOS操作系统兼容标记
    d 删除一个分区
    l 显示已知的文件系统类型。82为Linux swap分区,83为Linux分区
    m 显示帮助菜单
    n 新建分区
    o 建立空白DOS分区表
    p 显示分区列表
    q 不保存退出
    s 新建空白SUN磁盘标签
    t 改变一个分区的系统ID
    u 改变显示记录单位
    v 验证分区表
    w 保存退出
    x 附加功能(仅专家)
  • 重新读取分区表信息

    • partprobe
  • 格式化分区

    • mkfs -t ext4 /dev/sdb1
  • 建立挂载点并挂载

    • mkdir /disk1
    • mkdir /disk5
    • mount /dev/sdb1 /disk1/
    • mount /dev/sdb5 /disk5/

9.3.2 分区自动挂载与fstab文件修复

  • 上一节说的挂载操作在重启之后便会消失,每次重启都得重新挂载,使用我们需要把它写入系统挂载命令文件中,每次开机都会自动扫描挂载,使用/etc/fstab文件,将挂载信息写入文件
  • /etc/fstab文件
    第一字段:分区设备文件名或UUID(硬盘通用唯一识别码)
    第二字段:挂载点
    第三字段:文件系统名称
    第四字段:挂载参数
    第五字段:指定分区是否被dump备份,0代表不备份,1 代表每天备份,2代表不定期备份
    第六字段:指定分区是否被fsck检测,0代表不检测,其 他数字代表检测的优先级,那么当然1的优先级比2高
    注意:在写入文件之后先不要着急重启,我们可以先用mount -a命令来实现系统自动重新挂载,如果出现错误会提示,不至于系统崩溃

  • /etc/fstab文件修复
    如果一旦写错了,出现了报错,可以在开机显示之后出现一个让你输入root用户密码的界面,再输入密码之后,可以使用vim /etc/fstab进入fstab文件修改错误,如果出现文件只有只读权限,不能修改,强制保存也不行,退出文件输入命令:mount -o remount,rw / ,重新把根分区挂载读写权限,就可以保存了,而且只能在根分区没有错误,在本机登陆,不能使用服务器或者远程连接的情况下才能修复。

9.4 新建swap分区

  • swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。也就是说,当内存不够用时,我们使用 swap 分区来临时顶替。这种“拆东墙,补西墙”的方式应用于几乎所有的操作系统中。
  • free命令

    • free 查看内存与swap分区使用状况
    • -m:按MB字节显示
  • 缓存与缓冲:

    • cached(缓存):是指把读取出来的数据保存在内存当中,当再次读取时,不用读取硬盘而直接从内存当中读取,加速了数据的读取过程
    • buffer(缓冲):是指在写入数据时,先把分散的写入操作保存到内存当中,当达到一定程度再集中写入硬盘, 减少了磁盘碎片和硬盘的反复寻道,加速了数据的写入过程
  • 新建swap分区

    fdisk /dev/sdb
    进行交互式操作
    别忘记把分区ID改为82 ,记得保存,然后重启

  • 格式化
    分区完之后需要格式化
    mkswap /dev/sdb1 这里不能使用mkfs进行格式化

  • 加入swap分区
    swapon /dev/sdb1 加入swap分区
  • 如果不想用了使用以下命令取消:
    swapoff /dev/sdb1 取消swap分区
  • swap分区开机自动挂载
    vi /etc/fstab
    /dev/sdb1 swap swap defaults 0 0
    注意:swap前面没有/,他不是根分区下的
    修改之后使用mount -a 命令来检测错误

第十章 Shell基础

10.1 Shell概述

10.1.1 Shell是什么

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 启动、挂起、停止甚至是编写一些程序。

    image-20210721142803916

  • Shell还是一个功能相当强大的编程语言, 易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

10.1.2 Shell的分类

  • Bourne Shell:从1979起Unix就开始使用 Bourne Shell,Bourne Shell的主文件名为 sh。

  • C Shell: C Shell主要在BSD版的Unix系 统中使用,其语法和C语言相类似而得名

    Shell的两种主要语法类型有Bourne和C, 这两种语法彼此不兼容。

    Bourne家族主要 包括sh、ksh、Bash、psh、zsh;

    C家族主 要包括:csh、tcsh

    Bash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell

10.1.3 Linux支持的Shell

/etc/shells
会显示:/bin/sh、/bin/bash、/sbin/nologin、/bin/tcsh、/bin/csh
都是Linux支持的Shell

1
2
3
4
5
6
7
8
9
[zlx@zlx-vmwarevirtualplatform ~]$ cat /etc/shells
# Pathnames of valid login shells.
# See shells(5) for details.

/bin/sh
/bin/bash
/bin/zsh
/usr/bin/zsh
/usr/bin/git-shell

10.2 Shell脚本的执行方式

10.2.1 echo 输出命令

  • #echo [选项] [输出内容]

  • -e: 支持反斜线控制的转义字符

控制字符 作用
** 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数
  • 例子

    1
    #\b退格删除左侧字符$ echo -e 'ab\bc'ac#\t制表符 \n换行符$ echo -e 'a\tb\tc\nd\te\tf'a	b	cd	e	f#\x按照十六进制ASCII码表输出字符$ echo -e '\x61\t\x62\t\x63'a	b	c$ echo -e '\e[1;31m abcd \e[0m' abcd #因为\e[1; 表示开启颜色区别 \e[0m 表示结束颜色区别 31m表示红色 还有其他:#30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,#37m=白色

10.2.2 第一个脚本

1
$ cd ~$ ls公共  模板  视频  图片  文档  下载  音乐  桌面$ cd 文档$ mkdir 脚本练习$ cd 脚本练习$ vim hello.sh$ sh hello.shWelcome to linux world!hhh
1
#!/bin/bash#This is my first program#Author:zlxecho -e 'Welcome to linux world!\nhhh'

注意:在这一段脚本中,#!/bin/Bash这一句是个例外,他并不是注释,是标识,说明以下语句是Shell脚本,解释器是/bin/bash

10.2.3 执行脚本

  • 赋予执行权限,直接运行

    • chmod 755 hello.sh
    • ./hello.sh
  • 通过Bash调用执行脚本

    • bash hello.sh
    • 或 sh hello.sh (不需要执行权限就可以执行)
    1
    [zlx@zlx-vmwarevirtualplatform 脚本练习]$ ./hello.shbash: ./hello.sh: 权限不够[zlx@zlx-vmwarevirtualplatform 脚本练习]$ chmod 755 hello.sh[zlx@zlx-vmwarevirtualplatform 脚本练习]$ ./hello.shWelcome to linux world!hh[zlx@zlx-vmwarevirtualplatform 脚本练习]$ sh hello.shWelcome to linux world!hh

10.3 Bash的基本功能

10.3.1 历史命令history与命令补全

  • 历史命令

    • history [选项] [历史命令保存文件]

    • 选项:

      • -c: 清空历史命令

      • -w: 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history

        历史命令默认会保存 1000 条,可以在环境变量配置文件/etc/profile 中进行修改

    • 历史命令的调用

      • 使用上、下箭头调用以前的历史命令

      • 使用“!n”重复执行第 n 条历史命令

      • 使用“!!”重复执行上一条命令

      • 使用“!字串”重复执行最后一条以该字串开头的命令

        1
        [zlx@zlx-vmwarevirtualplatform ~]$ ls公共  模板  视频  图片  文档  下载  音乐  桌面[zlx@zlx-vmwarevirtualplatform ~]$ !!ls公共  模板  视频  图片  文档  下载  音乐  桌面[zlx@zlx-vmwarevirtualplatform ~]$ !lls公共  模板  视频  图片  文档  下载  音乐  桌面
  • 命令与文件补全
    • 在 Bash 中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全

10.3.2 命令别名alias与常用快捷键

  • 命令别名

    • alias 别名=’原命令’ #设定命令别名
    • alias #查询命令别名
  • 命令执行时顺序

    • 1 第一顺位执行用绝对路径或相对路径执行的命令。
    • 2 第二顺位执行别名
    • 3 第三顺位执行 Bashfont> 的内部命令。
    • 4 第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
    1
    [zlx@zlx-vmwarevirtualplatform ~]$ alias vi='vim'[zlx@zlx-vmwarevirtualplatform ~]$ aliasalias cp='cp -i'alias df='df -h'alias egrep='egrep --colour=auto'alias fgrep='fgrep --colour=auto'alias free='free -m'alias grep='grep --colour=auto'alias home='cd ~'alias ls='ls --color=auto'alias more='less'alias np='nano -w PKGBUILD'alias vi='vim'#再执行vi时不会调用PATH目录中命令,因为别名的优先级比PATH高#输出系统环境变量定义的目录[zlx@zlx-vmwarevirtualplatform ~]$ echo $PATH/home/zlx/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin#查询某条命令所在目录[zlx@zlx-vmwarevirtualplatform ~]$ whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz[zlx@zlx-vmwarevirtualplatform ~]$ whereis vivi: /usr/bin/vi /usr/share/man/man1/vi.1.gz /usr/share/man/man1p/vi.1p.gz[zlx@zlx-vmwarevirtualplatform ~]$ whereis vimvim: /usr/bin/vim /usr/share/vim /usr/share/man/man1/vim.1.gz
  • 让别名永久生效

    • vim /root/.bashrc
  • 删除别名

    • unalias 别名
  • Bash 常用快捷键

    快捷键 作用
    ctrl+a 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移 动到命令行开头时使用。
    ctrl+e 把光标移动到命令行结尾。
    ctrl+c 强制终止当前的命令。
    ctrl+l 清屏,相当于clear命令。
    ctrl+u 删除或剪切光标之的命令。我输入了一行很长的命令,不用使用退 格键一个一个字符的删除,使用这个快捷键会更加方便
    ctrl+k 删除或剪切光标之的内容。
    ctrl+y 粘贴 ctrl+U或ctrl+K剪切的内容。
    ctrl+r 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入 搜索内容,就会从历史命令中搜索。
    ctrl+d 退出当前终端。
    ctrl+z 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管 理章节详细介绍。
    ctrl+s 暂停屏幕输出。
    ctrl+q 恢复屏幕输出。

10.3.3 输入输出重定向

  • 标准输入输出

    image-20210722132956166

  • 输出重定向>>

    就是改变输出方向,比如由屏幕输出到文件,非常有用

    类型 符号 作用
    标准输出重定向 命令 > 文件 覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。
    标准输出重定向 命令 >> 文件 追加的方式,把命令的正确输出输出到指定的文 件或设备当中。
    标准错误输出重定向 错误命令 2>文件 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。
    标准错误输出重定向 错误命令 2>>文件 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。

    tip:在输入报错文件中 2和>>必选连着写,标准错误输出不常用

    类型 符号 作用
    正确输出和错误输出同时保存 命令 > 文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存到同 一个文件当中。
    正确输出和错误输出同时保存 命令 >> 文件 2>&1 以追加的方式,把正确输出和错误输出都保存到同 一个文件当中。
    正确输出和错误输出同时保存 命令 &> 文件 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
    正确输出和错误输出同时保存 命令 &>> 文件 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。
    正确输出和错误输出同时保存 命令 >> 文件1 2>>文件2 把正确的输出追加到文件1中,把错误的输出追加到文件2中。

    tip:命令 >> 文件 2>&1 ,命令 &>>文件 两种保存都一样,只不过是格式不同
    有一个用法:
    命令 &>/dev/unll 不管命令是否正确,直接丢人这个文件夹,不保存任何数据,在写shell脚本时有用

    1
    [zlx@zlx-vmwarevirtualplatform ~]$ ls >> ./文档/cdx[zlx@zlx-vmwarevirtualplatform ~]$ cat ./文档/cdx公共模板视频图片文档下载音乐桌面[zlx@zlx-vmwarevirtualplatform ~]$ lstbash: lst:未找到命令[zlx@zlx-vmwarevirtualplatform ~]$ lst 2>> ./文档/cdx[zlx@zlx-vmwarevirtualplatform ~]$ cat ./文档/cdx公共模板视频图片文档下载音乐桌面bash: lst:未找到命令[zlx@zlx-vmwarevirtualplatform ~]$ ls &>> ./文档/cdx1[zlx@zlx-vmwarevirtualplatform ~]$ lst &>> ./文档/cdx1[zlx@zlx-vmwarevirtualplatform ~]$ cat ./文档/cdx1公共模板视频图片文档下载音乐桌面bash: lst:未找到命令
  • 输入重定向WC

    不通过键盘输入,通过文件输入,在实际中用的不多,用在给源码包打补丁

    • wc [选项] [文件名] :统计某个文件输入的行数、单词数、字节数

    • 选项

      • -c 统计字节数
      • -w 统计单词数
      • -l 统计行数
    • 用法:
      命令 < 文件 :把文件作为命令的输入
      命令 << 标识符 内容 标识符:把标识符之间内容作为命令的输入

      1
      #统计行数、单词数、字符数[zlx@zlx-vmwarevirtualplatform ~]$ wcjdign ingjgidn ingd jiijijis9e      3       6      33#统计输入文件[zlx@zlx-vmwarevirtualplatform ~]$ wc < ./文档/cdx 9 10 84#统计输入文件行数[zlx@zlx-vmwarevirtualplatform ~]$ wc -l < ./文档/cdx9#以quit为标识符,统计内容[zlx@zlx-vmwarevirtualplatform ~]$ wc << quit> jdig> jidigj jidg> jig> quit      3       4      21

10.3.4 多命令顺序执行与管道符

  • 多命令顺序执行
多命令执行符 格式 作用
命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系,就算第一条报错,第二条也会执行
&& 命令1 && 命令2 逻辑与当命令1正确执行,则命令2才会执行 当命令1执行不正确,则命令2不会执行
|| 命令1 || 命令2 逻辑或当命令1 执行不正确,则命令2才会执行 当命令1正确执行,则命令2不会执行
  • 例子: [root@localhost ~]# ls ; date ; cd /user ; pwd
  • 磁盘文件复制:

    • dd if=输入文件 of=输出文件 bs=字节数 count=个数
    • 选项:
      • if=输入文件 指定源文件或源设备
      • of=输出文件 指定目标文件或目标设备
      • bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块
      • count=个数 指定输入/输出多少个数据块
    • 例子:
    1
    date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

    [root@localhost ~]# ls anaconda-ks.cfg && echo yes

    [root@localhost ~]# ls /root/test || echo “no

    [root@localhost ~]# 命令 && echo yes || echo no

  • 管道符

    • 命令格式:命令 1 | 命令 2
    • 命令 1 的正确输出作为命令 2 的操作对象
    • 例子:
    1
    [root@localhost ~]# ll -a /etc/ | more [root@localhost ~]# netstat -an | grep "ESTABLISHED"
  • [root@localhost ~]# grep [选项] “搜索内容” 文件名
  • 选项:
    • -i: 忽略大小写
    • -n: 输出行号
    • -v: 反向查找
    • –color=auto 搜索出的关键字用颜色显示

10.3.5 通配符与其他特殊符号

  • 通配符

    image-20210802142430007

  • Bash中其他特殊符号

    image-20210802142441259

10.4 Bash的变量

10.4.1 用户自定义的变量

(1)什么是变量:

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息 时,如一个文件名或是一个数字,就把它 存放在一个变量中。每个变量有一个名字 ,所以很容易引用它。使用变量可以保存 有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

(2)变量设置规则:
  • 变量名称可以由字母、数字和下划线组成 ,但是不能以数字开头。如果变量名是 “2name”则是错误的。

  • 在Bash中,变量的默认类型都是字符串型 ,如果要进行数值运算,则必需指定变量类型为数值型。

  • 默认变量类型全都是字符串型,和其他语言不太一样

  • 变量用等号连接值,等号左右两侧不能有空格。变量的值如果有空格,需要使用单引号或双引号包括。

  • 在变量的值中,可以使用“\”转义符。

  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 “$变量名”或用${变量名}包含。

  • 如果是把命令的结果作为变量值赋予变量 ,则需要使用反引号或$()包含命令。
    环境变量名建议大写,便于区分。

(3)变量的分类:
  • 用户自定义变量(本地变量)

  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。

  • 位置参数变量:这种变量主要是用来向脚本当 中传递参数或数据的,变量名不能自定义,变量作用是固定的。

  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

(4)用户自定义变量
  • 变量定义
    ​ 例子:
    ​ name=“yang yang”

  • 变量叠加
    aa=123
    aa=”$aa”456
    aa=${aa}789

  • 变量调用
    echo $变量名

  • 变量查看
    set 查看当前系统全部变量

  • 变量删除
    unset 变量名

  • ```shell
    [zlx@zlx-vmwarevirtualplatform 桌面]$ name=’zlx’[zlx@zlx-vmwarevirtualplatform 桌面]$ name=”$name”666[zlx@zlx-vmwarevirtualplatform 桌面]$ name=${name}777[zlx@zlx-vmwarevirtualplatform 桌面]$ echo namename[zlx@zlx-vmwarevirtualplatform 桌面]$ echo $namezlx666777[zlx@zlx-vmwarevirtualplatform 桌面]$ unset name

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13



    #### **10.4.2 环境变量 PATH PS1**

    ##### **(1)环境变量:**

    ​ **用户自定义变量只在当前的Shell中生效, 而环境变量会在当前Shell和这个Shell的所 有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效**

    ​ **<font color='red'>pstree</font>:以树结构显示进程**

    ```shell
    [zlx@zlx-vmwarevirtualplatform 桌面]$ pstreesystemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─avahi-daemon───avahi-daemon ├─blueman-tray───2*[{blueman-tray}] ├─bluetoothd ……
(2)设置环境变量:
  • 申明变量:export 变量名=变量值

  • 查询变量:env

  • 变量调用:echo $变量名

  • 删除变量:unset 变量名

  • pstree 树形显示进程数
    没有这条命令可以执行以下命令下载:
    yum -y install psmisc
    yum provides /命令 查看没有的命令的安装包 配合yum -y install使用

(3)系统常见环境变量
  • PATH:系统查找命令的路径
    这便是输入命令之前不用输入绝对路径的根本原因,系统会提前在PATH环境变量里的所有路径中查询一遍有没有你输入的命令,找到之后直接执行;

  • 如果你想直接执行shell脚本,不加绝对路径,直接写入PATH环境变量,使用叠加
    例子:

    1
    echo $PATH#PATH变量叠加PATH="$PATH":/root/sh #此后,/root/sh路径里面的执行文件都可以在任意目录下直接执行,不过是临时生效
  • PS1:定义系统提示符的变量 用来改[root@localhost ~]# 这个显示

    • \d:显示日期,格式为“星期 月 日”

    • \h:显示简写主机名。如默认主机名“localhost”

    • \t:显示24小时制时间,格式为“HH:MM:SS”

    • \T:显示12小时制时间,格式为“HH:MM:SS”

    • \A:显示24小时制时间,格式为“HH:MM”

    • \u:显示当前用户名

    • \w:显示当前所在目录的完整名称

    • \W:显示当前所在目录的最后一个目录

    • #:执行的第几个命令

    • $:提示符。如果是root用户会显示提示符为“#”,如果是普通用户 会显示提示符为“$”

      1
      [zlx@zlx-vmwarevirtualplatform 桌面]$ echo $PS1\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\][zlx@zlx-vmwarevirtualplatform 桌面]$ PS1='[\u@\t\w]\$'[zlx@00:16:25~/桌面]$PS1='[\u@\@ \h \# \W]\$'[zlx@12:16 上午 zlx-vmwarevirtualplatform 4 桌面]$PS1='[\u@\h \W]$'[zlx@zlx-vmwarevirtualplatform 桌面]$

10.4.3 位置参数变量 $n $ $@ $#*

  • 位置参数变量
变量 作用
$n n为数字,$0代表命令本身,$1-9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 ,如{10}.
$* *这个变量代表命令行中所有的参数,$把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
  • $n 的例子
1
[zlx@zlx-vmwarevirtualplatform 脚本练习]$ cat sum.sh#!/bin/bashnum1=$1num2=$2sum=$(($num1+$num2))#变量sum的和是num1+num2echo $sum#打印变量sum的值[zlx@zlx-vmwarevirtualplatform 脚本练习]$ bash sum.sh 2 35
  • S# S S@ 的例子*
1
[zlx@zlx-vmwarevirtualplatform 脚本练习]$ cat showParam.sh #!/bin/bashecho "A total of $# parameters"#使用$#代表所有参数的个数echo "The parameters is:$*"#使用$*代表所有参数echo "The parameters is:$@"#使用$@也代表所有参数[zlx@zlx-vmwarevirtualplatform 脚本练习]$ bash showParam.sh 11 23 45 66A total of 4 parametersThe parameters is:11 23 45 66The parameters is:11 23 45 66
  • S*和S@ 的区别
1
[zlx@zlx-vmwarevirtualplatform 脚本练习]$ cat diffParam.sh #!/bin/bash#$*中所有的参数看成一个整体,所以这个for循环只会循环一次for i in "$*" do	echo "The parameter is:$i"done#$@中所有的参数都看成是独立的,所以”$@“中有几个参数,就会循环几次x=1for i in "$@"do	echo "The parameter$x is:$i"	x=$(($x+1))done[zlx@zlx-vmwarevirtualplatform 脚本练习]$ bash diffParam.sh 12 34 56 The parameter is:12 34 56The parameter1 is:12The parameter2 is:34The parameter3 is:56

10.4.4 预定义的变量 $? $$ $!

  • 预定义变量
变量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果 这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确 了。
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
  • 例子:

    1
    [zlx@zlx-vmwarevirtualplatform 脚本练习]$ cat showPID.sh#!/bin/bashecho “The current process is $$”#输出当前进程的PID。#这个PID就是showPID.sh这个脚本执行时,生成的进程的PIDfind ./ -name hello.sh &#使用find命令在root目录下查找hello.sh文件#符号&的意思是把命令放入后台执行,工作管理在系统管理章节会详细介绍echo "The last one Daemon process is $!"[zlx@zlx-vmwarevirtualplatform 脚本练习]$ bash showPID.sh“The current process is 2798”The last one Daemon process is 2799[zlx@zlx-vmwarevirtualplatform 脚本练习]$ ./hello.sh[zlx@zlx-vmwarevirtualplatform 脚本练习]$ echo $?0
  • 接受键盘输入
    read [选项] [变量名]

    • -p “提示信息”:在等待read输入时,输出提示信息
    • -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
    • -n 字符数:read命令只接受指定的字符数,就会执行
    • -s: 隐藏输入的数据,适用于机密信息的输入
    1
    [zlx@zlx-vmwarevirtualplatform 脚本练习]$ cat keyboard.sh #!/bin/bash #Author: shenchao (E-mail: shenchao@lampbrother.net)read -t 30 -p "Please input your name: " name #提示“请输入姓名”并等待 30 秒,把用户的输入保存入变量 name 中echo "Name is $name " read -s -t 30 -p "Please enter your age: " age #年龄是隐私,所以我们用“-s”选项隐藏输入echo -e "\n" echo "Age is $age " read -n 1 -t 30 -p "Please select your gender[M/F]: " gender#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)echo -e "\n" echo "Sex is $gender"[zlx@zlx-vmwarevirtualplatform 脚本练习]$ bash keyboard.sh Please input your name: zlxName is zlx Please enter your age: Age is 18 Please select your gender[M/F]: MSex is M

10.5 Bash的运算符

10.5.1 数值运算与运算符

(1)declare 声明变量类型
  • declare [+/-] [选项] 变量名

  • 选项:

    • -: 给变量设定类型属性
    • +:取消变量的类型属性
    • -i:将变量声明为整数型(integer)
    • -x:将变量声明为环境变量
    • -p:显示指定变量的被声明的类型
(2)数值运算
  • 方法1:

    1
    $ aa=11$ bb=22$ declare -i cc=$aa+$bb$ echo $cc33
  • 方法2:expr 或 let 数值运算工具

    1
    $ aa=11$ bb=10$ dd=$(expr $aa + $bb)# dd的值是aa和bb的和。注意“+”号左右两侧必须有空格。let和expr一样$ echo $dd21
  • 方法3:$((运算式)) 或 $[运算式]推荐

    1
    $ aa=10$ bb=12$ ee=$(($aa+$bb))$ echo $ee22$ ff=$[$aa+$bb+$ee]$ echo $ff44
(3)运算符优先级
优先级 运算符 说明
13 -, + 单目负、单目正
12 !, ~ 逻辑非、按位取反或补码
11 ***,/, % 乘、除、取模**
10 +, - 加、减
9 << , >> 按位左移、按位右移
8 < =, > =, < , > 小于或等于、大于或等于、小于、大于
7 == , != 等于、不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,/=,%=,&=, ^=,赋值、运算且赋值 =, <<=, >>=

10.5.2 变量测试与内容替换

  • 测试表

用来测试一个变量到底有没有设置
image-20210803155541740

  • 例子:

    • 测试x=${y-新值} 测试y变量存不存在

      unset y 删除变量y
      x=${y-new} 进行测试
      echo $x

      显示new,y变量不存在
      因为变量y不存在,所以x=new

    • y=”” 给变量y赋值为空
      x=${y-new} 进行测试
      echo $x

      显示空,y为空值

    • y=old 给变量y赋值
      x=${y-new} 进行测试
      echo $x

      显示old ,y变量存在且有值

10.6 环境变量配置文件

10.6.1 环境变量配置文件简介

(1)source命令
  • 命令格式:source 配置文件 或 . 配置文件
  • 功能描述:强制使配置文件在修改之后生效,不需要重启
(2)简介
  • 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如 PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。

  • 配置文件保持位置

    • /etc/profile

    • /etc/profile.d/*.sh

    • ~/.bash_profile

    • ~/.bashrc

    • /etc/bashrc

10.6.2 环境变量配置文件作用

(1)主要的环境变量配置文件
  • /etc/profile
  • /etc/profile.d/*.sh 指/etc/profile.d/下所有的.sh结尾的文件
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
  • tips:
    • /etc 目录下的对所有用户都生效
    • ~/.bash_profile 和 ~/.bashrc -> 每个用户自己的配置文件,只对用户生效。
(2)环境变量配置文件调用顺序流程图

image-20210806105220081

  • 上图从左到右如果没有叠加。后面的命令会覆盖前面的命令。 这些是在登陆的时候挨个调用,所以在这里面设置环境变量,登陆之后就会自动设置好

  • /etc/profile的作用:

    • 里面有USER变量、LOGNAME变量、MAIL变量、PATH变量HOSTNAME变量、HISTSIZE变量、umask等环境变量的配置;
    • 调用/etc/profile.d/*.sh 文件
  • ~/.bash_profile的作用:

    • 调用了~/.bashrc文件。
    • 在PATH变量后面加入了“:$HOME/bin” 这个目录
  • ~/.bashrc的作用:

    • 定义默认别名
    • 调用/etc/bashrc
  • /etc/bashrc的作用:

    • PS1变量
    • umask
    • PATH变量
    • 调用/etc/profile.d/*.sh文件
      这一块就是进入界面以内,切换shell登陆方式,这种不需要密码,所以和前面的/etc/profile的作用不冲突

10.6.3 其他配置文件和登录信息

  • 注销时生效的环境变量配置文件

    ~/.bash_logout :注销登录时写入

  • 其他配置文件

    ~/bash_history:历史命令文件


  • Shell 登录信息

    • 本地终端欢迎信息: /etc/issue
    转义符 作用
    \d 显示当前系统日期
    \s 显示操作系统名称
    \l 显示登录的终端号,这个比较常用。
    \m 显示硬件体系结构,如i386、i686等
    \n 显示主机名
    \o 显示域名
    \r 显示内核版本
    \t 显示当前系统时间
    \u 显示当前登录用户的序列号
    • 远程终端欢迎信息: /etc/issue.net
      • 转义符在/etc/issue.net 文件中不能使用
      • 是否显示此欢迎信息,由 ssh 的配置文件/etc/ssh/sshd_config 决定,加入“Banner/etc/issue.net”行才能显示(记得重启 SSH 服务)
    • 登陆后欢迎信息:/etc/motd , 不管是本地登录,还是远程登录,都可以显示此欢迎信息

第十一章 Shell编程

11.1 基础正则表达式

11.1.1 正则表达式与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配grep、awk、sed 等命令可以支持正则表达式。

  • 通配符用来匹配符合条件的文件名,通配符是完全匹配ls、find、cp 这些命令不支持正则表达式,所以只能使用 shell 自己的通配符来进行匹配了。

11.1.2 基础正则表达式

(1)元字符及其作用
元字符 作用
***** 匹配前一个字符0次或任意多次。
. 匹配除了换行符外任意一个字符。
^ 匹配行首。例如:^hello会匹配以hello开头的行。
$ 匹配行尾。例如:hello&会匹配以hello结尾的行。
[] 匹配中括号中指定的任意一个字符,只匹配一个字符。 例如:[aoeiu] 匹配任意一个元音字母,[0-9] 匹配任意一位 数字, [a-z] [0-9]匹配小写字和一位数字构成的两位字符。
[^] 匹配除中括号的字符以外的任意一个字符。例如:[^0-9] 匹配 任意一位非数字字符,[^a-z] 表示任意一位非小写字母。
** 转义符。用于取消特殊符号的含义。
\{n\} 表示其前面的字符恰好出现n次。例如:[0-9]{4} 匹配4位数字,[1] [3-8] [0-9]{9} 匹配手机号码
\{n,\} 表示其前面的字符至少出现n次。例如: [0-9]{2,} 表示两位及以上的数字。
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。例如: [a- z]{6,8} 匹配6到8位的小写字母
(2)举例【以下匹配均指包含匹配
  • “*”前一个字符匹配0次,或任意多次

    • grep “a*” test_rule.txt
      #匹配所有内容,包括空白行(匹配包含0个或任意多个a的行,包含0个a<=>所有内容)

    • grep “aa*” test_rule.txt
      #匹配至少包含有一个a的行

    • grep “aaa*” test_rule.txt
      #匹配最少包含两个连续a的字符串

  • “.” 匹配除了换行符外任意一个字符

    • grep “s..d” test_rule.txt
      #“s..d”会匹配在s和d这两个字母之间有两个字符的单词
    • grep “s.*d” test_rule.txt
      #匹配在s和d字母之间有任意(个数>=0)字符 (.*等价于任意个数 .)
    • *grep “.” test_rule.txt
      #匹配所有内容,包括空白行(匹配包含0个或任意多个任意字符的行<=>所有内容)
  • “^”匹配行首,“$”匹配行尾

    • grep “^M” test_rule.txt
      #匹配以大写“M”开头的行
    • grep “n​$” test_rule.txt
      #匹配以小写“n”结尾的行
    • grep -n “^$” test_rule.txt
      #会匹配空白行
  • “[]” 匹配中括号中指定的任意一个字符,只匹配一个字符

    • grep “s[ao]id” test_rule.txt
      #匹配s和i字母中,要不是a、要不是o的行
    • grep “[0-9]” test_rule.txt
      #匹配任意一个数字
    • grep “^[a-z]” test_rule.txt
      #匹配用小写字母开头的行
  • “[^]” 匹配除中括号的字符以外的任意一个字符

    • grep “^[^a-z]” test_rule.txt
      #匹配不以小写字母开头的行
    • grep “^[^a-z A-Z]” test_rule.txt
      #匹配不用字母开头的行
  • “\” 转义符,用于取消特殊符号的含义

    • grep “\.$” test_rule.txt
      #匹配使用“.”结尾的行
  • “\{n\}”表示其前面的字符恰好出现n次

    • grep “a\{3\}” test_rule.txt
      #匹配a字母连续出现三次的字符串,即包含aaa的字符串
    • grep “[0-9]\{3\}” test_rule.txt
      #匹配包含连续的三个数字的字符串
  • “\{n,\}”表示其前面的字符出现不小于n次

    • grep “^[0-9]\{3,\}[a-z]” test_rule.txt

      #匹配最少用连续三个数字开头且后跟一个字符的行

  • “{n,m}”匹配其前面的字符至少出现n次, 最多出现m次

    • grep “sa\{1,3\}i” test_rule.txt
      #匹配在字母s和字母i之间有最少一个a,最多三个a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[zlx@localhost test]$ cat test_rule.txt 
18286486521
18384681568
18414568468
1530268781@qq.com
1530268781@gmail.com
1530268781@163.com
@qq.com
a@163.com
153@.com
#匹配包含以181、182、183、184开头的电话号码的行
[zlx@localhost test]$ grep "18[1-4][0-9]\{8\}" test_rule.txt
18286486521
18384681568
18414568468
#匹配包含qq邮箱xxx.qq.com的行
[zlx@localhost test]$ grep ".*@qq.com" test_rule.txt #错误,.*匹配所有内容包含“空”
1530268781@qq.com
@qq.com
[zlx@localhost test]$ grep "..*@qq.com" test_rule.txt #正确,..*匹配所有内容,且至少有一个字符
1530268781@qq.com
#匹配包含邮箱 xxx.@xxx.com的行
[zlx@localhost test]$ grep "..*@..*\.com" test_rule.txt
1530268781@qq.com
1530268781@gmail.com
1530268781@163.com
a@163.com
#匹配只有电话号码的行(以电话号码开头和结尾)
[zlx@localhost test]$ grep "^18[1-4][1-9]\{8\}" test_rule.txt #错误
18286486521jidng
18384681568dg
18414568468
[zlx@localhost test]$ grep "^18[1-4][1-9]\{8\}$" test_rule.txt
18414568468

11.2 字符截取命令

11.2.1 cut命令

  • 命令格式:cut [选项] 文件名

  • 选项:

    • -f 列号: 提取第几列
    • -d 分隔符: 按照指定分隔符分割列
  • tips:

    • 一般在使用cut命令的时候和管道符“|”连着使用
    • grep为提取行,cut提取列,而且cut提取的表格中,只能用制表符隔开不能用空格
  • 举例:

    • [root@localhost ~]# cut -f 2 student.txt

      #提取第二列

    • [root@localhost ~]# cut -f 2,3 student.txt

      #提取第二第三列

    • [root@localhost ~]# cut -d “:” -f 1,3 /etc/passwd

      #以:为分隔符提取第一第三列

  • cut 命令的局限:

    [root@localhost ~]# df -h | cut -d “ “ -f 1,3

    #有空格时提取会出问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [zlx@localhost 桌面]$ cat student.txt 
    id name gender mark
    1 Li M 86
    2 Shen M 90
    3 Gao M 83
    [zlx@localhost 桌面]$ cut -f 2 student.txt
    name
    Li
    Shen
    Gao
    [zlx@localhost 桌面]$ cut -f 2,4 student.txt
    name mark
    Li 86
    Shen 90
    Gao 83

    [zlx@localhost 桌面]$ cat student1.txt
    id:name:gender:mark
    1:Shen:M:90
    2:Li:M:86
    3:Gao:M:83
    [zlx@localhost 桌面]$ cut -d ":" -f 1,3 student1.txt
    id:gender
    1:M
    2:M
    3:M

11.2.2 printf命令

  • 命令格式:printf ‘输出类型|输出格式’ 输出内容

  • 输出类型:

    • %ns : 输出字符串。n 是数字指代输出几个字符
    • %ni : 输出整数。n 是数字指代输出几个数字
    • %m.nf : 输出浮点数。m 和 n 是数字,指代输出整数的位数和小数位数。如%8.2f 代表共输出 8 位数, 其中 2 位是小数,6 位是整数。
  • 输出格式:

    • \a : 输出警告声音
    • \b : 输出退格键,也就是 Backspace 键
    • \f : 清除屏幕
    • \n : 换行
    • \r : 回车,也就是 Enter 键
    • \t : 水平输出退格键,也就是 Tab 键
    • \v : 垂直输出退格键,也就是 Tab 键
  • tips:

    • 因为每有几个%s代表每几个字符输出一次
    • 在与cat命令结合使用的时候,需要用$()把cat命令扩起来,使用这种命令赋予变量的方式,才能正确输出文件内容,但是具体格式还得用%s\t 或者%s\n控制
    • 在awk命令的输出中支持print和printf命令,printf主要在awk命令编程中使用
      • print:print会在每个输出之后自动加入一 个换行符(Linux默认没有print命令)
      • printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符
  • 举例:

    1
    2
    3
    4
    5
    6
    7
    [zlx@localhost 桌面]$ printf %s 1 2 3 4 5 6
    123456[zlx@localhost 桌面]$ printf %s %s %s 1 2 3 4 5 6
    %s%s123456[zlx@localhost 桌面]$ printf '%s %s %s' 1 2 3 4 5 6
    1 2 34 5 6[zlx@localhost 桌面]$ printf '%s%s%s' 1 2 3 4 5 6
    123456[zlx@localhost 桌面]$ printf '%s %s %s\n' 1 2 3 4 5 6
    1 2 3
    4 5 6
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #不调整格式输出
    [zlx@localhost 桌面]$ printf '%s' $(cat student.txt)
    idnamegendermark1LiM862ShenM903GaoM83
    #调整格式输出
    [zlx@localhost 桌面]$ printf '%s\t %s\t %s\t %s\t \n' $(cat student.txt)
    id name gender mark
    1 Li M 86
    2 Shen M 90
    3 Gao M 83

11.2.3 awk命令

  • 介绍:

    awk命令也叫awk编程,可以识别非制表符的空格,用来解决cut命令解决不了的提取列工作,他是把需要提取的原文件一行一行扫描,扫描每一行中所需要点列,然后把它记录下来,在全部扫描完之后全部打印出来。

  • 命令格式: awk ‘条件1{动作 1} 条件2{动作 2}…’ 文件名

  • 条件(pattern):一般使用关系表达式作为条件。如x>10

  • 动作(action):

    • 格式化输出
    • 流程控制语句
  • 举例:

    1
    2
    3
    4
    5
    6
    [zlx@localhost 桌面]$ awk '{printf $2 "\t" $3 "\n"}' student.txt
    name gender
    Li M
    Shen M
    Gao M
    [zlx@localhost 桌面]$
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    [zlx@localhost 桌面]$ df -h
    文件系统 容量 已用 可用 已用% 挂载点
    devtmpfs 872M 0 872M 0% /dev
    tmpfs 901M 0 901M 0% /dev/shm
    tmpfs 901M 18M 883M 2% /run
    tmpfs 901M 0 901M 0% /sys/fs/cgroup
    /dev/mapper/cl-root 17G 4.3G 13G 26% /
    /dev/sda1 976M 193M 716M 22% /boot
    tmpfs 181M 1.2M 179M 1% /run/user/42
    tmpfs 181M 4.6M 176M 3% /run/user/1000
    #查看第一列与第5列
    [zlx@localhost 桌面]$ df -h | awk '{printf $1 "\t" $5 "\n"}'
    文件系统 已用%
    devtmpfs 0%
    tmpfs 0%
    tmpfs 2%
    tmpfs 0%
    /dev/mapper/cl-root 26%
    /dev/sda1 22%
    tmpfs 1%
    tmpfs 3%

    #查看cl-root文件系统的已用百分比(grep提取行,awk提取列)
    [zlx@localhost 桌面]$ df -h | grep cl-root | awk '{printf $5 "\n"}'
    26%

    #查看cl-root文件系统已用百分比数值(grep提取行,awk提取列,cut进一步提取列
    [zlx@localhost 桌面]$ df -h | grep cl-root | awk '{printf $5 "\n"}' | cut -d '%' -f 1
    26
    #查看cl-root文件系统已用百分比数值(grep提取行,awk提取列后进一步提取列
    [zlx@localhost 桌面]$ df -h | grep cl-root | awk '{printf $5 "\n"}' | awk -F "%" '{printf $1 "\n"}'
    26
    [zlx@localhost 桌面]$
  • BEGION:

    #awk ‘BEGIN{printf “This is a transcript \n” } {printf $2 “\t” $6 “\n”}’ student.txt

  • END:

    #awk ‘END{printf “The End \n” } {printf $2 “\t” $6 “\n”}’ student.txt

  • FS:用来指定字段分隔符,写在BEGIN中

    #cat /etc/passwd | grep “/bin/bash” | awk ‘BEGIN {FS=”:”} {printf $1 “\t” $3 “\n”}’

10.2.4 sed命令

(1)sed命令
  • sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。sed 主要是用来将数据进行选取、替换、删除、新增的命令。

  • 命令格式:sed [选项] ‘[动作]’ 文件名

  • 选项:

    • -n: 一般 sed 命令会把所有数据都输出到屏幕 , 如果加入此选择,则只会把经过 sed 命令处理的行输出到屏幕。

    • -e: 允许对输入数据应用多条 sed 命令编辑

    • -i: 用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出

  • 动作: 范围行+参数

    • a : 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
    • c : 行替换,用c后面的字符串替换原数据行。替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
    • i : 插入,在当期行前插入一行或多行。插入多行时,除最后 一行外,每行末尾需要用“\”代表数据未完结。
    • d : 删除,删除指定的行。
    • p : 打印,输出指定的行。
    • s : 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。
(2)数据选取
  • sed ‘2p’ student.txt

    #打印第二行后打印全部数据。一般sed命令会把所有数据都输出到屏幕 ,只不过会先输出你想要的,这时候就需要-n配合

  • sed -n ‘2p’ student.txt

    #打印第二行

  • sed -n ‘1,3p’ student.txt

    #打印1-3行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[zlx@zlx-vmwarevirtualplatform 桌面]$ cat student.txt 
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2p' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
[zlx@zlx-vmwarevirtualplatform 桌面]$ sed -n '2p' student.txt
1 Liming 82 95 86 87.66
[zlx@zlx-vmwarevirtualplatform 桌面]$ sed -n '1,3p' student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
(3)数据追加
  • sed ‘2a hello’ student.txt
    #在第二行后追加hello

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2a hello' student.txt 
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    hello
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66

    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2a hello \ world' student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    hello world
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66
(4)数据插入
  • sed ‘2i hello \ world’ student.txt
    在第二行前插入两行数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2i hello' student.txt 
    ID Name PHP Linux MySQL Average
    hello
    1 Liming 82 95 86 87.66
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66

    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2i hello \ world' student.txt
    ID Name PHP Linux MySQL Average
    hello world
    1 Liming 82 95 86 87.66
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66
(5)数据删除
  • sed ‘1,3d’ student.txt

    #删除1-3行数据后输出

  • sed -i ‘1,3d’student.txt

    #删除1-3行数据(-i 修改数据文件)

    1
    2
    3
    4
    5
    6
    7
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '1,3d' student.txt 
    3 Gao 99 83 93 91.66
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed -i '3d' student.txt
    [zlx@zlx-vmwarevirtualplatform 桌面]$ cat student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    3 Gao 99 83 93 91.66
(6)数据替换
  • 行替换:sed ‘2c No such person’ student.txt

    #将第二行替换为指定字符串

    1
    2
    3
    4
    5
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '2c No such person' student.txt 
    ID Name PHP Linux MySQL Average
    No such person
    2 Sc 74 96 87 85.66
    3 Gao 99 83 93 91.66
  • 字符串替换

    sed ‘行范围s/旧字符串/新字符串/g’ 文件名

    • sed ‘3s/74/99/g’ student.txt
      在第三行中,把74换成99
    • sed -i ‘3s/74/99/g’ student.txt
      sed操作的数据直接写入文件
    • sed -e ‘s/Liming//g ; s/Gao//g’ student.txt
      同时把“Liming”和“Gao”替换为空(-e 多条sed命令编辑)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #将第三行的99替换为95
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed '3s/99/95/g' student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    3 Gao 95 83 93 91.66
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed -i '3s/99/95/g' student.txt
    [zlx@zlx-vmwarevirtualplatform 桌面]$ cat student.txt
    ID Name PHP Linux MySQL Average
    1 Liming 82 95 86 87.66
    3 Gao 95 83 93 91.66
    #将Liming和Gao的成绩替换
    [zlx@zlx-vmwarevirtualplatform 桌面]$ sed -e '2s/Liming/Gao/g;3s/Gao/Liming/g' student.txt
    ID Name PHP Linux MySQL Average
    1 Gao 82 95 86 87.66
    3 Liming 95 83 93 91.66

11.3 字符处理命令

11.3.1 sort排序命令

  • 命令格式: sort [选项] 文件名

  • 选项:

    • -f: 忽略大小写
    • -n: 以数值型进行排序,默认使用字符串型排序
    • -r: 反向排序
    • -t: 指定分隔符,默认分隔符是制表符
    • -k n[,m]: 按照指定的字段范围排序。从第 n 字段开始, m 字段结束(默认到行尾) (注意:-k 3表示用第3到最后的字段范围排序,-k 3,3 才表示用第三个字段排序)
  • 举列

    • [root@localhost ~]# sort /etc/passwd

      #排序用户信息文件

    • [root@localhost ~]# sort -r /etc/passwd

      #反向排序

    • [root@localhost ~]# sort -t “:” -k 3,3 /etc/passwd

      #指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序

    • [root@localhost ~]# sort -n -t “:” -k 3,3 /etc/passwd

      #指定分隔符是“:”,用第三个字段且以数值型进行排序

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      [zlx@zlx-vmwarevirtualplatform 桌面]$ cat student.txt
      ID Name PHP Linux MySQL Average
      1 Liming 82 95 86 87.66
      2 Sc 98 99 100 99
      3 Gao 95 83 93 91.66
      #按平均分从低到高排序
      [zlx@zlx-vmwarevirtualplatform 桌面]$ sort -n -k 6,6 student.txt
      ID Name PHP Linux MySQL Average
      1 Liming 82 95 86 87.66
      3 Gao 95 83 93 91.66
      2 Sc 98 99 100 99
      #按平均分从高到低排序
      [zlx@zlx-vmwarevirtualplatform 桌面]$ sort -r -n -k 6,6 student.txt
      2 Sc 98 99 100 99
      3 Gao 95 83 93 91.66
      1 Liming 82 95 86 87.66
      ID Name PHP Linux MySQL Average

11.3.2 wc统计命令

  • 命令格式: wc [选项] 文件名

  • 选项:

    • -l: 只统计行数
    • -w: 只统计单词数
    • -m: 只统计字符数
    1
    2
    3
    4
    5
    6
    7
    8
    [zlx@zlx-vmwarevirtualplatform 桌面]$ wc student.txt 
    4 24 95 student.txt
    [zlx@zlx-vmwarevirtualplatform 桌面]$ wc -l student.txt
    4 student.txt
    [zlx@zlx-vmwarevirtualplatform 桌面]$ wc -w student.txt
    24 student.txt
    [zlx@zlx-vmwarevirtualplatform 桌面]$ wc -m student.txt
    95 student.txt

11.4 条件判断

11.4.1 按照文件类型判断

测试选项 作用
-b 文件 判断该文件是否存在,并且是否为 块设备文件(是块设备文件 为真) block
-c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备 文件为真) char
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真) directory
-e 文件 判断该文件是否存在(存在为真) exist
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真) file
-L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接 文件为真) link
-p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真) pipe
-s 文件 判断该文件是否存在,并且是否为非空(非空为真)
-S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件 为真) Socket
  • 两种判断格式:

    • test 参数 文件路径/文件名

      #test -e /root/install.log 判断/root/install.log是否存在

    • [ 参数 文件路径/文件名 ](括号内部左右有空格)

      • #[ -e /root/install.log ]

      • #[ -d /root ] && echo “yes” || echo “no”

        第一个判断命令如果正确执行,则打印“yes”,否则打印“no”

        逻辑与:[ -d /root ]执行为true,echo “yes”才会执行

        逻辑或:echo “yes”执行为false,echo “no” 才会执行

    • 举例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #判断是否存在
      [zlx]$ test -e student.txt
      [zlx]$ test -e student.txt && echo "yes" || echo "no"
      yes

      [zlx]$ [ -e student.txt ]
      [zlx]$ [ -e student.txt ] && echo "yes" || echo "no"
      yes

      #判断是否存在,且是否为文件|文件夹
      [zlx]$ [ -f student.txt ] && echo "yes" || echo "no"
      yes
      [zlx]$ [ -d student.txt ] && echo "yes" || echo "no"
      no

11.4.2 按照文件权限判断

测试选项 作用
-r 文件 判断该文件是否存在,并且是否该文件拥有读权限(有读 权限为真) read
-w文件 判断该文件是否存在,并且是否该文件拥有写权限(有写 权限为真) write
-x 文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真) execute
-u 文件 判断该文件是否存在,并且是否该文件拥有SUID权限(有 SUID权限为真)
-g 文件 判断该文件是否存在,并且是否该文件拥有SGID权限(有 SGID权限为真)
-k 文件 判断该文件是否存在,并且是否该文件拥有SBit权限(有 SBit权限为真)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[zlx]$ test -r student.txt && echo "yes" || echo "no"
yes

[zlx@zlx-vmwarevirtualplatform 桌面]$ [ -w sdudent.txt ] && echo "yes" || echo "no"
no
[zlx@zlx-vmwarevirtualplatform 桌面]$ [ -x sdudent.txt ] && echo "yes" || echo "no"
no

[zlx]$ sudo su
[sudo] zlx 的密码:
[zlx]# [ -w student.txt ] && echo "yes" || echo "no"
yes
[zlx]# [ -x student.txt ] && echo "yes" || echo "no"
no

11.4.3 两个文件之间进行比较

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真) new than
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真) old than
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 equal than
1
2
3
4
[zlx]$[ test1.sh -nt test.sh ] && echo "yes" || echo "no"
no
[zlx]$[ test1.sh -ot test.sh ] && echo "yes" || echo "no"
yes

11.4.4 两个整数之间进行比较

测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真) equal
整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等位置) not equal
整数1 -gt 整数2 判断整数1是否大于整数2(大于为真) greater than
整数1 -lt 整数2 判断整数1是否小于整数2(小于位置) lower than
整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真) greater equal
整数1 -le 整数2 判断整数1是否小于等于整数2(小于等于为真) low equal
1
2
3
4
5
6
#判断11是否大于等于12
[zlx]$[ 11 -ge 12 ] && echo "yes" || echo "no"
no
#判断11是否小于等于12
[zlx]$[ 11 -le 12 ] && echo "yes" || echo "no"
yes

11.4.5 字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空(为空返回真) zero
-n 字符串 判断字符串是否为非空(非空返回真) not zero
字串1 == 字串2 判断字符串1是否和字符串2相等(相等返回真) 注意:==左右有空格
字串1 != 字串2 判断字符串1是否和字符串2不相等(不相等返回真) 注意:!=左右有空格
1
2
3
4
5
6
[zlx]$name="balabala"
[zlx]$name1="labalaba"
[zlx]$[ $name == $name1 ] && echo "yes" || echo "no"
no
[zlx]$[ $name != $name1 ] && echo "yes" || echo "no"
yes

11.4.6 多重体条件判断

测试选项 作用
判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真 and
判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真 or
!判断 逻辑非,使原始的判断式取反
1
2
3
4
5
6
7
8
9
10
[zlx]$aa=11
#判断变量aa是否为非空,且是否大于等于13
[zlx]$[ -n $aa -a $aa -gt 12 ] && echo "yes" || echo "no"
no
#判断变量aa是否为非空,且是否小于等于13
[zlx]$[ -n $aa -a $aa -lt 12 ] && echo "yes" || echo "no"
yes
#判断变量aa是否为非空,或是否大于等于13
[zlx]$[ -n $aa -o $aa -gt 12 ] && echo "yes" || echo "no"
yes

11.5 流程控制

11.5.1 if语句

(1)单分支if条件语句
  • 语法:

    1
    2
    3
    if [ 条件判断式 ];then
    程序
    fi
    1
    2
    3
    4
    if [ 条件判断式 ]
    then
    程序
    fi
  • 注意:

    • fi:if语句使用fi结尾,和一般语言使用大括号{…}结尾不同
    • [ 条件判断式 ]:就是使用test命令判断,所以中括号和条件判断式之间必须有空格
    • then:后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了
  • 例子:判断分区使用率

    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash #统计根分区使用率
    #Author:zlx
    rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
    #把根分区使用率作为变量值赋给变量rate
    if [ $rate -ge 80 ]
    then
    echo "Warning! /dev/sda1 is full!"
    fi
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash #统计根分区使用率
    #Author:zlx
    rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f 1)
    #把根分区使用率作为变量值赋给变量rate
    if [ $rate -ge 80 ];then
    echo "Warning! /dev/sda1 is full!"
    fi
(2)双分支if条件语句
  • 语法:

    1
    2
    3
    4
    5
    if [ 条件判断式];then 
    条件成立时,执行的程序
    else
    条件不成立时,执行的另一个程序
    fi
    1
    2
    3
    4
    5
    6
    if [ 条件判断式] 
    then
    条件成立时,执行的程序
    else
    条件不成立时,执行的另一个程序
    fi
  • 举例

    • 备份文件信息及文件 (注:du -sh 文件 :获取文件夹大小)

      备份文件:tar -zcf xxx.tar.gz 目标文件

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      #!/bin/bash
      #Author:zlx
      #备份/home/zlx/桌面/shellPractice
      ntpdate asia.pool.ntp.org &> /dev/null #同步系统时间
      date=$(date +%y%m%d) #把当前系统时间按照“年月日”格式赋予变量date
      size=$(du -sh /home/zlx/桌面/shellPractice) #统计文件夹大小
      if [ -d /tmp/backup ] #如果目标存在且是文件夹
      then
      #将文件夹大小以及备份时间存储到临时文件中
      echo "Date:$date" > /tmp/backup/shellinfo.txt #标准输出重定向(覆盖)
      echo "Size:$size" >> /tmp/backup/shellinfo.txt #标准输出重定向(追加)
      cd /tmp/backup
      tar -zcf /home/zlx/桌面/shellprac-$date.tar.gz /home/zlx/桌面/shellPractice shellinfo.txt &> /dev/null#打包压缩
      rm -rf /tmp/backup/shellinfo.txt
      else
      mkdir /tmp/backup
      echo "Data:$date" > /tmp/backup/shellinfo.txt
      echo "Size:$size" >> /tmp/backup/shellinfo.txt
      cd /tmp/backup
      tar -zcf /home/zlx/桌面/shellprac-$date.tar.gz /home/zlx/桌面/shellPractice shellinfo.txt &> /dev/null
      rm -rf /tmp/backup/shellinfo.txt
      fi
    • 判断apache是否启动

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      #!/bin/bash
      #Author:zlx 2021-08-11

      #apache所在机器ip地址(默认80端口)
      ipport=127.0.0.1

      #获取apache是否是启动状态(通过-w全量匹配tcp的80端口)
      isopen=$(nmap -sT $ipport | grep -w 80/tcp | grep http | awk '{print $2}')

      if [ "$isopen" == "open" ]
      then
      echo "$(date) httpd is ok!" >> /tmp/apache.log
      else
      # 启动apache
      /etc/rc.d/init.d/httpd start &>/dev/null
      echo "$(date) restart httpd!" >> /tmp/apache-err.log
      fi

      tips:nmap 远程扫描,检查服务是否启动

          **nmap -sT 扫描指定服务器上开启的TCP端口**
      
(3)多分支if条件语句
  • 语法:

    1
    2
    3
    4
    5
    6
    7
    8
    if [ 条件判断式1 ];then 
    当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ];then
    当条件判断式2成立时,执行程序2
    ...省略更多条件...
    else
    当所有条件都不成立时,最后执行此程序
    fi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if [ 条件判断式1 ] 
    then
    当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]
    then
    当条件判断式2成立时,执行程序2
    ...省略更多条件...
    else
    当所有条件都不成立时,最后执行此程序
    fi
  • 判断输入的文件类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/bin/bash 
    #Author:zlx 2021-08-14
    #description:judge file type
    #读取键盘输入,并赋给变量file
    read -p "Please input a filename:" file
    if [ -z "$file" ] #判断输入是否为空
    then
    echo "Error,please input a filename"
    exit 1
    elif [ ! -e "$file" ] #判断输入文件是否存在
    then
    echo "Your input is not a file"
    exit 2
    elif [ -f "$file" ]
    then
    echo "$file is a regulare file!"
    elif [ -d "$file" ]
    then
    echo "$file is a directory!"
    else
    echo "$file is an other file!"
    fi

11.5.2 case语句

  • 多分支case条件语句:case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系(等于关系),而if语句可以判断多种条件关系。

  • 语法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    case $变量名 in 
    "值1")
    如果变量的值等于值1,则执行程序1
    ;;
    "值2")
    如果变量的值等于值2,则执行程序2
    ;;
    ...省略其他分支...
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
  • 判断用户输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #!/bin/bash
    #Author:zlx 2021-08-14
    #description:judge the input
    read -p "Please choose yes/no:" -t 10 choose
    case $choose in
    "yes")
    echo "Your choose is yes!"
    ;;
    "no")
    echo "your choose is no!"
    ;;
    *)
    echo "Your choose is error!"
    ;;
    esac

11.5.3 for循环

(1)语法一
  • 语法:

    1
    2
    3
    4
    for 变量 in 值1 值2 值3
    do
    程序
    done
  • 例子:输出时间

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    #Author:zlx 2021-08-14

    for time in morning noon afternoon evening
    do
    echo "This time is $time!"
    done
  • 优点:这种方法看起来很笨,需要把循环次数写入for,但是在系统管理的时候,当我们不确定循环次数的时候,比如解压缩一个文件里所有的压缩包,他会自动加入新的压缩包,这个时候我就需要用这种笨办法,这种后面加次数的也有一个好处,就是循环变量只要是由空格,或者回车,或者tab键隔开的,都可以算在内,所以才能和cat,ls等命令结合使用,cat命令执行之后显示的结果就是由回车隔开的,都可以算成是循环变量。在加入或者减少压缩包的时候,不需要修改脚本。

  • 例子:批量解压缩

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    #Author:zlx 2021-08-14

    cd /lamp
    ls *.tar.gz > ls.log #列出所有压缩文件,覆盖重定向到ls.log
    for i in $(cat ls.log) #循环遍历ls.log中每一个压缩文件的记录
    do
    tar -zxf $i &> /dev/null #解压缩
    done
    rm -rf /lamp/ls.log
(2)语法二
  • 语法:

    1
    2
    3
    4
    for ((初始值;循环控制调节;变量变化))
    do
    程序
    done
  • 例子:计算1加到100

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    #Author:zlx 2021-08-14

    s=0
    for ((i=1;i<=100;i++))
    do
    #s=$(($s+$i)) #数值运算,详见10.5.1
    #s=$[$s+$i]
    #s=$(expr $s + $i)
    let s=s+i
    done
    echo "The sum of 1+2+3+...+100 is $s!"

  • 批量创建用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/bin/bash
    #Author:zlx

    #批量添加新用户
    read -p "Please input the number of users: " -t 30 num #输入创建用户个数
    read -p "Please input user name: " -t 30 name #输入用户名
    read -p "Please input the password of users: " -t 30 pass #输入用户密码

    if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ] #判断输入信息是否为空
    then
    y=$(echo $num | sed s/'^[0-9]*$'//g) #这里是判断输入的用户个数是否为数字,sed后也可以把^[0-9]*$换为's/[0-9]//g'
    if [ -z "$y" ] #如果上一条语句输出为空,就是输入的用户个数为数字
    then
    for ((i=1;i<=$num;i++)) #开始循环
    do
    /usr/sbin/useradd "$name$i" &>/dev/null #建立用户
    echo $pass | /usr/bin/passwd --stdin "$name$i" &>/dev/null #设置用户密码,与用户名相同
    done
    echo "Build seccees!"
    fi
    fi

11.5.4 while循环和until循环

(1)while 循环
  • while循环是不定循环,也称作条件循环 。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

  • 语法

    1
    2
    3
    4
    while [ 条件判断式 ] 
    do
    程序
    done
  • 从1加到100

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash  
    #Author: zlx
    #从1加到100

    i=1
    s=0
    while [ $i -le 100 ] #如果变量i的值小于等于100,则执行循环
    do
    s=$(( $s+$i ))
    i=$(( $i+1 ))
    done
    echo "The sum is: $s"
(2)until循环
  • until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

  • 语法:

    1
    2
    3
    4
    until [ 条件判断式 ] 
    do
    程序
    done
  • 从1加到100

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash 
    #Author: zlx
    #从1加到100

    i=1
    s=0
    until [ $i -gt 100 ] #循环直到变量i的值大于100,就停止循环
    do
    s=$(( $s+$i ))
    i=$(( $i+1 ))
    done
    echo "The sum is: $s"

第十二章 服务管理

12.1服务简介与分类

(1)服务的分类

服务的分类

(2)启动与自启动
  • 服务启动:就是在当前系统中让服务运行,并提供功能。
  • 服务自启动:自启动是指让服务在系统开机或重启动之后,随着系统的启动而自动启动服务。
(3)查询已安装的服务
  • RPM包安装的服务

    • chkconfig –list

      查看服务自启动状态,可以看到所有RPM包安装的服务

    • ps aux

      查看启动服务的进程

  • 源码包安装的服务

    • 查看服务安装位置,一般是/usr/local/下
  • RPM 安装服务和源码包安装服务的区别

    • RPM 安装服务和源码包安装服务的区别就是安装位置的不同
    • 源码包安装在指定位置,一般是/usr/local/
    • RPM 包安装在默认位置中

12.2 rpm包安装服务的管理

12.2.1 独立的服务管理

(1)rpm包安装服务的位置
  • RPM 安装服务和源码包安装服务的区别就是安装位置的不同
    • 源码包安装在指定位置,一般是/usr/local/
    • RPM 包安装在默认位置中
  • /etc/init.d/ #启动脚本位置
  • /etc/sysconfig/ #初始化环境配置文件位置
  • /etc/ #配置文件位置
  • /etc/xinetd.conf #xinetd配置文件
  • /etc/xinetd.d/ #基于xinetd服务的启动脚本
  • /var/lib/ #服务产生的数据放在这里
  • /var/log/ #日志
(2)独立服务的启动
  • /etc/rc.d/init.d/独立服务名 start|stop|status|restart
  • service 独立服务名 start|stop|restart|status
  • service –status-all
    • 查询服务器全部已经安装的RPM包的服务的运行状态
    • CentOS7为systemctl list-unit-files
(3)独立的服务自启动
  • chkconfig [–level 运行级别] [独立服务名] [on|off]

    • chkconfig –level 2345 htttpd on #下次开机自启动apache
    • chkconfig –level 2345 htttpd off #下次开机不自启动apache
  • 修改/etc/rc.d/rc.local文件

    把“/etc/rc.d/init.d/ 独立服务名 start ”写入文件

  • 使用ntsysv命令管理自启动

    如果没有ntsysv命令,yum -y install ntsysv下载即可,不过这个也是红帽专有的

  • tips:service 和 chkconfig 命令的功能在 Centos7 中好像都被抛弃了。被 systemctl 取代。

    参考博文:Centos7 下的 systemctl 命令与 service 和 chkconfig

12.2.2 基于xinetd服务的管理

Xinetd:即 extended internet daemon,是新一代的网络守护进程服务程序,又叫超级 Internet 服

务器,常用来管理多种轻量级 Internet 服务。Xinetd 提供类似于 inetd+tcp_wrapper 的功能,但是更

加强大和安全

Telnet协议是TCP/IP协议族中的一员,是Internet远程 登录服务的标准协议和主要方式。不过现在已经被ssh替代。

(1)安装 xinetd 与 telnet
1
2
[root@localhost ~]# yum -y install xinetd 
[root@localhost ~]# yum -y install telnet-server
(2)xinetd服务的启动
  • 进入配置文件,把disable=yes改为no
1
2
3
4
5
6
7
8
9
10
service telnet 	# 服务的名称为 telnet
{
flags = REUSE # 标志为 REUSE,设定 TCP/IP socket 可重用
socket_type = stream # 使用 TCP 协议数据包
wait = no # 允许多个连接同时连接
user = root # 启动服务的用户为 root
server = /usr/sbin/in.telnetd # 服务的启动程序
log_on_failure += USERID # 登陆失败后,记录用户的 ID
disable = no # 服务不启动
}
  • 重启xinetd服务

    service xinetd restart

(3)xinetd服务的自启动
  • chkconfig telnet on

  • ntsysv

    基于xinetd的服务自启动和启动是相通的,非常不适合做服务器管理,开启自启动,服务自动启动。关闭自启动,服务也关闭 。

12.3 源码安装服务的管理

  • 源码包安装服务的启动
    使用绝对路径,调用启动脚本来启动。不同的源码包的启动脚本不同。可以查看源码包的安装说明,查看启动脚本的方法。
    /usr/local/apache2/bin/apachectl start|stop

  • 源码包服务的自启动
    vi /etc/rc.d/rc.local
    加入
    /usr/local/apache2/bin/apachectl start

  • 让源码包服务被服务管理命令识别
    让源码包的apache服务能被service命令管理启动
    ln -s /usr/local/apache2/bin/apachectl /etc/init.d/apache

  • 让源码包的apache服务能被chkconfig与 ntsysv命令管理自启动

    • 在创建好软链接后,修改servic可以扫描的Apache文件
      vi /etc/init.d/apache
      #chkconfig: 35 86 76
      #指定httpd脚本可以被chkconfig命令管理。格式是: chkconfig: 运行级别 启动顺序 关闭顺序
      启动级别在/etc/rc.d/ 里面查看,rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d这六个就是0-6运行级别中文件的启动以及关闭顺序,启动顺序以S打头,关闭顺序以K打头,只需要找一个没有被占用的数字即可,不能和现有的顺序重叠。
      #description: source package apache
      #说明,内容随意
      只需要写两句英文即可,两句都是注释,都得有#号,写在文件开始。
      不太推荐修改,使用标准的启动方式就比较好

12.4 总结

img

第十三章 Linux系统管理

13.1 进程管理

13.1.1 进程查看

(1)进程简介

进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。

(2)进程管理的作用
  • 判断服务器健康状态

  • 查看系统中所有进程

  • 杀死进程

(3)查看系统中所有进程
  • ps aux
    查看系统中所有进程,使用BSD操作系统格式。(Unix)

  • ps -le
    查看系统中所有进程,使用Linux标准命令格式。

  • ps aux 输出信息

    • USER:该进程是由哪个用户产生的;
    • PID:进程的ID号;
    • %CPU:该进程占用CPU资源的百分比,占用越高,进程 越耗费资源;
    • %MEM:该进程占用物理内存的百分比,占用越高,进程 越耗费资源;
    • VSZ:该进程占用虚拟内存的大小,单位KB;
    • RSS:该进程占用实际物理内存的大小,单位KB;
    • TTY:该进程是在哪个终端中运行的。其中tty1-tty7代表 本地控制台终端,tty1-tty6是本地的字符界面终端,tty7是图形终端。pts/0-255代表虚拟终端。
    • STAT:进程状态。常见的状态有:R:运行、S:睡眠 、T:停止状态、s:包含子进程、+:位于后台
    • START:该进程的启动时间
    • TIME:该进程占用CPU的运算时间,注意不是系统时间
    • COMMAND:产生此进程的命令名
  • 查看系统健康状态
    top [选项]

    • -d 秒数: 指定top命令每隔几秒更新。默认是3秒 在top命令的交互模式当中可以执行的命令
    • ?或h: 显示交互模式的帮助
    • P: 以CPU使用率排序,默认就是此项
    • M: 以内存的使用率排序
    • N: 以PID排序
    • q: 退出top

第一行信息为任务队列信息

内容 说明
12:26:46 系统当前时间
up 1 day, 13:32 系统的运行时间,本机已经运行1天 13小时32分钟
2 users 当前登录了两个用户
load average: 0.00, 0.00, 0.00 系统在之前1分钟,5分钟,15分钟 的平均负载。一般认为小于1时,负 载较小。如果大于1,系统已经超出 负荷。

第二行为进程信息

内容 说明
Tasks: 95 total 系统中的进程总数
1 running 正在运行的进程数
94 sleeping 睡眠的进程
0 stopped 正在停止的进程
0 zombie 僵尸进程。如果不是0,需要手工检查僵尸进程

第三行为CPU信息

内容 说明
Cpu(s): 0.1%us 用户模式占用的CPU百分比
0.1%sy 系统模式占用的CPU百分比
0.0%ni 改变过优先级的用户进程占用的CPU百分比
99.7%id 空闲CPU的CPU百分比
0.1%wa 等待输入/输出的进程的占用CPU百分比
0.0%hi 硬中断请求服务占用的CPU百分比
0.1%si 软中断请求服务占用的CPU百分比
0.0%st st(Steal time)虚拟时间百分比。就是当有虚拟机时,虚拟CPU等待实际CPU的时间百分比。

第四行为物理内存信息

内容 说明
Mem: 625344k total 物理内存的总量,单位KB
571504k used 已经使用的物理内存数量
53840k free 空闲的物理内存数量,我们使用的是虚 拟机,总共只分配了628MB内存,所以 只有53MB的空闲内存了
65800k buffers 作为缓冲的内存数量

第五行为交换分区(swap)信息

内容 说明
Swap: 524280k total 交换分区(虚拟内存)的总大小
0k used 已经使用的交互分区的大小
524280k free 空闲交换分区的大小
409280k cached 作为缓存的交互分区的大小
(4)查看进程树
  • pstree [选项]
    • -p: 显示进程的PID
    • -u: 显示进程的所属用户

13.1.2 终止进程

(1)kill命令
  • kill [信号代号] PID

  • kill –l # 查看可用的进程信号

  • 常用进程信号表

信号代号 信号名称 说明
1 SIGHUP 该信号让进程立即关闭,然后重新读取配置文件之后重启。
2 SIGINT 程序终止信号,用于终止前台进程。相当于输出ctrl+c快捷 键。
8 SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。
9 SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。 一般用于强制终止进程。
14 SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数 使用该信号。
15 SIGTERM 正常结束进程的信号,kill命令的默认信号。有时如果进程已 经发生问题,这个信号是无法正常终止进程的,我们才会尝 试SIGKILL信号,也就是信号9。
18 SIGCONT 该信号可以让暂停的进程恢复执行,本信号不能被阻断。
19 SIGSTOP 该信号可以暂停前台进程,相当于输入ctrl+z快捷键。本信号 不能被阻断。
(2) killall命令
  • killall [选项][信号代号] 进程名
    • 按照进程名杀死进程
    • -i: 交互式,询问是否要杀死某个进程
    • -I: 忽略进程名的大小写
      和kill不一样,他加进程名
(3) pkill命令
  • pkill [选项] [信号] 进程名

    • 按照进程名终止进程

    • -t 终端号: 按照终端号踢出用户

      按照终端号踢出用户

      • w
        使用w命令查询本机已经登录的用户
      • pkill -t -9 pts/1
        强制杀死从pts/1虚拟终端登录的进程

13.2 工作管理

13.2.1 把进程放入后台

  • 命令后面加&

  • 例子:
    tar -zcf etc.tar.gz /etc & (后台运行)
    但是像top,vim和用户交互的命令放在后台自动停止,不再运行

  • 运行界面按按ctrl+z

    • 例子:
      top
      在top命令执行的过程中,按ctrl+z快捷键放入后台(后台暂停)

13.2.2 查看后台的工作

  • jobs [-l]
    • -l 显示工作的PID
      注意:“+”号代表最近一个放入后台的工作,也是工作恢复时,默认恢复的工作。“-”号代表倒数第二个放入后台的工作

13.2.3 将后台暂停的工作恢复到前台执行

  • fg %工作号
    %工作号:%号可以省略,但是注意工作号和PID到区别

13.2.4 把后台暂停的工作恢复到后台执行

  • bg %工作号
    注意:后台恢复执行的命令,是不能和前台有交互的,否则不能恢复到后台执行

13.3 系统资源查看

  • vmstat命令监控系统资源
    vmstat [刷新延时 刷新次数]
    例子:
    vmstat 1 3

  • dmesg开机时内核检测信息
    dmesg
    例子:

    dmesg | grep CPU

  • free命令查看内存使用状态
    free [-b|-k|-m|-g]

    • -b: 以字节为单位显示
      -k: 以KB为单位显示,默认就是以KB为单位显示
      -m: 以MB为单位显示
      -g: 以GB为单位显示
  • 缓存和缓冲的区别
    简单来说缓存(cache)是用来加速数据 从硬盘中“读取”的,而缓冲(buffer) 是用来加速数据“写入”硬盘的。

  • 查看CPU信息
    cat /proc/cpuinfo
  • uptime命令
    uptime
    显示系统的启动时间和平均负载,也就是top命令的第一行。w命令也可以看到这个数据。
  • 查看系统与内核相关信息
    uname [选项]
  • -a: 查看系统所有相关信息;
    -r: 查看内核版本;
    -s: 查看内核名称。
  • 判断当前系统的位数
    没有直接的命令可以查看
    只能通过查看系统外部命令的文件类型,顺带写出位数
    file /bin/ls
  • 查询当前Linux系统的发行版本
    lsb_release -a
  • 列出进程打开或使用的文件信息
    lsof [选项]
    列出进程调用或打开的文件的信息
    • -c 字符串: 只列出以字符串开头的进程打开的文件
    • -u 用户名: 只列出某个用户的进程打开的文件
    • -p pid: 列出某个PID进程打开的文件

13.4 系统定时任务

  • crond服务管理与访问控制

    • service crond restart 启动
    • chkconfig crond on 自启动
  • 用户的crontab设置
    crontab [选项]

    • -e: 编辑crontab定时任务
      -l: 查询crontab任务
      -r: 删除当前用户所有的crontab 任务 ,如果想删一个,-e进去之后删除

    • crontab -e 标准格式
      进入crontab编辑界面。会打开vim编辑你的工作。

      *****执行的任务
      其中*号代表

    项目 含义 范围
    第一个“*” 一小时当中的第几分钟 0-59
    第二个“*” 一天当中的第几小时 0-23
    第三个“*” 一个月当中的第几天 1-31
    第四个“*” 一年当中的第几月 1-12
    第五个“*” 一周当中的星期几 0-7(0和7都代表星期日)

    这个表可以配合特殊符号使用:

    特殊符号 含义
    * 代表任何时间。比如第一个“*”就代表一小时中 每分钟都执行一次的意思。
    代表不连续的时间。比如“0 8,12,16 * * * 命令”, 就代表在每天的8点0分,12点0分,16点0分都执 行一次命令
    - 代表连续的时间范围。比如“0 5 * * 1-6命令”, 代表在周一到周六的凌晨5点0分执行命令
    */n 代表每隔多久执行一次。比如“*/10 * * * * 命 令”,代表每隔10分钟就执行一遍命令

    例子:

    时间 含义
    45 22 * * * 命令 在22点45分执行命令
    0 17 * * 1 命令 每周1 的17点0分执行命令
    0 5 1,15 * * 命令 每月1号和15号的凌晨5点0分执行命 令
    40 4 * * 1-5 命令 每周一到周五的凌晨4点40分执行命 令
    */10 4 * * * 命令 每天的凌晨4点,每隔10分钟执行一 次命令
    0 0 1,15 * 1 命令 每月1号和15号,每周1的0点0分都会 执行命令。注意:星期几和几号最好 不要同时出现,因为他们定义的都是 天。非常容易让管理员混乱。

第十四章 日志管理

14.1 日志管理简介

14.1.1 日志服务

  • 在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务。rsyslogd日志服务更加先进,功能更多。但是不论该服务的使用,还是日志文件的格式其实都是和syslogd服务相兼容的,所以学习起来基本和syslogd服务一致。

  • rsyslogd的新特点:

    • 基于TCP网络协议传输日志信息;
    • 更安全的网络传输方式;
    • 有日志消息的及时分析框架;
    • 后台数据库;
    • 配置文件中可以写简单的逻辑判断;
    • 与syslog配置文件相兼容。
  • 确定服务启动

    • ps aux | grep rsyslogd
      查看服务是否启动
    • chkconfig –list | grep rsyslog
      查看服务是否自启动
    • CentOS 7 变为 systrmctl list-unit-files | grep rsyslog

14.1.2常见日志的作用

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志。
/var/log/cups/ 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息。也可以使用 dmesg命令直接查看内核自检信息。
/var/log/btmp 记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看,命令如下: lastbroot tty1 Tue Jun 4 22:38 - 22:38 (00:00) 有人在6月4日22:38使用root用户,在本地终端1登录错误
/var/log/lastlog 记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接vi,而要使用lastlog命令查看。
/var/log/mailog 记录邮件信息。
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/secure 记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。 比如说系统的登录,ssh的登录,su切换用户,sudo授权,甚至添加 用户和修改用户密码都会记录在这个日志文件中。
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、 关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需 要使用last命令来查看。
/var/run/utmp 记录当前已经登录的用户的信息。这个文件会随着用户的登录和注 销而不断变化,只记录当前登录用户的信息。同样这个文件不能直 接vi,而要使用w,who,users等命令来查询。

除了系统默认的日志之外,采用RPM方 式安装的系统服务也会默认把日志记录在/var/log/目录中(源码包安装的服务日志 是在源码包指定目录中)。不过这些日志不是由rsyslogd服务来记录和管理的,而 是各个服务使用自己的日志管理文档来记录自身日志。

日志文件 说明
/var/log/httpd/ RPM包安装的apache服务的默认日志目录
/var/log/mail/ RPM包安装的邮件服务的额外日志目录
/var/log/samba/ RPM包安装的samba服务的日志目录
/var/log/sssd/ 守护进程安全服务目录

14.2 rsyslogd 日志服务

14.2.1 日志文件格式

  • 基本日志格式包含以下四列:

    • 事件产生的时间;
    • 发生事件的服务器的主机名;
    • 产生事件的服务名或程序名;
    • 事件的具体信息。
  • /etc/rsyslog.conf配置文件
    写入这个文件可以自定义需要记录日志的程序

    • authpriv.* /var/log/secure
    • 服务名称[连接符号]日志等级 日志记录位置
      认证相关服务.所有日志等级记录在/var/log/secure日志中
  • 服务名称

    服务名称 说明
    auth 安全和认证相关消息(不推荐使用authpriv替代)
    authpriv 安全和认证相关消息(私有的)
    cron 系统定时任务cront和at产生的日志
    daemon 和各个守护进程相关的日志
    ftp ftp守护进程产生的日志
    kern 内核产生的日志(不是用户进程产生的)
    local0-local7 为本地使用预留的服务
    lpr 打印产生的日志
    mail 邮件收发信息
    news 与新闻服务器相关的日志
    syslog 有syslogd服务产生的日志信息(虽然服务名 称已经改为rsyslogd,但是很多配置都还是沿 用了syslogd的,这里并没有修改服务名)。
    user 用户等级类别的日志信息
    uucp uucp子系统的日志信息,uucp是早期linux系
    • 连接符号

      • 连接符号可以识别为:
        • “*”代表所有日志等级,比如:“authpriv.*”代表authpriv认证信息服务产生的日志,所有的日志等级都记录
        • “.”代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的日志,只要日 志等级大于等于info级别,就记录
        • “.=”代表只记录所需等级的日志,其他等级的都不记录。比 如:“*.=emerg”代表人和日志服务产生的日志,只要等级是 emerg等级就记录。这种用法及少见,了解就好
        • “.!”代表不等于,也就是除了该等级的日志外,其他等级的 日志都记录。
    • 日志等级

      等级名称 说明
      debug 一般的调试信息说明
      info 基本的通知信息
      notice 普通信息,但是有一定的重要性
      warning 警告信息,但是还不回影响到服务或系统的运行
      err 错误信息,一般达到err等级的信息以及可以影响到服务或系统的运行了。
      crit 临界状况信息,比err等级还要严重
      alert 警告状态信息,比crit还要严重。必须立即采取行动
      emerg 疼痛等级信息,系统已经无法使用了
    • 日志记录位置

      • 日志文件的绝对路径,如“/var/log/secure”
      • 系统设备文件,如“/dev/lp0”
      • 转发给远程主机,如“@192.168.0.210:514”
        用户名,如“root”
      • 忽略或丢弃日志,如“~”

14.3 日志轮替

14.3.1 日志文件的命名规则

  • 如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀, 例如“secure-20130605”。这样的话日志文件名不会重叠,所以也就不需要日志文 件的改名,只需要保存指定的日志个数, 删除多余的日志文件即可。

  • 如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志 轮替时,当前的“secure”日志会自动改名为 “secure.1”,然后新建“secure”日志,用来 保存新的日志。当第二次进行日志轮替时, “secure.1”会自动改名为“secure.2”,当前的 “secure”日志会自动改名为“secure.1”,然 后也会新建“secure”日志,用来保存新的日志 ,以此类推。

14.3.2 logrotate配置文件

参数 参数说明
daily 日志的轮替周期是每天
weekly 日志的轮替周期是每周
monthly 日志的轮替周期是每月
rotate 数字 保留的日志文件的个数。0指没有备份
compress 日志轮替时,旧的日志进行压缩
create mode owner group 建立新日志,同时指定新日志的权限与所有者和 所属组。如create 0600 root utmp
mail address 当日志轮替时,输出内容通过邮件发送到指定的 邮件地址。如mail 1771566679@qq.com
missingok 如果日志不存在,则忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志轮替
minsize 大小 日志轮替的最小值。也就是日志一定要达到这个 最小值才会轮替,否则就算时间达到也不轮替size 大小 日志只有大于指定大小才进行日志轮替,而不是 按照时间轮替。如size 100k
dateext 使用日期作为日志轮替文件的后缀。如secure- 20130605

在/etc/logrotate.conf 配置文件里修改轮替规则,下面大括号外面的变量相当于局部变量,而大括号里面的相当于全局变量,只有大括号里面没有声明,外面的才生效,一旦大括号声明了,大括号里面的优先级高于外面,优先生效

14.3.3 把apache日志加入轮替

vi /etc/logrotate.conf /usr/local/apache2/logs/access_log
{
daily
create
rotate 30
}
一般只有源码包安装才需要这样加入,RPM包在安装时候会自动做日志

logrotate命令
logrotate [选项] 配置文件名
如果此命令没有选项,则会按照配置文件中的条件进行

14.3.4 logrotate 命令

  • logrotate [选项] 配置文件名
    • -v:显示日志轮替过程。加了-v选项,会显示日志的轮 替的过程
    • -f: 强制进行日志轮替。不管日志轮替的条件是否已经 符合,强制配置文件中所有的日志进行轮替

第十五章 启动管理

15.1 CentOS 6.x启动管理

15.1.1 系统运行级别

  • 运行级别

    运行级别 含义
    0 关机
    1 单用户模式,可以想象为windows的安全模式,主要用 于系统修复
    2 不完全的命令行模式,不含NFS服务
    3 完全的命令行模式,就是标准字符界面
    4 系统保留
    5 图形模式
    6 重启动
  • 运行级别命令

    • runlevel
      查看运行级别命令
    • init 运行级别
      改变运行级别命令
  • 修改系统默认运行级别
    vim /etc/inittab
    id:3:initdefault:
    系统开机后直接进入哪个运行级别,就把数字改为对应的数字

15.1.2 系统启动过程

系统启动流程

  • initramfs内存文件系统
    CentOS 6.x中使用initramfs内存文件系统 取代了CentOS 5.x中的initrd RAM Disk。 他们的作用类似,可以通过启动引导程序加载到内存中,然后加载启动过程中所需要的内核模块,比如USB、SATA、SCSI 硬盘的驱动和LVM、RAID文件系统的驱动

  • 一个实验看initramfs文件系统

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      mkdir /tmp/initramfs
    # 建立测试目录
    cp /boot/initramfs-2.6.32-279.el6.i686.img /tmp/initramfs/
    # 复制initramfs文件
    cd /tmp/initramfs/
    file initramfs-2.6.32-279.el6.i686.img
    mv initramfs-2.6.32-279.el6.i686.img initramfs-2.6.32-279.el6.i686.img.gz
    # 修改文件的后缀名为.gz
    gunzip initramfs-2.6.32-279.el6.i686.img.gz
    # 解压缩
    file initramfs-2.6.32-279.el6.i686.img
    cpio -ivcdu < initramfs-2.6.32-279.el6.i686.img
    # 解读cpio文件
  • 调用/etc/init/rcS.conf配置文件
    主要功能是两个:

    • 先调用/etc/rc.d/rc.sysinit,然后由 /etc/rc.d/rc.sysinit配置文件进行Linux系统初始化。
    • 然后再调用/etc/inittab,然后由/etc/inittab配 置文件确定系统的默认运行级别。
  • 由/etc/rc.d/rc.sysinit初始化

    1、获得网络环境
    2、挂载设备
    3、开机启动画面Plymouth(取替了过往的 RHGB)
    4、判断是否启用SELinux
    5、显示于开机过程中的欢迎画面
    6、初始化硬件
    7、用户自定义模块的加载
    8、配置内核的参数
    9、设置主机名
    10、同步存储器
    11、设备映射器及相关的初始化
    12、初始化软件磁盘阵列(RAID)
    13、初始化 LVM 的文件系统功能
    14、检验磁盘文件系统(fsck)
    15、设置磁盘配额(quota)
    16、重新以可读写模式挂载系统磁盘
    17、更新quota(非必要)
    18、启动系统虚拟随机数生成器
    19、配置机器(非必要)
    20、清除开机过程当中的临时文件
    21、创建ICE目录
    22、启动交换分区(swap)
    23、将开机信息写入/var/log/dmesg文件中

  • 调用/etc/rc.d/rc文件
    运行级别参数传入/etc/rc.d/rc这个脚本之 后,由这个脚本文件按照不同的运行级别启动/etc/rc[0-6].d/目录中的相应的程序

    • /etc/rc3.d/K??开头的文件(??是数字),会按照数字顺序依次关闭
    • /etc/rc3.d/S??开头的文件(??是数字),会 按照数字顺序依次启动

15.2 启动引导程序grub

15.2.1 Grub配置文件

  • grub中分区表示
硬盘 分区 Linux中设备文件 名 Grub中设备文件名
第一块SCSI硬盘 第一个主分区 /dev/sda1 hd(0,0)
第一块SCSI硬盘 第二个主分区 /dev/sda2 hd(0,1)
第一块SCSI硬盘 扩展分区 /dev/sda3 hd(0,2)
第一块SCSI硬盘 第一个逻辑分区 /dev/sda5 hd(0,4)
第二块SCSI硬盘 第一个主分区 /dev/sdb1 hd(1,0)
第二块SCSI硬盘 第二个主分区 /dev/sdb2 hd(1,1)
第二块SCSI硬盘 扩展分区 /dev/sdb3 hd(1,2)
第二块SCSI硬盘 第一个逻辑 /dev/sdb5 hd(1,4)
  • grub配置文件 vi /boot/grub/grub.conf
    • default=0 默认启动第一个系统
    • timeout=5 等待时间,默认是5秒
    • splashimage=(hd0,0)/grub/splash.xpm.gz
      这里是指定grub启动时的背景图像文件的保存位置的
    • hiddenmenu 隐藏菜单
    • 在CentOS7中为vim /etc/default/grub
    • title CentOS (2.6.32-279.el6.i686) t itle就是标题的意思
    • root (hd0,0) 是指启动程序的保存分区
    • kernel /vmlinuz-2.6.32-279.el6.i686 ro root=UUID=b9a7a1a8-767f-4a87-8a2b-a535edb362c9 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
      定义内核加载时的选项
    • initrd /initramfs-2.6.32-279.el6.i686.img 指定了initramfs内存文件系统镜像文件的所在位置

15.2.2 Grub加密与字符界面分辨率调整

  • 在开机选择内核界面可以按e进入里面破解root密码,这个时候为了安全,便需要给grub加密才能进入按e界面

  • grub加密
    命令:
    grub-md5-crypt
    生成加密密码串
    vi /boot/grub/grub.conf
    在splashimage=(hd0,0)这一行前面写入
    password –md5 刚刚生产的密码串
    Password选项放在整体设置处
    重启就可以了
    CentOS 7.2以后使用 grub2-setpassword 直接设置密码

  • 纯字符界面的分辨率调整
    查询内核是否支持分辨率调整
    grep “CONFIG_FRAMEBUFFER_CONSOLE” /boot/config-3.10.0-1127.el7.x86_64
    显示 CONFIG_FRAMEBUFFER_CONSOLE=y
    就为可以调整

  • 再输入命令:
    vim /boot/grub/grub.conf
    内核的选项文件中
    Kernel /vmlinuz- ******这句话后面加入 vga=791,便是调整1024768 16位的分辨率,具体数字对应分辨率见下表:

    色深 640*480 800*600 1024*768 1280*1024
    8位 769 771 773 775
    15位 784 787 790 793
    16位 785 788 791 794
    32位 786 789 792 795

15.3 系统修复模式

  • 单用户模式
    在登陆选择内核界面,按e键进入内核选项

  • 单用户模式常见的错误修复

    • 遗忘root密码
    • 修改系统默认运行级别
  • 修改密码:
    CentOS7
    找到linux16 这一行 在CN.UTF-8 后面加入
    rd.break console=tty0
    然后按ctrl+x
    然后依次输入:
    mount -o remount,rw /sysroot
    chroot /sysroot/
    passwd root 或者 echo 密码 | passwd –stdin root
    在这之后会出现很多小方块 这行小方块是中文编码问题,不用管它。输一次密码回车,再输一次确认密码,回车。
    接着输入:
    touch /.autorelabel
    sync
    exit
    exit
    重启就OK了,使用新密码登陆

  • 光盘修复模式
    在忘记了grub密码的时候可以使用这个模式
    在虚拟机中放入光盘iso文件,在虚拟机VMware界面读条的时候,快速按F2键,苹果系统可按fn+F2,进入刚开始学习安装的界面之后,选择上面第四栏BOOT,调到光盘启动CR-Drive为首选(按+号调节),F10保存。在安装节目选第三项Troublesooting 回车,选择第二项Rescue a CentOS system 回车,选择2 Shell模式 回车 回车 ,此时根目录已经被挂载到光盘下 /mnt/sysimage目录下
    chroot /mnt/sysimage #改变主目录
    grub2-setpassword
    输入新密码即可

  • 重要系统文件丢失,导致系统无法启动
    假设丢了etc/inittab 文件,你可以在其他同版本的Linux查询到这个文件所在的包
    chroot /mnt/sysimage #改变主目录
    cd /root
    rpm -qf /etc/inittab #查询下/etc/inittab文件属于哪个包。
    mkdir /mnt/cdrom #建立挂载点
    mount /dev/sr0 /mnt/cdrom #挂载光盘
    rpm2cpio /mnt/cdrom/Packages/initscripts-8.45.3-1.i386.rpm | cpio -idv ./etc/inittab
    #提取inittab文件到当前目录
    cp etc/inittab /etc/inittab #复制inittab文件到指定位置

    在光盘修复模式下可以修改大部分问题。

  • Linux的安全性

    Linux的安全性
    所以安全性是相对的,这是给我们留的退路

第十六章 备份与恢复

16.1 备份概述

  • Linux系统需要备份的数据

    • /root/目录:
    • /home/目录:
    • /var/spool/mail/目录:
    • /etc/目录:
    • 其他目录:
  • 安装服务的数据

    • apache需要备份的数据

      • 配置文件

      • 网页主目录

      • 日志文件

      • mysql需要备份的数据

      • 源码包安装的mysql:/usr/local/mysql/data/

      • RPM包安装的mysql:/var/lib/mysql/

      • 】备份策略

  • 备份策略

    • 完全备份:完全备份就是指把所有需要备 份的数据全部备份,当然完全备份可以备份整块硬盘,整个分区或某个具体的目录

      差异备份

    • 增量备份

    • 差异备份

16.2 dump和restore命令

16.2.1 dump命令

  • dump [选项] 备份之后的文件名 原文件或目录

    • -level:就是我们说的0-9十个备份级别
    • -f 文件名: 指定备份之后的文件名
    • -u: 备份成功之后,把备份时间记录在/etc/dumpdates文件
    • -v:显示备份过程中更多的输出信息
    • -j: 调用bzlib库压缩备份文件,其实就是把备份文件压缩 为.bz2格式,默认压缩等级是2
    • -W: 显示允许被dump的分区的备份等级及备份时间
    • CentOS 7以前版本需要安装dump yum -y install dump下载
  • CentOS 7 以后版本使用xfsdump备份xfs文件系统

    • XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。
    • centos7选择xfs格式作为默认文件系统,而且不再使用以前的ext,仍然支持ext4,xfs专为大数据产生,每个单个文件系统最大可以支持8eb,单个文件可以支持16tb,不仅数据量大,而且扩展性高。还可以通过xfsdump,xfsrestore来备份和恢复。
    • 与传统的UNIX文件系统不同,XFS不需要在备份前被卸载;对使用中的XFS文件系统做备份就可以保证镜像的一致性。XFS的备份和恢复的过程是可以被中断然后继续的,无须冻结文件系统。xfsdump 甚至提供了高性能的多线程备份操作——它把一次dump拆分成多个数据流,每个数据流可以被发往不同的目的地。
    • 使用yum -y install xfsdump下载
  • 只有在备份文件系统才能执行增量备份,执行1-9级别,文件和目录只能执行0级别

  • 备份分区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dump -0uj -f /root/boot.bak.bz2 /boot/
    # 备份命令。先执行一次完全备份,并压缩和更新备份时间
    cat /etc/dumpdates
    # 查看备份时间文件
    cp install.log /boot/
    # 复制日志文件到/boot分区
    dump -1uj -f /root/boot.bak1.bz2 /boot/
    # 增量备份/boot分区,并压缩
    dump –W
    # 查询分区的备份时间及备份级别的
  • 备份文件或目录
    dump -0j -f /root/etc.dump.bz2 /etc/
    完全备份/etc/目录,只能使用0级别进行完全备份 ,而不再支持增量备份

16.2.1 restore命令

  • estore [模式选项] [选项]
    • 模式选项:restore命令常用的模式有以下四种,这四个模式不能混用。
      • -C:比较备份数据和实际数据的变化。
      • -i: 进入交互模式,手工选择需要恢复的文件。
      • -t: 查看模式,用于查看备份文件中拥有哪些数据。
      • -r: 还原模式,用于数据还原。
    • 选项:
      -f: 指定备份文件的文件名
      比较备份数据和实际数据的变化
      mv /boot/vmlinuz-2.6.32-279.el6.i686 /boot/vmlinuz-2.6.32- 279.el6.i686.bak
      #把/boot目录中内核镜像文件改个名字 restore -C -f /root/boot.bak.bz2 #restore发现内核镜像文件丢失