shell

Bash Shell

定义:BashShell是一个命令解释器,主要负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给内核,由内核驱动硬件,最终将处理后的结果输出至BashShell屏幕[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCo3xYPe-1690465877801)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDY2ODM3NA==,size_16,color_FFFFFF,t_70.png)]

定义:BashShell是一个命令解释器,主要负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给内核,由内核驱动硬件,最终将处理后的结果输出至BashShell屏幕[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YubvMjnI-1690465877802)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDY2ODM3NA==,size_16,color_FFFFFF,t_70.png)]

快捷键

  • ctrl+a:光标移动到行首

  • ctrl+e:光标移动到行尾

  • ctlr+l:清屏(对应的命令clear)

  • ctrl+c:结束当前的任务;非常常用

  • ctrl+k:删除光标以后的所有内容

  • ctrl+u:删除光标以前的所有内容

  • ctrl+w:按照单词进行删除,删除光标以前的内容

  • ctrl+d:退出当前的bash会话,并不影响服务器运行的后台程序

  • ctrl+左右:按照单词进行跳跃

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AF8e0CxA-1690465877803)(shell.assets/1.gif)]

历史记录history

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# history 
   65  firewall-cmd --zone=public --list-ports
   66  firewall-cmd --zone=public --add-port=8097/tcp --permanent
   67  firewall-cmd --reload
   68  ssh -L 8097:127.0.0.1:8097 yuanshuai20@59.72.109.240
   69  ls
   70  history 
   71  ls
   72* 
   73  history 
   74  pwd
   75  history 
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# !74  #调用history中历史记录的第77条指令
pwd
/root
  • -N: 显示历史记录中最近的N个记录;
  • -c:清空当前历史命令;
  • -a:将历史命令缓冲区中命令写入历史命令文件中;
  • -r:将历史命令文件中的命令读入当前历史命令缓冲区;
  • -w:将当前历史命令缓冲区命令写入历史命令文件中;
  • -d :删除历史记录中第offset个命令
  • -n :读取指定文件

对历史记录操作不会影响历史文件,历史记录存在历史文件里。如果历史文件改变,那么记录也会改变。

注: 如想查询某个用户在系统上执行了什么命令,可以使用root用户身份登录系统,检查该用户~目录下的.bash_history文件,该文件记录了用户所使用的命令和历史信息。

自定义别名alias

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# alias 自定义别名='指令名称'

**注:**alias的效力仅于该次登入的操作。若要每次登入是即自动设好别名,可在.bashrc中设定指令的别名。

  • unalias :删除别名

目录管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r0bd9smb-1690465877803)(shell.assets/d0c50-linux2bfile2bsystem2bhierarchy.jpg)]

目录

系统启动必须:

  • **/boot:**存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。

  • /etc:存放所有的系统需要的配置文件和**子目录列表,**更改目录下的文件可能会导致系统不能启动。

  • /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

  • /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中

指令集合:

  • **/bin:**存放着最常用的程序和指令

  • **/sbin:**只有系统管理员能使用的程序和指令。

外部文件管理:

  • **/dev :**Device(设备)的缩写, 存放的是Linux的外部设备。**注意:**在Linux中访问设备和访问文件的方式是相同的。

  • /media:类windows的**其他设备,**例如U盘、光驱等等,识别后linux会把设备放到这个目录下。

  • /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

临时文件:

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

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

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

账户:

  • /root:系统管理员的用户主目录。

  • /home:用户的主目录,以用户的账号命名的。

  • /usr:用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

  • **/usr/bin:**系统用户使用的应用程序与指令。

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

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

运行过程中要用:

  • /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。

  • /proc:管理**内存空间!**虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。

扩展用的:

  • /opt:默认是空的,我们安装额外软件可以放在这个里面。

  • /srv:存放服务启动后需要提取的数据**(不用服务器就是空)**

路径

FQ:/abc/test 和 abc/test 是一样的吗?

  • 如果现在在根目录下两者一样,因为/代表根目录
  • 如果现在在别的目录前者就是根目录下的abc,而后者是现在目录下的abc

目录命令

**创建文件:**touch

  • 创建多个有规律的文件 touch {A…Z}

**创建目录:**mkdir

  • -p:递归创建
  • 创建多个有规律的目录 mkdir {A…Z}

**删除文件或者目录:**rm

  • -r:递归删除子目录

**复制文件或者目录:**cp

  • -r:递归

  • 如果有重复文件,\cp是原生指令不会提示覆盖,而cp别名为cp -i会提示是否覆盖

  • 一次拷贝多个文件目录,最后一个如果是目录必须存在

  • -p:保持复制的文件与源文件一样的属性,所属组一样

**移动文件或者目录:**mv

文件管理

查看文件

  • cat:-n 带行号查看
  • less,more:分页查看
    • ctrl+f:下一页
    • ctrl+b:上一页
    • more:有百分比显示
  • head,tail:
    • tail -f(tailf): 实时追踪尾部变化

查找文件

  • which:查找命令绝对类路径
  • whereis:
    • -b:查看二进制文件

下载文件

  • wget,curl:从网络下载资源

    • wget -O:下载文件并重命名

      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# wget -O ./1.REP http://mirrors.aliyun.com/repo/Centos-7.repo
      
    • curl -o:下载文件并重命名

  • sz:Linux下载到Windows。不能超过4g,不支持断点续传,不能下载文件夹。

  • rz:Windows上传到Linux。

字符处理命令

  • sort:

    • -t:以哪个字符分割,默认为空格
    • -k:分割后第几列
      • m.n:第几列.第几个字符
    • -n:按照number方式排列
    • -r:反转
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# sort -t "." -k 3.1,3.1 -k 4.1,4.3 -n ip.txt 
    192.168.0.151 00:0F:AF:85:6C:F6
    192.168.0.152 00:0F:AF:83:1F:65
    192.168.1.1 00:0F:AF:81:19:1F
    192.168.1.10 00:30:15:A2:3B:B6
    192.168.1.21 00:0F:AF:85:6C:09
    192.168.1.152 00:0F:AF:83:1F:65
    192.168.2.2 00:0F:AF:85:6C:25
    192.168.2.20 00:0F:AF:85:55:DE
    192.168.2.22 00:0F:AF:85:5C:41
    
  • uniq:去重复

    • -c:统计出现次数
  • wc:统计行数

    • -l:统计行数

三剑客

  • 基本正则表达式BRE集合

    • \:转义字符,匹配特殊含义的字符,还原本意
    • :用于模式的最左侧。如yu,匹配以yu单词开头的行
    • :用于模式的最右侧。如 y u :用于模式的最右侧。如yu :用于模式的最右侧。如yu,匹配以yu单词结尾的行
    • ^ :匹配空行。因 为 后 面什么也没写,表示空; :匹配空行。因为^后面什么也没写,表示空; :匹配空行。因面什么也没写,表示空;前面什么也没写,也表示空
    • .:匹配任意一个且只有一个字符,不能匹配空行。如.ab,匹配xab字符
    • *:匹配一个字符(连续出现)0次或1次以上,重复0次代表空,即匹配所有内容,如a* 表示匹配a,0次或多次
    • .*:匹配任意长度的任意字符
    • ^.*:匹配任意多个字符开头的内容
    • .*$:匹配任意多个字符结尾的内容
    • [abc]:匹配[]集合内的任意一个字符,a或b或c,可以写成[a-c]
      • [a-z]匹配所有小写单个字母
      • [A-Z]匹配所有单个大写字母
      • [a-zA-Z]匹配所有的单个大小写字母
      • [0-9]匹配所有单个数字
      • [a-zA-Zo-9]匹配所有数字和字母
    • [abc]:匹配除了后面的任意字符,a或b或c,^表示对[abc]的取反
  • 扩展正则表达式ERE集合:必须用grep -E才能生效

    • +:匹配前一个字符1次或多次
    • [😕]+:匹配括号内的":“或者”/"字符1次或多次 [ab]+
    • ?:匹配前一个字符0次或1次
    • |:表示或者,同时过滤多个字符串
    • ():分组过滤,被括起来的内容表示一个整体
    • a{n,m}:匹配前一个字符最少n次,最多m次
    • a{n,} :匹配前一个字符最少n次
    • a{n}:匹配前一个字符正好n次
    • a{,m}:匹配前一个字符最多m次
  • grep:过滤行

    grep [参数] [匹配模式] 文件数据
            -v 排除匹配结果
            -n 显示匹配行与行号
            -i 不区分大小写
            -c 只统计匹配的行数
            -E 使用egrep命令
            --color=auto 为grep过滤结果添加颜色
            -W 只匹配过滤的单词
            -o 只输出匹配的内容
    
    • 例子

      • grep -v “ftp” pass:匹配除了包含ftp的内容,其他全部打印

      • grep -n “.” /var/log/secure:显示行号

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# grep -n "." /etc/passwd
            1:root:x:0:0:root:/root:/bin/bash
            2:bin:x:1:1:bin:/bin:/sbin/nologin
        
      • grep -n -A 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串打印本行以及它的下2行

      • grep -n -B 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串,并打印本行以及它的上2行

      • grep -n -C 2 “Failed” /var/log/secure:匹配/var/log/secure文件中Failed字符串,并打印本行以及它的上下2行

  • sed:替换字符串

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fHO1o1a-1690465877804)(shell.assets/webp.webp)]

    sed [选项] [sed内置命令字符] [输入文件]
            -n 取消默认sed的输出,常与sed内置命令p一起用(取消默认输出,只显示符合规则的)
            -i 直接将修改结果写入文件,不用-i,sed修改的是内存数据
            -e 多次编辑,不需要管道符了
            -r 支持正则扩展
    
    • sed匹配范围

      • 空地址:全文处理

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed 'a -------' sort.txt #每一行下面追加
        b:3
        -------
        c:2
        -------
        a:4
        -------
        e:5
        -------
        d:1
        -------
        f:11
        -------
        
      • 单地址:指定文件某一行

      • /pattern/:被模式匹配到的那一行

      • 范围区间:例如:10,20表示十到二十行;10,+5第10行向下5行

      • 步长:例如,12,表示1、3、5、7、9行;22,表示2、4、6、8、10

    • 内置命令字符:sed的内置命令字符用来对文件进行不同的操作功能,如对文件增删改查

      • a:append,对文本追加,在指定行后面添加一行/多行文本

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed '2a 111111' sort.txt #第二行后面追加
        b:3
        c:2
        111111
        
      • d:delete,删除匹配行

      • i:insert,表示插入文本,在指定行前添加一行/多行文本

      • p:print,打印匹配行的内容,通常p与-n一起用

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2,4p' #显示2-4行
                inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
                ether 00:16:3e:08:d2:49  txqueuelen 1000  (Ethernet)
                RX packets 191798995  bytes 91882211117 (85.5 GiB)
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2,+4p' #显示2向下4行
                inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
                ether 00:16:3e:08:d2:49  txqueuelen 1000  (Ethernet)
                RX packets 191799024  bytes 91882213741 (85.5 GiB)
                RX errors 0  dropped 0  overruns 0  frame 0
                TX packets 168468141  bytes 92112483215 (85.7 GiB)
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '2~4p' #显示2和6行
                inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
                TX packets 168468978  bytes 92112833071 (85.7 GiB)
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | sed -n '/inet/p' #匹配inet行
                inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
        
      • s/正则/替换内容/g:匹配正则内容,然后替换内容(支持正则),结尾g代表全局匹配

        • s///g,s###g,s@@@g一样
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# sed -e 's#b#z#g' -e 's/c/y/g' sort.txt #b换成z,c换成y
        z:3
        y:2
        a:4
        e:5
        d:1
        f:11
        
  • awk:查找行列

    awk [可选参数] '模式[动作]' 文件
    		-F 指定分隔字段符号
            -v 定义或修改一个awk内部的变量
            -f 从脚本文件中读取awk命令
    
    • awk内置变量

      • $n:指定分隔符后,当前记录的第n个字段,也就是第n列

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk '{print "第一行:"$1,"第二行:"$2}' ip.txt #"xxx"双引号可以更美观,使用逗号默认以空格分割
        第一行:192.168.3.1 第二行:00:0F:AF:81:19:1F
        第一行:192.168.3.2 第二行:00:0F:AF:85:6C:25
        第一行:192.168.3.3 第二行:00:0F:AF:85:70:42
        
      • $0:打印所有内容

      • FS:输入字段分隔符,默认为空白字符

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v FS=":" -v OFS="====" '{print $2,$4}' ip.txt 
        0F====81
        0F====85
        0F====85
        
        -v FS=":" 把原始文件以":"分割
        -v OFS="====" 把默认输出内容用"===="分割
        
      • OFS:输出字段分隔符,默认为空白字符

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -F ":" -v OFS="====" '{print $2,$4}' ip.txt 
        0F====81
        0F====85
        0F====85
         
        192.168.3.1 00:0F:AF:81:19:1F
        192.168.3.2 00:0F:AF:85:6C:25
        192.168.3.3 00:0F:AF:85:70:42
        -F ":" 把原始文件以":"分割
        -v OFS="====" 把默认输出内容用"===="分割
        
      • NF:分割后,统计字段数

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print $0,NF}' #最后一个数字为每一行的字段数
        eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 4
                inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255 6
                ether 00:16:3e:08:d2:49  txqueuelen 1000  (Ethernet) 5
                RX packets 191847056  bytes 91887526508 (85.5 GiB) 7
                RX errors 0  dropped 0  overruns 0  frame 0 9
                TX packets 168518209  bytes 92135199556 (85.8 GiB) 7
                TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 11
        
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print $NF}' # NF为字段数,$NF就相当于每一行最后一个字段,$(NF-1)倒数第二个字段,等等
        1500
        172.25.63.255
        (Ethernet)
        GiB)
        0
        GiB)
        0
        
      • NR:行数,可以大于,小于,不等于等等条件

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk 'NR==2,NR==4' | awk '{print $2,$4}' #第2-4行的2-4列
        172.25.50.171 255.255.192.0
        00:16:3e:08:d2:49 1000
        packets bytes
        
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ifconfig eth0 | awk '{print NR,$0}' #NR增加行号
        1 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        2         inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
        3         ether 00:16:3e:08:d2:49  txqueuelen 1000  (Ethernet)
        4         RX packets 191846486  bytes 91887472014 (85.5 GiB)
        5         RX errors 0  dropped 0  overruns 0  frame 0
        6         TX packets 168517655  bytes 92134951302 (85.8 GiB)
        7         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
      • RS:输入记录分隔符(输入换行符),指定输入时的换行符

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v RS=" " '{print NR,$0}' ip.txt # 以空格换行
        1 192.168.3.1
        2 00:0F:AF:81:19:1F
        192.168.3.2
        
      • ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

      • FNR:多个文件分别计数的行号

      • FILENAME:当前文件名

        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk '{print FILENAME,$0}' ip.txt # 
        
      • ARGC:命令行参数的个数

      • ARGV:数组,保存的是命令行所给定的各参数

    • awk自定义变量

      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v myname="ys" 'BEGIN{print"我的名字是:",myname}'
      我的名字是: ys
      #现在shell中设置变量,再使用
      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# myname="ys"
      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk -v myname=$myname 'BEGIN{print"我的名字是:",myname}'
      我的名字是: ys
      
    • printf格式化输出

      • %c:显示字符的ASCII码
      • %d,%i:十进制整数
      • %e,%E:科学计数法显示数值
      • %f:显示浮点数
      • %g,%G:以科学计数法的格式或浮点数的格式显示数值
      • %s:显示字符串
      • %u:无符号整数
      • %%:显示%自身
      • -:左对齐,例如:%-25s表示-左对齐25个字符长度
      • +:显示数值符号,例如:printf “%+d”
      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# awk 'BEGIN{printf "%d==\n%d==\n%d==\n",1,2,3,4}' #类似python一个%d对应一个参数,4没有%d对应,所以不显示
      1==
      2==
      3==
      
    • awk模式

      • BEGIN模式是处理文本之前需要执行的操作
      • END模式是处理完所有行之后执行的操作

文件属性

在Linux中,一个文件数据可分为两大类:数据元数据

  • 数据:泛指普通文件中的实际数据
  • 元数据:用来描述一个文件的特征的系统数据

在Linux中,一个文件的存储也会被分为两部分:inodeblock

  • inode:用来存储文件的元数据
  • block:用来存储文件的真实数据,一个block空间是4k
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls -li
total 16
917519 -rw-r--r-- 1 root root 2523 Aug  4  2022 1.REP
917517 -rw-r--r-- 1 root root 2523 Aug  4  2022 Centos-7.repo

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1iLbR5m-1690465877805)(shell.assets/image-20230420133604372.png)]

文件类型:

  • 当为 d 则是目录(directory)

  • 当为 - 则是普通文件;

  • 若是 l 则表示为链接文档(Link File);

  • 若是 b 则是设备文件(block块设备文件)和存储相关的设备,举例:硬盘,U盘,磁盘分区

  • 若是 c 则表示为设备文件(char字符设备文件)和字符相关的设备,举例:打印机,终端

  • 若是 s 则表示为socket安全套接字文件,网络编程(同一个服务器两个进程通信)

  • 若是 p 则表示为pipe管道文件,父进程与子进程之间的通信文件

    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# file 1.REP #使用file指令查看普通文件‘-’是什么类型文件
    1.REP: ASCII text
    

软连接和硬链接

硬链接:硬链接和原文件对应一个inode,就是对应一个文件,可以理解成一个文件有几个别名。

  • ln 源文件 链接名

软链接:软链接可以理解成快捷方式,和原文件的inode号不一样,它和Windows下的快捷方式的作用是一样的,软链接数据块中记录的亦是相对路径指向。

  • ln -s 源文件 链接名

注意:链接的源文件路径要写绝对路径,否则会报错

硬链接与软链接区别

  • 目录不能创建硬链接,并且硬链接不可以跨越分区系统。
  • 目录软链接特别常用,并且软链接支持跨越分区系统。
  • 硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
  • 删除软链接文件,对源文件及硬链接文件无任何影响。
  • 删除文件的硬链接文件,对源文件及链接文件无任何影响。
  • 删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
  • 删除源文件及其硬链接文件,整个文件会被真正的删除。

文件编辑vim

普通模式

G		#光标跳转至末端
gg		#光标跳转至顶端
$		#光标跳转至当前光标所在行的尾部
^		#光标跳转至当前光标所在行的首部
------------------------------------------------------------------
ctrl+f  #下一页
ctrl+b  #上一页
------------------------------------------------------------------ 
yy      #复制当前光标所在的行
nyy     #复制当前光标以及光标向下n行
------------------------------------------------------------------
P       #粘贴至当前光标下一行
P       #粘贴至当前光标上一行
------------------------------------------------------------------
dd      #删除当前光标所在的行
ndd     #删除当前光标所在的行以及往下的n行
dG      #删除当前光标以后的所有行
x       #删除当前光标标记往后的字符
X       #删除当前光标标记往前的字符 
------------------------------------------------------------------
dd & p  #剪贴、先删除dd(number dd),后粘贴p 
------------------------------------------------------------------
u       #撤销上一次的操作
------------------------------------------------------------------
r       #替换当前光标标记的单个字符R

编辑模式

i        #进入编辑模式,光标不做任何操作
a		 #进入编辑模式,将当前光标往后一位
o		 #进入编辑模式,并在当前光标下添加一行空白内容
------------------------------------------------------------------
I		 #进入编辑模式,并且光标会跳转至本行的头部
A		 #进入编辑模式,将光标移动至本行的尾部
O		 #进入编辑模式,并在当前光标上添加一行空白内容

末行模式

w 		#保存
w ./xx  #另存为到./xx路径下
------------------------------------------------------------------
q		#退出
------------------------------------------------------------------
/		#搜索
n		#查找下一个
N		#查找上一个
------------------------------------------------------------------
:n,ms#a#b#g	#把n到m行中a替换成b
:%s#a#b#g	#a替换成b   

视图模式

批量操作连续的行: shift+v 
d: 删除
y: 复制
批量操作连续的列: ctrl+v
shift+i相当于I:顶部插入'#'内容进行注释
x/d:删除'#'注释

其他

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# vimdiff ip.txt ip1.txt  #vim比较两个文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qtA6ZZz-1690465877805)(shell.assets/image-20230421140455358.png)]

set nu #显示行号
set ic #搜索忽略大小写
------------------------------------------------------------------
针对当前用户vim环境: vim ~/.vimrc 
针对系统所有用户vim环境: vim /etc/.vimrc
------------------------------------------------------------------
针对vim异常退出:
首先使用vim -r filename恢复文件,但是重新进入还会提示,所以使用rm -f .filename.swp删除对应文件的.swp文件就不会提示了

用户管理

/etc/passwd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TI3dTKCA-1690465877806)(shell.assets/下载.png)]

/etc/shadow

root@iZ2zeco2fmiqbbuzq773qyZ ~]#  cat /etc/shadow
root:$6$A/MGS6qN08/a$1Lj0ukzeLeCoKuJjaAjGK2tRa9HkyzaC4OYLo0GRtWyayLxix9qX7y9Cyul966AUpw5RI5XVjvkfqK/3s3..M0:19319:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
sync:*:17834:0:99999:7:::
shutdown:*:17834:0:99999:7:::
halt:*:17834:0:99999:7:::

字段名称解释
1.用户登陆名             #用户的账号名称
2.加密后的密码           #用户密码,这是加密过的口令(未设密码时为!!)
---------了解----------------
3.最近一次密码更改时间     #从1970年到最近一次更改密码时间之间过了多少天
4.密码最少使用几天        #密码最少使用几天才可以更改密码(0表示无限制)
5.密码最长使用几天        #密码使用多少天需要修改密码(默认99999永不过期)
6.密码到期前警告期限      #密码过期前多少天提醒用户更改密码(默认过期提前7天警告)
7.密码到期后保持活动的天数 #在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定
8.账户到期时间           #从1970年起,账户在这个日期前可使用,到期后失效。
9.标志                  #保留

用户增删改

添加用户useradd username

需求:创建qq用户,UID为5001,基本组students,附加组sa,注释信息2021 new student,登陆shell为/bin/bash

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd students
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd sa
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# useradd qq -u 5001 -g students -G sa -c "2021 new students" -s /bin/bash
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# id qq
uid=5001(qq) gid=1001(students) groups=1001(students),1002(sa)
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/passwd
qq:x:5001:1001:2021 new students:/home/qq:/bin/bash
useradd参数:
		-u: 指定UID
		-g: 指定组名称
		-G: 指定附加组名称
		-c: 附加描述信息 (忽略)
		-s: 指定登录Shell窗口的类型
		-M: 不创建用户家目录
		-r: 创建系统用户(UID随机为201-999)

修改用户usermod username

usermod参数:	
	-u 指定要修改用户的UID
	-g 指定要修改用户基本组
	-G 指定要修改用户附加组,使用逗号隔开多个附加组, 覆盖原有的附加组
	-d 指定要修改用户家目录
	-s 指定要修改用户的bash shell
	-c 指定要修改用户注释信息
	-l 指定要修改用户的登陆名 (了解)

删除用户userdel username

userdel参数:	
	-r 删除用户同时,删除它的家目录
	
注意:有进程正在使用该用户,无法删除;只有进程退出后,用户没有被占用,才可以处理

密码设置passwd username

  1. 超级管理员
    • 随意修改任何人的密码,密码强度可以随意
  2. 普通用户执行
    • 仅修改自己的密码,不可以修改其他人,密码强度必须满足8个字符及以上
1.使用--stdin参数可以直接设置密码,不用确认
2.tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# echo "123" | tee a.txt | passwd --stdin qq
Changing password for user qq.
passwd: all authentication tokens updated successfully.

创建用户默认环境

系统创建用户参考的两个配置文件

  • /etc/login.defs

    • [root@iZ2zeco2fmiqbbuzq773qyZ ~]# grep -vE  "^#|^$" /etc/login.defs 
      MAIL_DIR        /var/spool/mail
      PASS_MAX_DAYS   99999      		#密码最常使用的天数
      PASS_MIN_DAYS	0				#密码最小使用的天数
      PASS_MIN_LEN	5				#密码默认的长度
      PASS_WARN_AGE	7				#密码过期前7天警告
      #定义的普通用户的UID范围
      UID_MIN                  1000
      UID_MAX                 60000
      #定义系统用户的UID范围
      SYS_UID_MIN               201
      SYS_UID_MAX               999
      #定义组的GID范围
      GID_MIN                  1000
      GID_MAX                 60000
      #定义系统组GID范围
      SYS_GID_MIN               201
      SYS_GID_MAX               999
      #创建家目录
      CREATE_HOME     yes
      UMASK           077
      #创建用户并且创建同名的组
      USERGROUPS_ENAB yes
      #加密的算法
      ENCRYPT_METHOD SHA512 
      
  • /etc/default/useradd

    • [root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/default/useradd
      # useradd defaults file
      GROUP=100
      HOME=/home					#家目录创建在/home
      INACTIVE=-1					#是否启用账号过期停权,-1表示不启用
      EXPIRE=						#账号终止日期,不设置表示不启用
      SHELL=/bin/bash				#默认给一个登录shell类型
      SKEL=/etc/skel				#默认拷贝一个环境变量到家目录,如果用户故障,可以从这里重新拷贝一份
      CREATE_MAIL_SPOOL=yes		#创建mail文件
      

用户组增删改

创建组groupadd

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupadd g1 -g 1456
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/group
g1:   x:    1456:  
组名称 组密码 组GID 附加组成员

修改组groupmod

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# groupmod g1 -g 5656
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -1 /etc/group
g1:x:5656:

删除组groupdel

  • 组中存在成员怎么办?

    • 如果组是附加组:

      • 如果附加组中只有附加组成员,直接删除,而用户附加组信息会自动被移除
      • 如果附加组中有附加组成员和基本组成员,需要先从基本组中删除该成员,然后再直接删除该附加组
    • 如果组是基本组:

      • 只有移除基本组中最后一个用户,该组才可以删除

用户权限

预备知识

  1. Linux Shell主要分为如下几类
    • 交互式shell,等待用户输入执行的命令(终端操作,需要不断提示)
    • 非交互式shell,执行shell脚本,脚本执行结束后shell自动退出
    • 登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
    • 非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
  2. bash shell配置文件介绍(文件主要保存用户的工作环境)
    • 个人配置文件:~/.bash_profile~/bashrc
    • 全局配置文件:/etc/profile/etc/profile.d/*.sh/etc/bashrc
    • profile类文件,设定环境变量,登陆前运行的脚本和命令
    • bashrc类文件,设定本地变量,定义命令别名
    • 注意:如果全局配置和个人配置产生冲突,以个人配置为准
  3. 登陆系统后,环境变量配置文件的应用顺序
    • 登录式shell配置文件执行顺序:/etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrc
    • 非登陆式shell配置文件执行顺序:~/.bashrc/etc/bashrc/etc/profile.d/*.sh

su 切换身份

  • su UserName相当于非登陆式shell,配置文件少,不推荐 ❌

  • su - Username相当于登录式shell ✔

  • 在root用户下直接借助Username用户身份去运行命令

    • 有些程序不支持root直接启动,必须是普通用户。所以普通用户不需要登录系统,只是用来完成服务的启动,通过 su - username -c “command” 来完成服务的启动。

      #不用登录qq用户,可以直接使用qq用户身份调用命令
      [root@iZ2zeco2fmiqbbuzq773qyZ ~]# su - qq -c "ifconfig"
      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
              inet 172.25.50.171  netmask 255.255.192.0  broadcast 172.25.63.255
              ether 00:16:3e:08:d2:49  txqueuelen 1000  (Ethernet)
              RX packets 221384000  bytes 111939096427 (104.2 GiB)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 188618377  bytes 112405781218 (104.6 GiB)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
      lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
              inet 127.0.0.1  netmask 255.0.0.0
              loop  txqueuelen 1000  (Local Loopback)
              RX packets 0  bytes 0 (0.0 B)
              RX errors 0  dropped 0  overruns 0  frame 0
              TX packets 0  bytes 0 (0.0 B)
              TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      

sudo 提取权限

# /etc/sudoers自定义用户权限类型
# 1.使用sudo定义分组,给用户分组
User_Alias OPS = oldxu,oldqiang
User_Alias DEV = oldli,oldguo

# 2.定义可执行的命令组
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
Cmnd_Alias Grant = /bin/rm, /bin/ls

# 3.使用sudo开始分配权限
OPS  ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV  ALL=(ALL) SOFTWARE,PROCESSES

权限与用户关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDpuoB6X-1690465877806)(shell.assets/image-20230423152750425.png)]

rwx对文件和目录影响

权限文件目录
读取权限(r)具有读取,阅读文件内容权限具有浏览目录及子目录
写入权限(w)具有新增,修改文件内容的权限具有增加和删除目录内的文件
执行权限(x)具有执行文件的权限具有访问目录的内容(取决于目录中文件权限)
  • 总结:
    • 文件rwx权限只能读,写,执行。如果想要删除,移动,复制文件需要该目录有rwx权限才行
    • 文件r权限, 只给用户查看,无其他操作
    • 文件rw权限, 可以查看和编辑文件内容
    • 文件rx权限, 允许查看和执行文件、但不能修改文件----->(脚本文件、命令文件)
    • 文件rwx权限, 能读,能写,能执行,但不能删除,因为删除需要看上级目录的权限有没有w----->(谨慎赋予)
    • 目录rx权限, 允许浏览目录内文件以及子目录, 不允许在该目录下创建文件、删除文件
    • 目录rw权限, 能查看目录,能往目录写入文件,但无法进入目录----->(使用的情况太少)
    • 文件的x权限小心给予,通常设定的权限是644
    • 目录的w权限小心给予,通常设定的权限是755

变更属主和属组

chown -R www 		PATH/		# 仅变更属主
chown -R .www 		PATH/		# 仅变更属组
chown -R www.root  	PATH/		# 同时变更属主和属组
	-R:对目录递归操作
  • 变更属主和属组的场景
    • www最开始没有访问index的资格,需要修改属主,属组和权限才能访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B0CVfZLG-1690465877807)(shell.assets/image-20230423183618706.png)]

特殊权限

注意:如果原来x位置上有权限则为小写,如果没有为大写

setuid(4):

  • 增加权限:chmod 4xxx或者chmod u+s

  • 取消权限:chmod 0xxx或者chmod u-s

  • setuid(suid):不可以对目录执行,他只针对二进制文件(命令)

  • 例子1:当普通用户oldxu执行passwd命令会发生什么变化

    1. 由于passwd命令拥有suid特殊权限(在命令属主权限位有一个s)

    2. 所以passwd命令在执行的过程中,会以命令的属主身份(也是root身份)去运行该命令

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKmjXKhm-1690465877807)(shell.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDc5NDMy,size_16,color_FFFFFF,t_70.png)]

  • 例子2:jack通过cat如何查看/etc/shadow文件:

    • jack执行cat命令查看/etc/shadow。cat是由jack运行的,能不能查看,取决于jack用户对/etc/shadow有没有权限,/etc/shadow默认任何人都无权限,所以查看失败,提示 Permission denied

    • 解决:

      方式1: sudo 提权
      		jack    ALL=(ALL)       /usr/bin/cat			
      方式2: 将cat命令添加特殊权限位  suid;
      		[root@oldboyedu ~]# ll /bin/cat
              -rwxr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
      		[root@oldboyedu ~]# chmod 4755 /bin/cat
      		[root@oldboyedu ~]# ll /bin/cat
      		-rwsr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
      

setgid(2):

  • 增加权限:chmod 2xxx或者chmod g+s

  • 取消权限:chmod 0xxx或者chmod g-s

  • 命令赋予setgid后,任何用户在执行命令时,以这个命令的属组身份去运行

  • 目录赋予setgid后,所有该目录下创建的文件,都按照属组的身份来

  • 场景:假设系统中有两个账号,分别是user1user2,这两个人除了自己群组之外还共同支持一个名为project的组。假设这两个用户需要共同拥有/data/code目录的开发权,互相之间能修改彼此的文件,且该目录不允许其他人进入查阅,请问该目录的权限设定应为何?

    1. 创建组,以及用户

      [root@oldboyedu ~]# groupadd project
      [root@oldboyedu ~]# useradd user1 -G project
      [root@oldboyedu ~]# useradd user2 -G project
      
    2. 创建项目目录,分配权限。禁止其他人访问该目录,同时还要保证user1,user2能正常读写执行

      [root@oldboyedu ~]# chown .project /data/code/
      [root@oldboyedu ~]# chmod 770 /data/code/
      [root@oldboyedu ~]# ll -d /data/code/
      drwxrwx--- 2 root project 6 Mar 17 10:47 /data/code/
      
    3. 给目录增加sgid

      [root@oldboyedu ~]# chmod 2770 /data/code/
      [root@oldboyedu ~]# ll -d /data/code/
      drwxrws--- 2 root project 24 Mar 17 10:52 /data/code/
      
    4. user1创建文件,测试user2能否正常修改,并且属组没有变化

      [user1@oldboyedu code]$ touch user1_file
      [user1@oldboyedu code]$ ll
      total 0
      -rw-rw-r-- 1 user1 project 0 Mar 17 10:54 user1_file
      [user2@oldboyedu code]$ echo "aaa" > user1_file 
      [user2@oldboyedu code]$ cat user1_file 
      aaa
      [user2@oldboyedu code]$ ll -d user1_file 
      -rw-rw-r-- 1 user1 project 4 Mar 17 10:56 user1_file
      

setbit(1):

  • Sticky粘滞位目前只对目录有效,作用如下:目录一旦被赋予了粘滞位,除了root 可以删除所有文件,普通用户对该目录就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。
  • 增加权限:chmod 1xxx或者chmod o+s
  • 取消权限:chmod 0xxx或者chmod o-s

特殊属性:加特殊属性chattr,查看特殊属性lsattr

  • 作用:
    • 加特殊属性后,它不允许被修改、移动、删除、包括root都不行。适合/etc/passwd文件
    • 加特殊属性后,只希望往文件里面追加数据,不允许修改、移动、删除。适合sudo审计日志
  • 命令格式:chattr [±=] [选项] 文件或目录名
    • =是设置为指定的属性,而忽略原有的属性设置,±为在原有参数的基础上,操作
    • a:可对文件进行追加内容
    • i:锁定文件,不允许其他操作

umask:

  • 定义:umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”。

    • 一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中设置umask值。
  • 例子:

    如果用户的UID大于199 并且 用户名称与组的名称一致,则执行then后面的代码;
    	设定umask为002
    如果不满足条件,则执行else后面的代码;
    	设定umask为022
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    	umask 002
    else
    	umask 022
    fi
    为什么有些目录初始为755 就是777-022=755		
    

重定向与管道

**重定向:**将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中

名称文件描述符
标准输入(STDIN)0
标准输出(STDOUT)1(可省略不写)
错误输出(STDERR)2
文件名称(filename)3+
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# tail -f /var/log/messages
Apr 25 12:30:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Started Session 25885 of user root.
Apr 25 12:30:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Removed slice User Slice of root.
Apr 25 12:40:01 iZ2zeco2fmiqbbuzq773qyZ systemd: Created slice User Slice of root.

如图:
文件描述符0重定向到/dev/pts/1,也就是指令信息输入到屏幕
文件描述符1重定向到/dev/pts/1,也就是正确信息输出到屏幕
文件描述符2重定向到/dev/pts/1,也就是错误信息输出到屏幕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuEL66OO-1690465877809)(shell.assets/image-20230425124910396.png)]

类型操作符用途
标准覆盖输出重定向>将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容标准追加输出重定向
标准追加输出重定向>>将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件
错误覆盖输出重定向2>将程序输出的错误结果输出到执行的文件中,会覆盖文件原有的内容错误追加输出重定向
错误追加输出重定向2>>将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件
标准输入重定向<<将命令中接收输入的途径由默认的键盘更改为指定的文件或命令

案例1:正确输出到文件,错误输出到屏幕

[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >ok.txt #因为1可以省略,所以正确内容重定向到ok.txt中,错误的输出屏幕所以不用管
find: ‘/etc/ntp/crypto’: Permission denied
find: ‘/etc/audisp’: Permission denied
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ cat ok.txt
/etc
/etc/magic

案例2:正确错误都输出到一个文件中

[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc &>ok1.txt 

[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >>ok2.txt 2>&1 #另一种输出到一个文件中的写法
														  # /etc >> ok2.txt 先把正确的输入到ok2中
														  # 2>&1 在让标准错误(文件描述符2)的输出流与标准输出(文件描述符1)的输出流合并,这样,它们的输出内容都会被发送到同一个地方,例如文件或终端
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc >ok3.txt 2>&1 #用>符号也行,因为2>&1都是合并输出流
[qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ vimdiff ok1.txt ok2.txt #可以看到两个一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2x6oif9-1690465877810)(shell.assets/image-20230425132106500.png)]

案例3:输出到/dev/null。/dev/null是一个特殊的设备文件,它相当于一个黑洞,任何写入它的数据都会被丢弃。因此,&>/dev/null不会占用额外的空间。

管道:输出变成下一个输入,但是只能把标准输出,输入到下一个进程中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDtD3WvE-1690465877810)(shell.assets/image-20230425134022181.png)]

  • 管道中tee:在输出屏幕的同时可以把内容存入到文件中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LNTyj1VI-1690465877811)(shell.assets/image-20230425135240261.png)]

  • xargs:把前面内容变成我这条命令的参数

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQPqfSe1-1690465877811)(shell.assets/image-20230425135937883.png)]

    • xargs -nx:分组,每行x个

find与压缩

find 搜索路径 [选项] 搜索内容

  • 按照文件类型搜索

    [qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -type f
    /etc/magic
    /etc/chrony.keys
    /etc/rwtab
    	-type d:查找目录
        -type f:查找普通文件
        -type l:查找软链接文件
    
  • 按照文件名搜索

    [qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -name "if*"
    /etc/sysconfig/network-scripts/ifdown-Team
    /etc/sysconfig/network-scripts/ifdown-ippp
    	-name: 按照文件名搜索;
        -iname: 按照文件名搜索,不区分文件名大小
        -inum: 按照 inode 号搜索
    
  • 按照文件大小搜索

    • -size[±]大小:按照指定大小搜索文件
      • "+"的意思是搜索比指定大小还要大的文件
      • “-” 的意思是搜索比指定大小还要小的文件
    [qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -size +5M #有单位k、M、G
    /etc/udev/hwdb.bin
    
  • 按照修改时间搜索

    • -5:代表5天内修改的文件
    • 5:代表前5~6天那一天修改的文件
    • +5:代表6天前修改的文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIdh94uk-1690465877811)(shell.assets/2-1P930143J9411.jpg)]

    [qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /etc -atime -3
    /etc
    /etc/magic
    /etc/ppp
    	-atime [+-]时间: 按照文件访问时间搜索
        -mtime [+-]时间: 按照文件内容修改时间搜索
        -ctime [+-]时间: 按照文件修改时间搜索
        mtime:当文件内容更改时,mtime才会更新
    	ctime:更改文件任何属性,其都会更新
        time 也可以按照 amin、mmin 和 cmin 来査找文件的时间
    
  • 按照所有者和所属组搜索

    [qq@iZ2zeco2fmiqbbuzq773qyZ ~]$ find /home/qq/ -user qq
    /home/qq/
    /home/qq/.viminfo
    /home/qq/ok2.txt
    	-uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件
        -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件
        -user 用户名:按照用户名査找所有者是指定用户的文件
        -group 组名:按照组名査找所属组是指定用户组的文件
        -nouser:査找没有所有者的文件
    
  • 按照权限搜索

    -perm 权限模式:査找文件权限刚好等于"权限模式"的文件
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find / -perm 444 #直接找相同的权限
    /usr/share/man/man1/cancel-cups.1.gz
    /usr/share/man/man1/lprm-cups.1.gz
    /usr/share/man/man1/lpoptions.1.gz
    
    -perm -权限模式:査找文件权限全部包含"权限模式"的文件
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find . -perm -200 #搜索文件的权限包含200(-w-------)
    ./test4 #此文件权限为200(-w-------)
    ./test3 #此文件权限为600(-rw-------)
    ./testl #此文件权限为755(-rwxr-xr-x) 
    这几个文件都包含 200(--w-------) 权限,所以可以找到,而 test2 的权限是 444 (-r--r--r--),不包含 200 (--w-------)权限,所以找不到
    
    -perm +权限模式:査找文件权限包含"权限模式"的任意一个权限的文件
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# find . -perm +444 #搜索文件的权限部分满足444(-r--r--r--)
    ./test2 #此文件权限为444(-r--r--r--)
    ./test3 #此文件权限为600(-rw-------)
    ./test1 #此文件权限为755(-rwxr-xr-x)
    200(--w-------)没有(-r--r--r--)所以不满足
    
  • 逻辑运算符

    • -a:and逻辑与
    • -o:or逻辑或
    • -not:not逻辑非
  • 执行动作

    动作含义
    -print打印查找到的内容(默认)
    -Is以长格式显示的方式打印查找到的内容
    -delete删除查找到的文件(仅能删除空目录)
    -ok后面跟自定义shell命令(会提示是否操作,写法同-еxес)
    -еxес后面跟自定义 shell命令(标准写法 -exec 命令x {}\;)
    • “-exec"选项的作用是把 find 命令的结果放入”{}"中,再由命令x 直接处理。

压缩

  • gzip
打包:
[root@oldboyedu ~]# gzip /etc/yum.repos.d/* #给所有文件进行后缀压缩,变相注释了所有文件
查看: 
[root@oldboyedu ~]# zcat /etc/yum.repos.d/CentOS-Base.repo.gz
解压:
[root@oldboyedu ~]# gzip -d /etc/yum.repos.d/*
  • bzip2

    [root@oldboyedu ~]# bzip2  /etc/yum.repos.d/*
    [root@oldboyedu ~]# bzcat /etc/yum.repos.d/CentOS-Base.repo.bz2
    [root@oldboyedu ~]# bzip2 -d /etc/yum.repos.d/*
    
  • zip/unzip

    zip 格式:
        选项:
        -r: 递归打包;
        -T: 测试压缩包是否正常;
        -sf: 查看包内容
        [root@oldboyedu ~]# zip -r /opt/test.zip /etc /root /tmp /etc/hostname
    
    unzip:
        -d: 解压到指定的目录下;
        -l: 查看压缩包内容;
        -t: 测试文件的内容;
        [root@oldboyedu ~]# unzip /opt/root.zip -d /tmp/
    
  • tar

    tar
        -c:建立压缩档案
        -x:解压
        -t:查看内容
        -r:向压缩归档文件末尾追加文件
        -u:更新原压缩包中的文件
    
        -z:有gzip属性的
        -j:有bz2属性的
        -Z:有compress属性的
        -v:显示所有过程
        -O:将文件解开到标准输出
        
        -f: 使用档案名字
    
    • 打包

      [root@oldboyedu ~]# tar -czf /opt/qq.tar.gz /root/ /tmp/   #打一个tar.gz格式的压缩包
      [root@oldboyedu ~]# tar -cjf /opt/qq.tar.bz2 /root/ /tmp/  #打一个tar.bz2格式的压缩包
      [root@oldboyedu ~]# tar -cJf /opt/qq.tar.xz /root/ /tmp/   #打一个tar.xz格式的压缩包 	
      
    • 解压

      tar –xvf file.tar  #解压 tar包
      tar -xzvf file.tar.gz #解压tar.gz
      tar -xjvf file.tar.bz2   #解压 tar.bz2
      tar –xZvf file.tar.Z   #解压tar.Z
      
    • 排除文件:–exclude=

      [root@oldboyedu ~]# tar -czf etc.tar.gz /etc/ --exclude=etc/passwd --exclude=etc/shadow
      
      • 排除多个文件:X指定从哪个文件中读取要排除的文件名称

        打包/etc目录为etc.tar.gz,但是在打包之前:
        1.读取pc.list文件;
        2.获取排除的文件名称;
        3.筛选掉需要排除的文件;
        4.执行打包操作;
        [root@oldboyedu ~]# tar -czfX  etc_new.tar.gz  pc.list /etc/
        

RPM软件包管理

Linux常见软件包

系统平台包类型工具自动解决依赖
RedHat/CentosRPMrpmyum
Ubuntu/Debiandebdpkgapt

安装软件常见方法

分类安装版本
rpm包预先编译打包,安装简单软件版本偏低
源码包手动编译打包,安装繁琐软件版本随意
二进制包解压即可使用,安装简单不能修改源码
yum安装软件最常用方法

RPM软件包命名规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSO0NT8Z-1690465877812)(shell.assets/image-20230506203305582.png)]

查看系统版本
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -r
3.10.0-957.21.3.el7.x86_64
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -a
Linux iZ2zeco2fmiqbbuzq773qyZ 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# uname -m
x86_64
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# hostnamectl 
   Static hostname: iZ2zeco2fmiqbbuzq773qyZ
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 20190711105006363114529432776998
           Boot ID: 7d3cfb8c45384bfb9585bcc5bbde8743
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.21.3.el7.x86_64
      Architecture: x86-64
  • RPM安装

    -i: 安装
    -v: 详细信息
    -h: 安装进度
    --test: 测试是否能够安装成功
    --force: 强制重新安装
    --nodeps: 忽略依赖关系
    
  • RPM查询

    rpm -q  #查看指定软件包是否安装
    rpm -qa #√查看系统中已安装的所有RPM软件包列表
    rpm -qi #查看指定软件的详细信息
    rpm -ql #√查询指定软件包所安装的目录、文件列表 查询已安装软件信息
    rpm -qc #查询指定软件包的配置文件
    rpm -qd #查询指定软件包的帮助文档 man手册
    rpm -qf #查询文件或目录属于哪个RPM软件
    rpm -q --scripts #查询rpm包安装前和安装后执行的脚本
    rpm -qip #查询未安装的rpm包详细信息
    rpm -qlp #查询未安装的软件包会产生哪些文件
    
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# rpm -qa | grep tree #通过grep查询需要包关键字
    tree-1.6.0-10.el7.x86_64
    
  • RPM升级

    rpm -Uvh #如果老版本不存在,就全新安装,如果存在有新版即升级
    
  • RPM卸载

    -e 删除指定的软件包
    注意:卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。
    #先查询,在删除
    
  • RPM检验

    rpm -V #验证与软件刚刚安装的时候(命令,配置)对比
    
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# >/usr/bin/tree 
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# rpm -V tree
    S.5....T.    /usr/bin/tree
    
    S //文件的容量大小是否被改变
    M //文件的类型或者文件的属性是否被修改
    5 //MD5这一种指纹加密的内容已经不同 文件内容变化
    D //装置的主/次代码已经改变
    L //路径已经被改变
    U //文件的所属主已被修改
    G //文件的所属组已被修改
    T //文件的修改时间已被改变
    

YUM

yum源配置基础

#base源:基础源
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/yum.repos.d/CentOS-Base.repo 
[base]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.cloud.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-7

#epel源:额外的软件
修改/etc/yum.repos.d/epel.repo
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/yum.repos.d/epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
enabled=1
failovermethod=priority
baseurl=http://mirrors.cloud.aliyuncs.com/epel/7/$basearch
gpgcheck=0
gpgkey=http://mirrors.cloud.aliyuncs.com/epel/RPM-GPG-KEY-EPEL-7[root@iZ2zeco2fmiqbbuzq773qyZ

#[BaseOS]
yum的ID,必须唯一,本地有多个yum源的时候,这里必须是唯一的
#name=CentOS-$releasever
具体的yum源名字,其实相当于对它的描述描述信息 $releasever你可以使用这个变量参考红帽企业Linux发行版,也就是说表示当前发行版的大版本号。
#baseurl:镜像服务器地址
只能写具体的确定地址。下面的例子中,只能有一个baseurl,但里面可以包含多个url
#mirrorlist:镜像服务器的地址列表
里面有很多的服务器地址。这里有一个变量$arch,cpu体系,还有一个变量:$basearch,cpu的基本体系组
#baseurl和mirrorlist - 指向yum源的地址
不同点是包含地址的多少。你若自己写的话,我们一般只写一个地址,直接用baseurl就行
#gpgcheck=0
要不要验证呢,取消验证。1,使用公钥检验rpm的正确性。
gpgcheck若是1将对下载的rpm将进行gpg的校验,校验密钥就是gpgkey,一般自己的yum源是不需要检测的。gpgcheck=0,那么gpgkey就可以不填写
#enabled=0
当某个软件仓库被配置成 enabled=0 时,yum 在安装或升级软件包时不会将该仓库做为软件包提供源。

配置其他服务源:

  1. 书写配置文件
  2. 下载安装对应的源的软件包,例如:xxx-release.rpm(包含repo文件),安装后就有对应repo文件了
  3. yum下载软件时会自动从所有可用的源中选择最快的一个下载。如果您想要指定从某个特定的源下载软件,可以使用yum命令的–enablerepo选项。例如,如果您想要从nginx源下载软件,可以使用以下命令:yum --enablerepo=nginx install nginx。

yum源命令使用

##########查找##############3
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# yum provides ifconfig
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base/7/x86_64/filelists_db                                                              | 7.2 MB  00:00:00     
epel/x86_64/filelists_db                                                                |  12 MB  00:00:00     
extras/7/x86_64/filelists_db                                                            | 276 kB  00:00:00     
updates/7/x86_64/filelists_db                                                           |  11 MB  00:00:00     
net-tools-2.0-0.24.20131004git.el7.x86_64 : Basic networking tools
Repo        : @base
Matched from:
Filename    : /usr/sbin/ifconfig
#yum search all ifconfig 
查找更详细
#yum list | grep 包名称

############安装##############
#yum localinstall /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm
localinstall 安装本地的rpm包并通过yum源解决rpm依赖问题
#yum install http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbixrelease-3.4-2.el7.noarch.rpm
直接安装清华源的rpm包
#yum reinstall xxx
重新安装

############更新##################
#yum check-update
检查更新
#yum update acl -y
更新软件

##############删除##################
#yum [erase or remove] xxx -y
删除软件及依赖,尽量使用rpm -e删除软件不删除依赖

##########仓库命令################
# yum repolist [all]
yum源列表 [列出yum源可用的软件仓库]

###########缓存################
# yum makecache
生成yum缓存,在yum.conf对应yum源中生成xml文件
#yum clean all 
清空本地yum缓存,更换了yum源一般需要清空缓存,让系统重新生yum缓存
# yum clean packages
只清除缓存的软件包
#修改/etc/yum.conf配置文件保留缓存,默认删除
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# head -3 /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1 #1为保留

#######组########
#yum groups list
#yum groups install

###########历史##########
#查看历史执行yum命令
[root@oldboyedu ~]# yum history
#查询历史执行yum命令ID详细信息
[root@oldboyedu ~]# yum history info N(N为history的id号)
#撤销历史执行过的yum命令
[root@oldboyedu ~]# yum history undo N


###########yum.conf###########
cachedir=/var/cache/yum/$basearch/$releasever #缓存目录 *****
keepcache=0 #缓存软件包, 1启动 0 关闭 *****
debuglevel=2 #调试级别 debug调试 一般用于排错
logfile=/var/log/yum.log #日志记录位置 *****
exactarch=1 #检查平台是否兼容
obsoletes=1 #检查包是否废弃
gpgcheck=1 #检查来源是否合法,需要有制作者的公钥信息 ***
plugins=1 #是否开启yum额外的插件
installonly_limit=5
bugtracker_url
# metadata_expire=90m //每小时手动检查元数据
# in /etc/yum.repos.d //包含repos.d目录

yum密钥认证机制

yum源中gpgkey是公钥位置

#yum install httpd --nogpgcheck
不检查公钥

配置自己的yum仓库

服务端:自己的yum仓库,每一个客户端只能上内网,所以只能局域网yum安装

客户端:配置服务端的yum

###############服务端##################
#########第一步 关闭防火墙#############
#1.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#2.关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

#########第二部 基础准备#############
#1.安装ftp服务,启动并加入开机启动
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd
#2.配置 base和epel源
#3.开启yum缓存功能
keepcache=1
#4.yum clean all

########第三步 准备rpm包##############
#1.光盘挂载
mkdir /var/ftp/{centos610,centos79} #客户段下载rpm包在这
mount /dev/cdrom /mnt
cp -rp /mnt/Packages/*.rpm /var/ftp/centos79
#2.第三方rpm包
先安装到服务器上,再把`/var/cache/yum/x86_64/7/`的rpm包复制到`/var/ftp/第三方/`#3.构建元文件,注意: 如果此仓库每次新增软件则需要重新生成一次
安装yum -y install createrepo,使用这个软件创建元文件
[root@iZ2zeco2fmiqbbuzq773qyZ ~]createrepo /var/ftp/ops
[root@iZ2zeco2fmiqbbuzq773qyZ ~]createrepo /var/ftp/centos79
`缓存作用,加快客户端安装过程`:客户端连接时会查看repodata目录的xml文件,加速过程。
###############客户端##################
[root@yum_client ~]# vim /etc/yum.repos.d/centos7.repo
[centos79]
name=centos79_base
baseurl=ftp://10.0.0.100/centos79
gpgcheck=0
[root@yum_client ~]# vim /etc/yum.repos.d/第三方.repo
[opt]
name=local ftpserver
baseurl=ftp://10.0.0.100/第三方  #FTP服务器上的默认目录,通常是/var/ftp或者/srv/ftp。
gpgcheck=0

客户端流程:
	1.将连接到FTP服务器上的repodata目录以获取软件包和其依赖项的信息,
	2.使用createrepo生成的元数据确定软件包的依赖关系和版本信息,
	3.下载并安装这些软件包及其依赖项。

源码编译安装

编译环境:gcc、make
依赖环境:pcre、openssl

yum install -y pcre-devel openssl-devel

三部曲:

  • 第一步:./configure(定制组件 配置)
    • 指定安装路径,编译安装默认路径 /usr/local/ ,例如 --prefix=/app/web/nginx-1.18.0
    • 启用或禁用某项功能, 例如 --enable-ssl
    • 和其它软件关联,例如–with-pcre
    • 检查安装环境,例如是否有编译器 gcc,是否满足软件的依赖需求
    • 检测通过后生成Makefile文件
  • 第二步:make(源代码编译—>二进制命令)
    • 执行make命令进行编辑, 可以使用-j指定CPU编译
    • -J 并发执行编译安装
    • -j 以cpu核心总数一致
    • 按Makefile文件进行编译, 编译成可执行二进制文件
    • 生成各类模块和主程序
  • 第三步:make install(安装)
    • 按Makefile定义好的路径拷贝至安装目录中

磁盘管理

raid

RAID0

  • 将多块磁盘组合在一起形成一个大容量的存储。当我们要写数据的时候,会将数据分为N份,以独立的方式实现N块磁盘的读写,那么这N份数据会同时并发的写到磁盘中,因此执行性能非常的高。
  • RAID0 的读写性能理论上是单块磁盘的N倍(仅限理论,因为实际中磁盘的寻址时间也是性能占用的大头)
  • 但RAID0的问题是,它并不提供数据校验或冗余备份,因此一旦某块磁盘损坏了,数据就直接丢失,无法恢复了。因此RAID0就不可能用于高要求的业务中,但可以用在对可靠性要求不高,对读写性能要求高的场景中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wK60weeS-1690465877813)(shell.assets/image-20230522192605197.png)]

RAID1

  • RAID1 是磁盘阵列中单位成本最高的一种方式。因为它的原理是在往磁盘写数据的时候,将同一份数据无差别的写两份到磁盘,分别写到工作磁盘和镜像磁盘,那么它的实际空间使用率只有50%了,两块磁盘当做一块用,这是一种比较昂贵的方案。
  • RAID1其实与RAID0效果刚好相反。RAID1 这种写双份的做法,就给数据做了一个冗余备份。这样的话,任何一块磁盘损坏了,都可以再基于另外一块磁盘去恢复数据,数据的可靠性非常强,但性能就没那么好了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1zSxbKE-1690465877813)(shell.assets/image-20230522192818102.png)]

RAID5

  • 把校验码信息PARITY分布到各个磁盘上。例如,总共有N块磁盘,那么会将要写入的数据分成N份,并发的写入到N块磁盘中,同时还将数据的校验码信息也写入到这N块磁盘中(数据与对应的校验码信息必须得分开存储在不同的磁盘上)。一旦某一块磁盘损坏了,就可以用剩下的数据和对应的奇偶校验码信息去恢复损坏的数据。
  • 最少需要三块磁盘来组建磁盘阵列,允许最多同时坏一块磁盘。如果有两块磁盘同时损坏了,那数据就无法恢复了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPxsxtKT-1690465877814)(shell.assets/image-20230522192840604.png)]

RAID10

  • RAID10兼备了RAID1和RAID0的有优点。首先基于RAID1模式将磁盘分为2份,当要写入数据的时候,将所有的数据在两份磁盘上同时写入,相当于写了双份数据,起到了数据保障的作用。且在每一份磁盘上又会基于RAID0技术讲数据分为N份并发的读写,这样也保障了数据的效率。
  • 但也可以看出RAID10模式是有一半的磁盘空间用于存储冗余数据的,浪费的很严重,因此用的也不是很多。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kwevAebu-1690465877814)(shell.assets/image-20230522192853661.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tHb62N4l-1690465877814)(shell.assets/image-20230522193548924.png)]

磁盘分区表mbr与gpt

**mbr分区表:**主引导记录,还可以叫做主引导扇区。它的运行机制存在于硬件的基础之上,它存储在硬盘的第一个扇区上。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJoTiJMX-1690465877815)(shell.assets/image-20230525220136831.png)]

  • 主分区:数量至少1个,最多4个(如果存在扩展分区,则最多3个)。主分区可以直接使用,主分区本身不能继续分区,一个主分区就是一个逻辑磁盘。
  • 扩展分区: 为了突破这最多四个主分区的限制,Linux系统引入了扩展分区。0个或1个,会占用一个主分区号,不能直接使用,必须在其上建立逻辑分区后才能用。 其实就是把1个主分区拿过来进行分区扩展了。
  • 逻辑分区:扩展分区的容量是所有逻辑分区容量之和。
gptmbr
主分区数量不限主分区最多4个,扩展分区1个
可以额外支持大容量硬盘2tb以上只能支持2tb以内硬盘

查询磁盘信息

使用率:

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -h  #以G或者T或者M人性化方式显示
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        50G  2.8G   45G   6% /
devtmpfs        858M     0  858M   0% /dev
tmpfs           868M     0  868M   0% /dev/shm
tmpfs           868M  444K  867M   1% /run
tmpfs           868M     0  868M   0% /sys/fs/cgroup
tmpfs           174M     0  174M   0% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -T  #查看磁盘分区类型 (文件系统类型)
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
/dev/vda1      ext4      51473368 2832124  46318144   6% /
devtmpfs       devtmpfs    877748       0    877748   0% /dev
tmpfs          tmpfs       888200       0    888200   0% /dev/shm
tmpfs          tmpfs       888200     444    887756   1% /run
tmpfs          tmpfs       888200       0    888200   0% /sys/fs/cgroup
tmpfs          tmpfs       177644       0    177644   0% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# df -i  #查看inode使用情况
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/vda1      3276800 60154 3216646    2% /
devtmpfs        219437   334  219103    1% /dev
tmpfs           222050     2  222048    1% /dev/shm
tmpfs           222050   386  221664    1% /run
tmpfs           222050    16  222034    1% /sys/fs/cgroup
tmpfs           222050     1  222049    1% /run/user/0
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# du -sh ./*   #默认显示目录,*就显示文件
4.0K    ./1.REP
4.0K    ./Centos-7.repo
4.0K    ./ip1.txt
4.0K    ./ip.txt
108K    ./ok.txt
4.0K    ./sort.txt
4.0K    ./test
	-s: summary 总结 ,汇总 列出总和
	-h:人性化显示容量信息 
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    253:0    0  50G  0 disk 
└─vda1 253:1    0  50G  0 part /
    -NAME : 这是块设备名。
    -MAJ:MIN : 本栏显示主要和次要设备号。
    -RM : 本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
    -SIZE : 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
    -RO : 该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
    -TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
    -MOUNTPOINT : 本栏指出设备挂载的挂载点。

当前读写速度:

Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                         
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switche~ --deserialize 22
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iotop -o #只显示读写进程

dd if=/dev/zero of=/tmp/big bs=1k count=10000000 #测试命令

磁盘分区,格式化,挂载

磁盘分区:

磁盘分区命令
fdisk支持mbr分区格式,2tb以内磁盘
parted支持mbr,gpt
gdiskfdisk升级版,gpt disk (仅支持gpt格式)
  • fdisk磁盘分区
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# fdisk -l #查看磁盘分区信息

Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000b2d99

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048   104856254    52427103+  83  Linux


#fdisk 分区实战
[root@oldboyedu ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
###你当前的修改都保存在内存中,直到你决定保存他们.
Changes will remain in memory only, until you decide to
write them.
Be careful before using the write command.
###在保存之前,小心点!!!
###磁盘当前没有磁盘分区表.
###给你创建了一个mbr(DOS)分区表
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier
0xc1a99fe8.
Command (m for help):
    p print 显示分区信息
    n new 创建磁盘分区 partition(分区)
    d delete 删除磁盘分区
    q 退出不保存
    w 保存并退出
##查看当前磁盘信息
Command (m for help): p
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc2483040
	Device 	Boot 	Start 	End 	Blocks 	   Id 	  System
##创建一个磁盘分区 100MB
Command (m for help): n
Partition type:
    p primary 主分区 (0 primary, 0 extended, 4 free)
    e extended 扩展分区
Select (default p): #使用默认或者输入p
Using default response p
Partition number (1-4, default 1): #使用默认
First sector (2048-2097151, default 2048): #使用默认
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151,default 2097151): +100M
Partition 1 of type Linux and of size 100 MiB is set
#显示创建结果
Command (m for help): p 
Disk /dev/sdb: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xc2483040
    Device Boot 	Start 	End 	Blocks 		Id 		System
    /dev/sdb1   	2048 	206847 	102400 		83 		Linux
#保存退出
Command (m for help): w 
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@oldboyedu ~]# lsblk #检查结果
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
    ├─sda1 8:1 0 1G 0 part /boot
    └─sda2 8:2 0 39G 0 part
        ├─centos-root 253:0 0 37G 0 lvm /
        └─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
    └─sdb1 8:17 0 100M 0 part #创建了/dev/sdb1
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 3T 0 disk
sr0 11:0 1 4.5G 0 rom

#primary 主分区 p
#extended 扩展分区 e
#logical 逻辑分区 l

sda 和 sdb 都是硬盘设备,而他们下面的是分区sda1,sdb1等等
  • parted磁盘分区
-p 			#print 显示磁盘分区信息
-mktable    #创建 磁盘分区表 gpt/msdos
-mkpart 	#创建磁盘分区 mkpart pri 0 100
-rm 		#删除磁盘分区
-q 		    #quit 退出

[root@oldboyedu ~]# parted /dev/sdc
GNU Parted 3.1
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of
commands.
#查看磁盘分区信息
(parted) p
Error: /dev/sdc: unrecognised disk label #磁盘目前没有分区
表 没有分区信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
#创建磁盘分区表gpt
mktable gpt
#创建磁盘分区
mkpart primary 100 200

**格式化:**创建文件系统make file system mkfs

#格式化
mkf.xfs /dev/sdb1

挂载:

mount 设备 	   入口
mount /dev/sdb1 /mnt

#永久挂载
#方法1 /etc/rc.local专门用来开机启动各种服务,命令,挂载....
/etc/rc.d/rc.local 用于添加开机启动命令
/etc/rc.local是/etc/rc.d/rc.local的软连接
[root@oldboyedu ~]# chmod +x /etc/rc.d/rc.local
[root@oldboyedu ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 Apr 1 2020 /etc/rc.d/rc.local
[root@oldboyedu ~]# vim /etc/rc.local #写入mount /dev/sdb1 /mnt
mount /dev/sdb1 /mnt
#方法2 /etc/fstab 挂载专用文件 (开机自动挂载)
##fstab格式说明
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Jul 11 02:52:01 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1114fe9e-2309-4580-b183-d778e6d97397 /               ext4        defaults        1       1
第1列 									第2列 			第3列 	    第4列 		第5列    第6列
设备名称:/dev/sdb1 或UUID 				  挂载点 		   文件系统类型  挂载选项(默认选项) 是否备份 是否开机检查
UUID一词通常是指通用唯一标识符
PARTUUID”是指存储在分区表中或从分区表派生的分区的唯一标识符
PARTUUIDs是GUID分区表(GPT)的组成部分,它替代了与主引导记录(MBR)相关的磁盘分区
UUID就类似MBR中分区1,分区2,独有的
PARTUUID是GPT中每个分区的名字,因为GPT可以有多个分区
blkid #查询设备 uuid

磁盘故障案例

磁盘空间不足

  • block满了一

    • 原因: 磁盘有大量的文件占用空间,导致空间不足

      #模拟:
      dd if=/dev/zero of=/var/log/anaconda/big bs=1M count=2000
      #排查:
      df -h
      du -sh /* |sort -hr
      du -sh /var/* |sort -hr
      du -sh /var/log/* |sort -hr
      最终确定到文件或目录
      确认后在rm删除
      
  • block满了二

    • 原因: 删除大文件时,大文件有其他使用者访问(进程未清除,或者硬链接还有)

      彻底删除一个文件需要:
      1.硬链接数为0
      	通过rm删除
      2.进程调用数为0 找出使用文件的进程/服务,关闭/重启
      	[root@oldboyedu small]# lsof |grep error.log
          tail 3160 root 3r REG 253,0 24444444490 45142267 /var/log/error.log(deleted) #error.log被tail占用,关闭tail命令
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foDNvpSQ-1690465877815)(E:\运维学习\shell.assets\image-20230529221131450.png)]

  • inode满了

    • 原因: 磁盘上面有大量小文件,占用了大量的inode,最终磁盘空间不足

      #模拟:
      echo {1..500000}|xargs touch
      touch a{1..100000}
      touch b{1..100000}
      touch c{1..100000}
      touch d{1..100000}
      #排查:
      #找出系统中占地面积比较大的目录
      find / -type d -size +1M |xargs ls -lhd
      #删除时,由于文件过多会报错误
      -bash: /usr/bin/rm: Argument list too long
      #解决:
      1.记录好目录权限,所有者,再删除目录
      2.ls/find + |xargs rm 删除
      3.ls/find 1* |xargs rm 删除 #分批次删除
      

内存不足占用

  • swap交换分区:内存不足的时候临时充当内存

    • 增加swap方法:

      1. 通过创建文件增加swap

        #1 检查与创建文件
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h
                      total        used        free      shared  buff/cache   available
        Mem:           1.7G        147M        141M        444K        1.4G        1.4G
        Swap:            0B          0B          0B
        
        #2 创建文件转换为swap
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=10 #创建文件
        10+0 records in
        10+0 records out
        10485760 bytes (10 MB) copied, 0.0173309 s, 605 MB/s
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# file /tmp/swap #查看类型
        /tmp/swap: data
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# mkswap /tmp/swap #转换为swap
        Setting up swapspace version 1, size = 10236 KiB
        no label, UUID=bc1a17a4-3e84-488e-84d4-2511bf135cd8
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# file /tmp/swap #再次查看类型
        /tmp/swap: Linux/i386 swap file (new style), version 1 (4K pages), size 2559 pages, no label, UUID=bc1a17a4-3e84-488e-84d4-2511bf135cd8
        #3 激活on空间/关闭off空间
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapon /tmp/swap
        swapon: /tmp/swap: insecure permissions 0644, 0600 suggested.
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h
                      total        used        free      shared  buff/cache   available
        Mem:           1.7G        149M        128M        444K        1.4G        1.4G
        Swap:            9M          0B          9M
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapoff /tmp/swap
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# free -h
                      total        used        free      shared  buff/cache   available
        Mem:           1.7G        149M        128M        444K        1.4G        1.4G
        Swap:            0B          0B          0B
        #4 查看swap组成
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# swapon -s
        Filename                                Type            Size    Used    Priority
        /tmp/swap                               file    10236   0       -2                 #file就是文件
        
      2. 磁盘分区作为swap

        #通过磁盘增加swap
        1)创建磁盘分区
        2)转换为swap mkswap /tmp/swap
        3)激活 	   swapon /tmp/swap
        
    • 永久增加swap方法:

      1. swapon /tmp/swap 放入/etc/rc.local。同永久挂载

      2. 写入到 /etc/fstab

        [root@oldboyedu ~]# tail -1 /etc/fstab
        /dev/sdd1 swap swap defaults 0 0
        

buffer和cache

buffer:写缓冲区,目的是加速写入的速度
cache:读缓存区,目的是加速读取的速度

系统调试

救援模式

root密码忘记:

  1. 开机的时候,选择第1个,按e编辑

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHUYpwYs-1690465877816)(E:\运维学习\shell.assets\image-20230531121009720.png)]

  2. 然后找到linux16的行,在这一行的最后添加rw init=/bin/sh,按ctrl+x

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2H6LKDZ-1690465877816)(E:\运维学习\shell.assets\image-20230531121106893.png)]

  3. 重新设置root密码,重启系统

  • 故障:救援模式修改密码之后,无法进入系统,读条的时候卡住:selinux没关闭

    修改/etc/selinux/config文件中SELINUX=disabled
    

系统的启动流程

Linux7系统的开机启动过程如下:

  1. 开机自检(检查硬件)

  2. MBR/GPT引导系统启动

  3. GRUB菜单,多个内核选择哪个启动

  4. 加载内核选项

  5. 内核初始化使用systemd进程(启动的Linux系统的第1个进程 systemd)

  6. 读取运行级别(桌面模式,命令行模式)/etc/systemd/system/default.target

  7. 初始化系统(挂载,启动网络,主机名,…)/usr/lib/systemd/system/sysinit.target

  8. 根据运行级 别、并行启动服务(网络服务,ssh服务,定时任务服务…)

  9. 显示login界面(输入用户密码)/usr/lib/systemd/system/getty.target

    image-20230531211416684

开机关机命令:

关机重启其他
shutdown -h 10shutdown -r 10
shutdown -h now/0shutdown -r now/0
halt (关闭系统,手动断电)reboot
poweroff
init 0 #centos 6常用init 6 #centos 6常用
systemctl halt/poweroffsystemctl reboot

poweroff:关机同时关闭电源,会发送一个ACPI信号通知系统关机

half:关机但是不关闭电源,需要手动关闭电源

shutdown:关机同时关闭电源,只有拥有root权限的用户才可以执行

可用shutdown -c撤回shutdown -h/-r的开关机

系统运行级别

运行级别
centos6叫做runlevel
systemd目标名称作用
0poweroff.target关机
1rescue.target单用户模式级别。root 权限,用于系统维护(或修复系统,或重置系统密码信息),禁止远程登录
2multi-user.target多用户模式级别。该级别下没有NFS和网络的支持
3multi-user.target完整的多用户文本模式级别。登录后进入到控制台命令行模式
4multi-user.target预留级别。该级别系统未使用
5graphical.target图形化模式级别。登录后进入图形GUI模式
6reboot.target重启
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ll /usr/lib/systemd/system/runlevel*.target
lrwxrwxrwx 1 root root 15 Jul 11  2019 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root 13 Jul 11  2019 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx 1 root root 17 Jul 11  2019 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 11  2019 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 Jul 11  2019 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx 1 root root 16 Jul 11  2019 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx 1 root root 13 Jul 11  2019 /usr/lib/systemd/system/runlevel6.target -> reboot.target

修改系统运行级别:

#centos6系统
[root@student ~]# runlevel #查看运行级别
N 3 #如果N是其他数字,代表上一次运行级别
[root@student ~]# init 3 #切换运行级别
[root@student ~]# /etc/inittab #永久修改运行级别存放的配置文件

#centos7系统
[root@student ~]# systemctl get-default #查看系统默认启动运行级别
[root@student ~]# systemctl set-default TARGET.target #修改默认启动运行级别(永久生效)
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

系统的systemd

systemd相关配置文件:

/usr/lib/systemd/system/ #记录这一个就ok. 类似Centos6系统的启动脚本,/etc/init.d/

/etc/systemd/system/ #系统配置存放,了解#类似Centos6系统的/etc/rc.d/rcN.d/
/etc/systemd/system/multi-user.target.wants/* #系统配置存放,了解

systemd管理服务相关命令:

systemctl start crond.service		#启动服务,当前正在运行
systemctl stop crond.service		#停止服务
systemctl restart crond.service		#重启服务
systemctl reload crond.service		#重新加载配置(不终止服务,不影响正在处理的请求/用户)
systemctl status crond.servre		#查看服务运行状态
systemctl is-active sshd.service	#查看服务是否在运行中
systemctl mask crond.servre			#禁止服务运行
systemctl unmask crond.servre		#取消禁止服务运行
systemctl enable crond.service		#开机自动启动		
systemctl disable crond.service		#开机不要自动启动							
systemctl list-unit-files			#查看各个级别下服务的启动与禁用		
systemctl is-enabled crond.service	#查看特定服务是否为开机自启动		
systemctl daemon- reload			#创建新服务文件或者变更设置	

systemctl服务状态:

服务状态状态说明
loaded服务单元的配置文件已经被处理,配置放在了/usr/lib/systemd/system/
active(running)服务的一个或多个进程在运行中最常见的状态 start
active(exited)一次性运行的服务成功被执行并退出(服务运行后完成任务,相关进程会自动退出)
active(waiting)服务已经运行但在等待某个事件
inactive服务没有在运行 stop
enabled服务设定为开机运行
disabled服务设定为开机不运行
static服务会随着系统的启动而启动,并且会一直运行,直到系统关闭或服务被手动停止

systemctl的journalctl日志:

journalctl -xe 		#-e按页显示 -x进行一些翻译,指出一些故障提示,找error 或 err 或warn 或fail
journalctl -n 20 	#查看最后20行
journalctl -f 		#动态查看日志 ※※※
journalctl -p err 	#查看日志的级别
journalctl -u crond #查看某个服务的单元的日志

进程管理

进程正常处理流程:

  • 子进程在处理任务代码时,父进程会进入等待状态中…
  • 子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
  • 如果子进程在处理任务过程中异常退出,而父进程没有回收子进程的资源,会导致子进程虽然运行实体已经消失,但仍然在内核中的进程表中占据一条记录,长期下去对系统中资源是一个浪费。(僵尸进程)
  • 如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么子进程就没有父进程来管理了,由系统的system进程管理。(孤儿进程)
#每个进程都父进程的PPID,子进程则叫PID
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2022 ?        00:13:47 /usr/lib/systemd/systemd --switched-root --system --deserialize
root         2     0  0  2022 ?        00:00:01 [kthreadd]
root         3     2  0  2022 ?        00:03:09 [ksoftirqd/0]
root         5     2  0  2022 ?        00:00:00 [kworker/0:0H]
root         7     2  0  2022 ?        00:00:02 [migration/0]
root         8     2  0  2022 ?        00:00:00 [rcu_bh]
root         9     2  0  2022 ?        01:37:56 [rcu_sched]
root        10     2  0  2022 ?        00:00:00 [lru-add-drain]

ps指令

ps -ef #简洁格式
ps aux #完全格式,排错
ps auxf #显示进程的子进程

##自定义显示字段ps o
ps axo pid,%mem,stat,command #显示所有进程pid,内存使用率,进程状态,命令

##进程排序
ps aux --no-header |sort -rnk2 #第二列排序,并且不显示标题
ps aux --sort -vsz #ps自带排序指令--sort 加上对应格式,可以进行排序,-为逆序

##查看指定进程PID
#第一种过滤
ps -ef |grep sshd
ps aux |grep sshd
#第二种使用pgrep -a完全名称,-l简单名称
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pgrep -a sshd
1054 /usr/sbin/sshd -D
22043 sshd: root@pts/0    

##进程树pstree
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pstree
systemd─┬─AliSecGuard───6*[{AliSecGuard}]
        ├─AliYunDun───9*[{AliYunDun}]
        ├─AliYunDunMonito───25*[{AliYunDunMonito}]
        ├─AliYunDunUpdate───6*[{AliYunDunUpdate}]
        ├─2*[agetty]
        ├─aliyun-service───7*[{aliyun-service}]
        ├─assist_daemon───7*[{assist_daemon}]
        ├─atd
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─dhclient
        ├─firewalld───{firewalld}
        ├─frps───5*[{frps}]
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd─┬─bash───pstree
        │             └─sftp-server
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]

ps -aux解释:

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 125464  3936 ?        Ss    2022  13:47 /usr/lib/systemd/systemd --switched-root --sys
root         2  0.0  0.0      0     0 ?        S     2022   0:01 [kthreadd]
root         3  0.0  0.0      0     0 ?        S     2022   3:09 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<    2022   0:00 [kworker/0:0H]

01 USER 	#进程属于用户
02 PID 		#子进程id号 process id
03 %CPU 	#进程占用cpu使用率
04 %MEM 	#进程占用mem使用率 内存
05 VSZ 		#Virtual Size 进程占用虚拟内存大小 (kb) VSZ=swap+物理内存
06 RSS 		#进程占用物理内存大小(kb) RSS=物理内存
07 TTY 		#进程属于哪个终端,例如:pts/0 pts/1。?是内核进程,不需要终端
08 STAT 	#status 进程状态
09 START 	#进程启动时间
10 TIME 	#进程占用cpu的时间
11 COMMAND  #进程名/命令

STAT解释:

STAT基本状态描述STAT状态符号描述
R(running)进程运行s进程是控制进程,Ss进程为父进程
S可中断进程处于等待状态(可以随时停止)<进程运行在高优先级上,S<优先级较高的进程
T(terminate)进程被暂停(挂起)N进程运行在低优先级上,SN优先级较低的进程
D不可中断进程(IO)+当前进程运行在前台,R+该表示进程在前台运行
Z僵尸进程l(小写L)进程是多线程的,Sl表示进程是以线程方式运行

top指令

top - 16:22:02 up 192 days,  2:23,  1 user,  load average: 0.06, 0.07, 0.05
Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  1.0 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1776404 total,   163012 free,   154968 used,  1458424 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1417648 avail Mem 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                 
30674 root      10 -10  132720  16472  10648 S   3.3  0.9   4455:17 AliYunDunMonito                         
22043 root      20   0  157256   6124   4696 S   0.3  0.3   0:02.32 sshd                                     
30327 root      20   0  814652  11272   7720 S   0.3  0.6  86:45.38 aliyun-service                           30664 root      10 -10  101196   8768   6600 S   0.3  0.5 652:57.49 AliYunDun                               
    1 root      20   0  125464   3936   2612 S   0.0  0.2  13:48.69 systemd                                 
    2 root      20   0       0      0      0 S   0.0  0.0   0:01.40 kthreadd  
    
    -PR #了解 优先级,比NI大20
    -NI #常用,高优先级与否 负数高优先级 , 0 正常优先级 , 整数 低优先级
    -VIRT #virtual size VSZ/VIRT 占用的虚拟内存空间
    -RES #resdential RES/RSS 占用物理内存
    -SHR #share 共享内存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzIJTPhn-1690465877816)(E:\运维学习\shell.assets\image-20230605184233085.png)]

参数:

top
	-d 修改top命令刷新间隔 -d 1
	-p 只显示某个进程的信息 -p pid
	-H 显示进程的线程
	-u 显示指定用户进程
	-b 批量处理模式,top命令结果批量写入文件 一般配合-n
	-n 批处理模式,显示几次

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# top -d 1 -p 30674,1 #显示pid为30674和1的进程
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                 
30674 root      10 -10  132720  16472  10648 S   4.0  0.9   4456:13 AliYunDunMonito                         
    1 root      20   0  125464   3936   2612 S   0.0  0.2  13:48.99 systemd                                 
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# top -d 1 -b -n 2 > top.txt #批处理2次写入top.txt

#top熟悉了解的快捷键
1 查看系统核心总数
h 查看帮出
z 以彩色信息展示
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc

kill指令

#进程挂起是暂停进程的执行,但仍然保留在主存中
#进程中断是打断正在执行的进程,处理中断事件后返回原进程
#进程退出是正常结束进程的执行,释放资源并从系统中移除
#进程终止是非正常结束进程的执行,可能仍然保留在主存中但不再处于活跃状态

kill
    -SIGTERM (15):默认的终止信号。它会请求进程正常退出,允许进程执行清理操作并释放资源。
    -SIGKILL (9):强制终止信号。它会立即终止进程,不允许进程进行清理操作或释放资源。
    -SIGINT (2):中断信号。通常由终端上的 Ctrl+C 键触发,用于向进程发送中断请求。
    -SIGHUP (1):挂起信号。当终端断开连接时或控制终端被关闭时发送给进程,用于通知进程重新加载配置或执行其他操作。
    -SIGSTOP (17):停止信号。它会暂停进程的执行,但不会终止进程。可以使用 SIGCONT 信号恢复进程的执行。
    -SIGCONT (18):继续信号。用于恢复被停止的进程的执行。
    
pkill 进程名 #删除带有进程名的进程,不推荐

后台进程管理

########第一种#######
ctrl+z   #挂起进程
jobs	 #查看后台挂起的进程
fg n	 #让后台挂起的进程重新到前台执行,不指定n则从最后一个开始
bg n	 #执行后台挂起的进程,不指定n则从最后一个开始
kill %n	 #杀死后台挂起的进程,不指定n则从最后一个开始


#挂起三个进程
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs  
[1]   Stopped                 sleep 99999999
[2]-  Stopped                 sleep 99999999
[3]+  Stopped                 sleep 99999999

#从最后一个进程恢复执行Stopped变成Running
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg
[3]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg
[2]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# bg 1
[1]+ sleep 99999999 &
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# fg 2
sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs
[1]   Running                 sleep 99999999 &
[2]+  Stopped                 sleep 99999999
[3]-  Running                 sleep 99999999 &

#kill删除进程
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# kill %1
[1]   Terminated              sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# kill %2
[2]+  Stopped                 sleep 99999999
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# jobs
[3]+  Running                 sleep 99999999 &

########第二种#######
screen  #需要安装
#1.创建screen 创建,创建的窗口可以随便执行命令
screen 或 screnn -S 窗口名称
    #主窗口创建ys窗口
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -S ys
    [detached from 16917.ys]
     #ys窗口执行命令
     [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls
     1.REP  Centos-7.repo  ip1.txt  ip.txt  ok.txt  sort.txt  test  top.txt
 
#2.退出窗口
ctrl +a +d

#3.显示当前所有screen窗口
screen -ls
	#主窗口
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -ls
    There is a screen on:
            17423.ys        (Detached)
    1 Socket in /var/run/screen/S-root.

#4.恢复,重新进入创建
screen -r id
	#主窗口进入ys窗口
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -r 17423
        #ys窗口:命令还在,说明它在后台是一直运行的
        [root@iZ2zeco2fmiqbbuzq773qyZ ~]# ls
        1.REP  Centos-7.repo  ip1.txt  ip.txt  ok.txt  sort.txt  test  top.txt
    
#5.彻底关闭
screen -r id 进入后输入exit彻底退出screen
	#主窗口发现没有ys窗口
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# screen -ls
    No Sockets found in /var/run/screen/S-root.

########第三种#######
命令&后台执行

平均负载

**平均负载:**单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数

  • 可运行状态进程:指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们ps 命令看到处于 R 或 S 状态的进程
  • 不可中断进程:系统中最常见的是等待硬件设备的 I/O 响应,也就是我们 ps 命令中看到的 D 状态(也称为Disk Sleep)的进程。
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2   #核心数
On-line CPU(s) list:   0,1
Thread(s) per core:    2
Core(s) per socket:    1   #cpu数
Socket(s):             1

平均负载案例分析

**stress:**是 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景
**mpstat:**是多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标
**pidstat:**是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标

场景一:CPU 密集型进程

#模拟cpu负载高 stress --cpu 1 --timeout 100
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# stress --cpu 1 --timeout 100
stress: info: [16684] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
#通过uptime或w 查看 watch -d uptime
[root@iZ2zeco2fmiqbbuzq773qyZ ~]#watch -d uptime  #默认没2s更新一次
Every 2.0s: uptime                                                     Sun Jun  4 15:07:18 2023

 15:07:18 up 193 days,  1:08,  2 users,  load average: 0.42, 0.13, 0.08  #1分钟负载,逐渐接近1,因为只有一个cpu负载
#查看整体状态mpstat -P ALL 1 查看每个cpu核心使用率
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# mpstat -P ALL 1  #-P查看哪个cpu,ALL是查看所有cpu或者0,1,2等等 
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ)      06/04/2023      _x86_64_      (2 CPU)

03:08:48 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:08:49 PM  all   51.76    0.00    1.51    0.00    0.00    0.00    0.00    0.00    0.00   46.73 #因为测试只有一个负载,2个cpu就50%
03:08:49 PM    0    3.03    0.00    3.03    0.00    0.00    0.00    0.00    0.00    0.00   93.94 #因为测试只有一个负载,另一个就不工作
03:08:49 PM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00 #cpu某个沾满因为测试只有一个负载

03:08:49 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:08:50 PM  all   51.27    0.00    1.02    0.00    0.00    0.00    0.00    0.00    0.00   47.72
03:08:50 PM    0    2.02    0.00    2.02    0.00    0.00    0.00    0.00    0.00    0.00   95.96
03:08:50 PM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

03:08:50 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:08:51 PM  all   51.01    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   48.48
03:08:51 PM    0    1.03    0.00    1.03    0.00    0.00    0.00    0.00    0.00    0.00   97.94
03:08:51 PM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
#精确到进程: pidstat 1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# pidstat 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ)      06/04/2023      _x86_64_        (2 CPU)

03:12:35 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:12:36 PM     0     17640  100.00    0.00    0.00  100.00     1  stress #可以看到这个进程占用100%
03:12:36 PM     0     30674    0.00    3.00    0.00    3.00     0  AliYunDunMonito

03:12:36 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:12:37 PM     0     17640   99.00    0.00    0.00   99.00     1  stress
03:12:37 PM     0     17837    0.00    1.00    0.00    1.00     0  pidstat
03:12:37 PM     0     30674    0.00    5.00    0.00    5.00     0  AliYunDunMonito

场景二:I/O 密集型进程

#通过stress 模拟大量进程读写 stress --hdd 1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# stress --hdd 1
stress: info: [20328] dispatching hogs: 0 cpu, 0 io, 0 vm, 1 hdd
#通过w/uptime查看系统负载信息 watch -d uptime
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# watch -d uptime
Every 2.0s: uptime                                                                                   Sun Jun  4 15:23:10 2023

 15:23:10 up 193 days,  1:24,  2 users,  load average: 0.68, 0.30, 0.23
#通过top/mpstat 排查 mpstat -P ALL 1 或 top 按1
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# mpstat -P ALL 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ)      06/04/2023      _x86_64_        (2 CPU)

03:23:50 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:23:51 PM  all    1.55    0.00   12.44   83.42    0.00    0.52    0.00    0.00    0.00    2.07
03:23:51 PM    0    1.04    0.00   12.50   86.46    0.00    0.00    0.00    0.00    0.00    0.00
03:23:51 PM    1    2.11    0.00   12.63   81.05    0.00    0.00    0.00    0.00    0.00    4.21

03:23:51 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:23:52 PM  all    1.55    0.00    6.70   87.11    0.00    0.00    0.00    0.00    0.00    4.64
03:23:52 PM    0    1.03    0.00    7.22   90.72    0.00    0.00    0.00    0.00    0.00    1.03
03:23:52 PM    1    1.04    0.00    6.25   84.38    0.00    0.00    0.00    0.00    0.00    8.33
#确定是iowait,iostat 1查看整体磁盘读写情况
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iostat 1
Linux 3.10.0-957.21.3.el7.x86_64 (iZ2zeco2fmiqbbuzq773qyZ)      06/04/2023      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.82    0.00    0.77    0.00    0.00   98.41

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.40         0.02         2.79     390322   46598672  #查看哪个磁盘使用情况
#iotop -o 查看具体哪个进程读写
[root@iZ2zeco2fmiqbbuzq773qyZ ~]# iotop -o
Total DISK READ :       0.00 B/s | Total DISK WRITE :     112.50 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     152.81 M/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                       
14179 be/4 root        0.00 B/s    0.00 B/s  0.00 % 96.51 % [kworker/u4:1]
20615 be/4 root        0.00 B/s  112.49 M/s  0.00 % 85.99 % stress --hdd 1
  459 be/3 root        0.00 B/s   11.88 K/s  0.00 %  0.00 % auditd
#根据对应的进程,进行相关处

#注意:
stress --io 1:这个命令使用stress工具来模拟I/O(输入/输出)负载。它会创建一些并行的I/O任务,以测试系统的I/O性能
stress --hdd 1:这个命令使用stress工具来模拟硬盘负载。它会创建一个或多个用于写入和读取的文件,并测试系统的硬盘性能
使用stress --io 1时,%sys增加而%iowait不变
	这是因为stress --io命令主要测试系统的I/O性能,会创建并行的I/O任务。这些任务需要使用CPU的内核空间来处理I/O操作,因此会增加%sys的值。然而,这些任务并不会导致CPU等待I/O操作完成,所以%iowait的值不会变化。
使用stress --hdd 1时,%sys微微增加而%iowait增加。
	当你运行stress --hdd命令时,它会创建一个或多个文件并进行写入和读取操作,从而模拟硬盘负载。这些操作会导致CPU使用一些额外的内核空间来处理这些I/O操作,因此%sys会微微增加。同时,这些I/O操作需要一些时间来完成,CPU需要等待I/O操作完成,所以%iowait的值会增加。

**总结:**平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。

  • 平均负载高有可能是 CPU 密集型进程导致
  • 平均负载高还有可能是 I/O 更繁忙
  • 当发现负载高的时候,使用 mpstat、pidstat 等工具,辅助分析负载的来源

日常故障排查

  • w/uptime, 查看负载
  • ps aux/top 看看 cpu百分比, iowait或者是内存占用的高? (三高cpu,io,内存)
  • top检查具体是哪个进程,找出可疑进程
  • 追踪这个进程使用情况,做什么的?
  • 看看对应日志是否有异常
    • 系统日志: /var/log/messages(系统通用日志) /var/log/secure(用户登录情况)
    • 服务软件的日志

定时任务Crond

Crontab使用规则

配置文件位置:/etc/crontab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UbDh5R1P-1690465877817)(E:\运维学习\shell.assets\image-20230606190229685.png)]

符号含义
*每(每小时 每天 每周 每月)
/每隔(表示每隔多久执行一次)
,独立的时间(例如:7点,6点,9点)
-范围(10-30,20-55之类)
* 		*       *      *      *      ls 	#每分钟执行一次 ls

00 		02      *      *      *      ls 	#每天的凌晨2点执行ls
00 		02      1      *      *      ls 	#每个月的1号凌晨2点执行ls
00 		02      14     2      *      ls 	#每年的2月14日的凌晨2点执行ls
00 		02      *      *      7      ls 	#每周日的凌晨2点执行ls
00 		02      *      6      5      ls 	#每年的6月的周五的凌晨2点执行ls
00 		02      14     *      7      ls 	#每个月的14号或每周周日的凌晨02点执行ls 不推荐同时书写日期和周几
00 		02      14     2      7      ls 	#每年的2月14日或周日,凌晨2点执行ls

*/10 	02      *      *      *      ls 	#每天凌晨2点每隔10分钟执行 ls 2:00 2:10 2:20 2:30 2:40 2:50
*/5 	*       *      *      *      ls 	#每五分钟 执行ls

00 		02      *      1,5,8  *      ls 	#每年1,5,8月的每天凌晨2点执行ls

00 		02      1-8    *      *      ls 	#每月的1-8号的凌晨2点执行ls
参数含义
crontab -e edit编辑定时任务
crontab -l list查看当前用户的定时任务
crontab -r remove清空/删除当前用户的所有定时任务
crontab -u user编辑user的定时任务,配置文件对应/var/spool/cron/user下

笔记:

  1. 在root用户下 执行crontab -e -u aaa 和在aaa用户下执行crontab -e -u aaa 有什么区别吗?

    • 当以root用户身份执行"crontab -e -u aaa"时,可以编辑aaa用户的crontab文件,因为root用户具有最高权限。

    • 而当以aaa用户身份执行"crontab -e -u aaa"时,只能编辑自己的crontab文件

  2. crontab -e 会自动更新配置文件,所以每次写入新任务不用重新加载服务的配置文件

Crond编写实战

  1. 每2分钟输出oldboy追加到/tmp/oldboy.txt

    #书写对应的命令到定时任务
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -e
    #oldboy1
    */2 * * * * echo oldboy >>/tmp/oldboy.txt
    
    #查看定时任务
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -l
    #oldboy1
    */2 * * * * echo oldboy >>/tmp/oldboy.txt
    
    #测试与检查
    ##看结果 看文件内容
    [root@oldboy-c7 ~]# tail -f /tmp/oldboy.txt
    oldboy
    ##看日志 检查定时任务的日志
    tail -f /var/log/cron
    
  2. 使用root用户每分钟执行一次时间同步

    #书写对应的命令到定时任务
    [root@iZ2zeco2fmiqbbuzq773qyZ ~]# crontab -e -u root
    #oldboy
    */2 * * * * echo oldboy >>/tmp/oldboy.txt
    
    #ntpdate
    * * * * * /sbn/ntpdate ntp1.aliyun.com &>/dev/null  #命令加绝对路径和定向到null后面故障解释
    

Crond注意的事项

  1. 给定时任务注释,说明任务功能

  2. 将需要定期执行的任务写入Shell脚本中,避免直接使用命令无法执行的情况

    • %在定时任务中有特殊含义需要使用转义,但是写入脚本就不用转义,直接定时这个sh脚本就行
  3. 定时任务的结尾一定要有&>/dev/null 或者 将结果追加到&>>/tmp/date.log文件

#故障案例:没有定向到空或追加到文件
###邮件服务开启,你会收到大量的提示 You have new mail in /var/spool/mail/root。最后导致邮件文件越来越大
###邮件服务关闭,邮件没有发送导致生成大量临时文件在/var/spool/postfix/maildrop中,最终导致目录中有大量小文件占用inode
  1. 注意有些命令是无法成功执行的 echo “123” >>/tmp/test.log &>/dev/null

  2. 如果一定要是用命令,命令必须使用绝对路径

    #故障案例:命令没有使用绝对路径
    #故障原因: 定时任务执行命令的时候,只能识别/usr/bin和/bin 下面的命令。例如ifconfig、ntpdate等等,无法再定时任务中识别并运行
    #解决方法:
    ##方法1 使用绝对路径 (推荐)
    ##方法2 在脚本开头重新配置下,与命令路径相关的环境变量 source /etc/profile
    	[root@oldboy-c7 ~]# cat /server/scripts/error.sh
        #!/bin/bash
        #配置sh的/etc/profile
        source /etc/profile
        #或者直接配置PATH
        PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
  3. crond备份

    • 备份日志,通过查找/var/log/cron中执行的记录,去推算任务执行的时间
    • 定时的备份配置{username}的文件,/var/spool/cron/{username}
  4. crond拒绝某个用户使用

    #1.使用root将需要拒绝的用户加入/etc/cron.deny
    [root@oldboyedu ~]# eco "oldboy" >> /etc/cron.deny
    #2.登陆该普通用户,测试是否能编写定时任务
    [oldboy@oldboyedu ~]$ crontab -e
    You (oldboye) are not allowed to use this program
    (crontab)
    See crontab(1) for more information
    

Crond调试

  1. 增加频率
    • 调整任务每分钟执行的频率, 以便做后续的调试。
    • 调整系统时间
  2. 执行脚本输出到文件(排查错误)
    • 如果使用cron运行脚本,请将脚本执行的结果写入指定日志文件, 观察日志内容是否正常。
  3. 命令使用绝对路径, 防止无法找到命令导致定时任务执行产生故障。
  4. 通过查看/var/log/cron日志,以便检查我们执行的结果,方便进行调试。

Crond编写思路

  1. 手动执行命令,然后保留执行成功的结果

  2. 编写脚本

    • 统一路径:脚本需要统一路径/scripts
    • 复制:脚本内容复制第一步执行成功的命令(减少每个环节出错几率)
    • 简单粗暴:脚本内容尽可能的优化,使用一些变量或使用简单的判断语句
    • 定向到空:脚本执行的输出信息可以重定向至其他位置保留或写入/dev/null
  3. 执行脚本

    • 使用bash命令执行,防止脚本没有增加执行权限(/usr/bin/bash)
    • 执行脚本成功后,复制该执行的命令,以便写入cron
  4. 编写计划任务

    • 加注释:加上必要的注释信息
    • 改时间:设定计划任务执行的周期
    • 去粘贴:粘贴执行脚本的命令(不要手敲)
  5. 调试计划任务增加任务频率测试

    • 检查环境变量问题:使用命令绝对路径
    • 看日志:检查crond服务日志
    • 看结果

网络基础

基础知识

交换机:实现同一个局域网通信工具,用于连接多个计算机或网络设备,并在它们之间传输数据

  • 交换机能够根据目的地址在不同端口之间转发数据包
  • 基于MAC地址、IP地址或虚拟局域网(VLAN)来进行转发
    • MAC地址:唯一

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nlwpKJmJ-1690465877817)(E:\运维学习\shell.assets\image-20230616193124878.png)]

路由器:实现多个网段数据传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VTPiPcmI-1690465877817)(E:\运维学习\shell.assets\image-20230616193217776.png)]

网关:实现不同网段之间通讯需要经过一条必经之路。gateway (交换机,路由器)默认的出口/入口

网络追踪命令:

Linux:
traceroute -n -I IP地址

网络层次结构

  • 核心层:主要部署路由器设备,用于连接外网线路,还要具备冗余能力
  • 汇聚层:主要部署三层交换设备,用于相应安全访问控制 进行链路汇聚
    • 链路聚合是把两台设备之间的多条物理链路聚合在一起,当做一条逻辑链路来使用,可以增加带宽,负载分担
  • 接入层:主要部署二层交换设备,用于终端设备接入

网络七层

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDpSNytq-1690465877818)(E:\运维学习\shell.assets\image-20230616230622638.png)]

含义涉及协议或内容
应用层应用软件,接口,各种协议http https dns smtp …
表示层
会话层
传输层数据如何传输到对端tcp udp 端口
网络层网络路由和寻址IP 3层路由器
数据链路层通过mac地址识别设备,进行传输mac 2层交换机
物理层数据转换为010101010,通过网络介

数据封包解包过程

  • 封包

    • 应用层:原始数据被转换成二进制数据
    • 传输层:二进制数据被分割成小的数据段,并封装TCP头部 (数据段)(TCP头部的关键信息–端口号)
    • 网络层:传输层传来的数据被封装上IP头部 (数据包)(IP头部的关键信息–IP地址)
    • 数据链路层:网络层传来的数据被封装上MAC头部 (数据帧)(MAC头部的关键信息–MAC地址)
    • 物理层:二进制数据组成的比特流转化为电信号在网络中传输 (比特流)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ai9dxa2Y-1690465877818)(E:\运维学习\shell.assets\image-20230617195706240.png)]

  • 解包

    • 物理层:将电信号转化为二进制数据,并将其送至数据链路层
    • 数据链路层:查看MAC地址,地址是自己,就拆掉MAC头部,继续传输地址不是自己,就丢弃数据
    • 网络层:查看IP地址,地址是自己,就拆掉IP头部,继续传输地址不是自己,就丢弃数据
    • 传输层:查看TCP头部,判断应该传到哪里,然后重组数据,传输到应用层
    • 应用层:二进制转化为原始数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1SoueX3-1690465877819)(E:\运维学习\shell.assets\image-20230617195842029.png)]

TCP握手/挥手

本地IP阿里云服务器IP
222.27.64.1747.93.18.99

握手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qouDpOph-1690465877819)(E:\运维学习\shell.assets\image-20230617215221702.png)]

  • 第一次

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DCSNn6Ca-1690465877819)(E:\运维学习\shell.assets\image-20230617215847584.png)]

  • 第二次

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uRQjrWhT-1690465877819)(E:\运维学习\shell.assets\image-20230617220302439.png)]

  • 第三次

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kiTXrNU4-1690465877820)(E:\运维学习\shell.assets\image-20230617220818468.png)]

挥手

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkHgT7Ed-1690465877820)(E:\运维学习\shell.assets\image-20230617215305072.png)]

总结:

  • ack为上一次握手/挥手的seq+1:确认接收端的请求或回应
  • seq为上一次握手/挥手的ack:保证数据的有序传输和确认的准确性

ARP协议

  • 定义:将IP地址解析为MAC地址,维护映射的缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fdcjq8NP-1690465877820)(E:\运维学习\shell.assets\image-20230622224420747.png)]

  • 流程:
    • 主机A首先查看自己的ARP缓存表,确定其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
    • 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
    • 主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
    • 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
    • 当主机A和主机B不在同一网段时,主机A就会先向网关发出ARP请求,ARP请求报文中的目标IP地址为网关的IP地址。当主机A从收到的响应报文中获得网关的MAC地址后,将报文封装并发给网关。如果网关没有主机B的ARP表项,网关会广播ARP请求,目标IP地址为主机B的IP地址,当网关从收到的响应报文中获得主机B的MAC地址后,就可以将报文发给主机B;如果网关已经有主机B的ARP表项,网关直接把报文发给主机B。

IP分类

124407
  • 一般IP
    • A:1.0.0.0 到 126.0.0.0
    • B:128.0.0.0 到 191.254.0.0
    • C:192.0.1.0 到 223.255.254.0
    • D:224.0.0.0 到 239.255.255.255
    • E :40.0.0.0 到 255.255.255.254
  • 特殊IP:
    • 0.0.0.0:表示所有可能的IP地址或指示任意地址。在网络设置中,它可以用作默认路由或绑定所有可用网络接口。
    • 127.0.0.1:这是本地回环地址,也称为"localhost"。它用于在本地计算机上测试网络配置和应用程序,指向本机。
    • 255.255.255.255:这是广播地址,用于向特定网络中的所有设备发送广播消息。当某个设备发送消息到该地址时,该消息将被发送到网络上的所有设备。
    • 192.168.x.x:这是私有IP地址范围之一,用于内部局域网。它们不直接与互联网相连,而是在局域网内使用。
    • 10.x.x.x:这是另一个私有IP地址范围,也用于内部局域网。与192.168.x.x类似,它们用于在私有网络内部进行通信。
    • 169.254.x.x:这是自动私有IP地址(APIPA),当设备无法通过DHCP获得有效IP地址时,会自动分配此类地址。它通常用于本地网络中的临时通信。

子网掩码

为什么引入子网?

  • 划分网络:子网的引入可以将一个大型网络划分为更小的子网,有助于管理和组织网络。每个子网可以独立地进行管理,简化网络结构。
  • 控制广播范围:在没有子网的情况下,广播消息将在整个局域网中传播,导致广播风暴和带宽浪费。通过子网,可以限制广播消息的范围在子网内部,减少广播对整个网络的影响。
  • 提高网络性能:当网络中有大量设备时,所有设备发送请求到同一个网关可能导致网关负载过高。通过子网,可以将设备分散到不同的子网中,减轻了每个子网的负载,提高了整体网络性能。
  • 安全性增强:子网可以通过实施子网间的访问控制列表(ACL)和防火墙规则来增强网络的安全性。不同子网之间的通信可以受到限制,有助于保护敏感数据和资源的安全。

通过子网掩码划分子网:通过改变子网掩码,可以调整网络位的大小,从而改变子网的划分和主机位的大小。

out (1)

局域网用户上网原理

  1. 物理连接:局域网用户通过物理连接(如以太网线或Wi-Fi)将其终端设备(如计算机、手机、平板等)连接到局域网中的交换机或路由器
  2. IP地址获取:终端设备通过动态主机配置协议(DHCP)或手动配置获取一个局域网内的私有IP地址。私有IP地址是在局域网内部使用的地址,用于在局域网内唯一标识设备。
  3. 网关设置:终端设备需要配置网关地址,该地址通常是局域网中的路由器的内部接口地址。网关在局域网中充当连接局域网和外部互联网的中转设备。
  4. 路由转发:当终端设备想要访问外部互联网时,它会将数据包发送到网关。网关根据路由表和网络配置将数据包转发到外部互联网。
  5. NAT转换:在通过网关访问互联网之前,终端设备的私有IP地址需要通过网络地址转换(NAT)将其转换为公共IP地址。这样可以实现多个终端设备共享同一个公共IP地址的功能。
  6. 互联网访问:一旦数据包通过网关并获得公共IP地址,它就可以在互联网上与其他服务器进行通信。终端设备可以发送请求、接收响应并访问各种互联网资源。

DNS

功能:

  • A记录是"Address"记录的缩写,用于将域名解析为IPv4地址。当用户输入一个域名时,DNS服务器会查询该域名的A记录,返回与之对应的IPv4地址。这样,用户的计算机就能够通过该IPv4地址与目标服务器建立连接。
  • CNAME记录是"Canonical Name"记录的缩写,用于创建域名的别名。CNAME记录将一个域名指向另一个域名,实现域名之间的关联。当用户查询一个使用CNAME记录的域名时,DNS服务器会返回与之关联的目标域名的A记录。这样,用户的计算机就可以通过目标域名的A记录找到目标服务器的IPv4地址。

解析流程

image-20230625221847693
  • 例子:
    • 根服务器:全球有13台根服务器
    • 顶级域名服务器:org,com,net,me,cc等等
    • 一级域名服务器:baidu,google等等
    • A记录主机信息:www,blog,bbs

命令

dig www.baidu.com +trace
	+trace 详细信息  
	

网卡

[root@iZ2zeco2fmiqbbuzq773qyZ ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 

#重启某一块网卡
ifdown ens33 && ifup ens33
  1. DEVICE:指定网络接口设备的名称,这里是 ens33,表示以太网卡设备的第一个接口。
  2. BOOTPROTO:指定接口的启动协议,常见取值有 nonestaticdhcp 等。none 表示不使用任何协议,static 表示使用静态 IP 地址,dhcp 表示使用 DHCP 协议从 DHCP 服务器获取 IP 地址。
  3. IPADDR:指定静态 IP 地址,当 BOOTPROTO 设置为 static 时生效。
  4. NETMASK:指定子网掩码,用于确定网络中 IP 地址的网络部分和主机部分。
  5. GATEWAY:指定默认网关的 IP 地址,用于将网络流量转发到其他网络。
  6. DNS1DNS2:指定首选和备用 DNS 服务器的 IP 地址,用于解析域名到 IP 地址。
  7. ONBOOT:指定网络接口是否在系统启动时自动激活,常见取值有 yesno
  8. HWADDR:指定网卡设备的硬件 MAC 地址。
  9. PREFIX:指定网络接口的网络前缀长度,用于确定网络部分的位数。例如,如果网络前缀是 24,则表示前 24 位用于网络部分,后 8 位用于主机部分。
  10. TYPE:指定网络接口的类型,常见取值有 Ethernet以太网Wireless无线 等,表示不同类型的网络接口设备。
  11. PEERDNS:指定是否使用从 DHCP 服务器获取的 DNS 服务器配置。如果设置为 yes,则使用从 DHCP 服务器获取的 DNS 服务器;如果设置为 no,则不使用 DHCP 提供的 DNS 服务器配置。
  12. IPV6INIT:指定是否启用 IPv6 支持。如果设置为 yes,表示启用 IPv6;如果设置为 no,表示禁用 IPv6。

别名IP和辅助IP

查看网络配置信息命令:
# ifconfig 		查看配置 别名ip 信息等。
# ifconfig eth0 指定查看一个网卡设备的网络配置信息
# ip add

配置虚拟IP地址方法:
#配置 别名IP 即表示配置 虚拟 IP VIP
ifconfig eth0:X 10.0.0.100/24 up #配置 X别名IP 
ifconfig eth0:X down 			 #停掉 X别名IP

#配置 辅助 IP 即表示配置多个 IP 在同一个网卡上
ip addr add 10.0.0.13/23 dev eth0 label eth0:1  #配置eth0标签为eth0:1的辅助IP

ip addr add 10.0.0.13/24 dev eth0   	  		#配置eth0的辅助IP
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:08:d2:49 brd ff:ff:ff:ff:ff:ff
        inet 172.25.50.171/18 brd 172.25.63.255 scope global dynamic eth0
           valid_lft 296833138sec preferred_lft 296833138sec
        inet 10.0.0.13/24 scope global #eth0
           valid_lft forever preferred_lft forever
        inet 10.0.0.13/23 scope global #eth0:1
           valid_lft forever preferred_lft forever   
           
ip addr del 10.0.0.13/24 dev eth0   	  		#删除eth0的辅助IP

#配置永久ip
[root@oldboy-c7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:0
NAME=ens33:0
DEVICE=ens33:0
IPADDR=10.0.0.200
PREFIX=24

网络故障排查

![](E:\运维学习\shell.assets\out (1)-16877082738067.jpg)

  • 网络命令

    #ifconfig命令
    用于显示网路配置信息
    #ip命令
    用于显示网路配置信息
    #route命令
    查看路由配置信息 route -n
    #hostname(uname -n)
    显示主机名称信息,也可以利用hostname显示ip地址配置信息hostname -I
    #netstat(ss)
    显示主机的端口与服务的端口与服务网络网络连接状态连接状态。ESTABLISHED 建立连接的状态,数量即表示网络连接数
    	ss -n   #显示连接状态 把端口号/ip --->对应名字
    	ss -an  #显示所有类型的连接 tcp udp 其他类型
    	ss -ant #-t 只显示tcp 连接状态
    	ss -l   #只显示处于listen状态的信息
    	ss -u   #显示udp连接信息
    	ss -p   #process pid 显示进程信息
    #lsof:lsof -n -i :22
    显示主机的端口与服务网络连接状态。的端口与服务网络连接状态
    #ping
    #traceroute (linux) tracert(windows)
    追踪IP
    #iftop
    检查/查看网卡流量
    	-n ip不要转换为域名
    	-N 端口不要转换为服务名
    	-i 指定网卡
    	-P 显示端口号
    #nethogs 
    精确到进程,每个进程占用网速
    
    
  • 排查

    • 检查 路径是否通畅
      • ping
      • traceroute/tracert
    • 检查服务是否开启
      • 检查端口
        • telnet ip 端口
        • nmap -p端口 ip
        • nmap -p端口x-端口y ip
        • nmap -p端口 ip/网段
      • 检查进行
        • ps -ef
          DEVICE:指定网络接口设备的名称,这里是 ens33`,表示以太网卡设备的第一个接口。
  1. BOOTPROTO:指定接口的启动协议,常见取值有 nonestaticdhcp 等。none 表示不使用任何协议,static 表示使用静态 IP 地址,dhcp 表示使用 DHCP 协议从 DHCP 服务器获取 IP 地址。
  2. IPADDR:指定静态 IP 地址,当 BOOTPROTO 设置为 static 时生效。
  3. NETMASK:指定子网掩码,用于确定网络中 IP 地址的网络部分和主机部分。
  4. GATEWAY:指定默认网关的 IP 地址,用于将网络流量转发到其他网络。
  5. DNS1DNS2:指定首选和备用 DNS 服务器的 IP 地址,用于解析域名到 IP 地址。
  6. ONBOOT:指定网络接口是否在系统启动时自动激活,常见取值有 yesno
  7. HWADDR:指定网卡设备的硬件 MAC 地址。
  8. PREFIX:指定网络接口的网络前缀长度,用于确定网络部分的位数。例如,如果网络前缀是 24,则表示前 24 位用于网络部分,后 8 位用于主机部分。
  9. TYPE:指定网络接口的类型,常见取值有 Ethernet以太网Wireless无线 等,表示不同类型的网络接口设备。
  10. PEERDNS:指定是否使用从 DHCP 服务器获取的 DNS 服务器配置。如果设置为 yes,则使用从 DHCP 服务器获取的 DNS 服务器;如果设置为 no,则不使用 DHCP 提供的 DNS 服务器配置。
  11. IPV6INIT:指定是否启用 IPv6 支持。如果设置为 yes,表示启用 IPv6;如果设置为 no,表示禁用 IPv6。

别名IP和辅助IP

查看网络配置信息命令:
# ifconfig 		查看配置 别名ip 信息等。
# ifconfig eth0 指定查看一个网卡设备的网络配置信息
# ip add

配置虚拟IP地址方法:
#配置 别名IP 即表示配置 虚拟 IP VIP
ifconfig eth0:X 10.0.0.100/24 up #配置 X别名IP 
ifconfig eth0:X down 			 #停掉 X别名IP

#配置 辅助 IP 即表示配置多个 IP 在同一个网卡上
ip addr add 10.0.0.13/23 dev eth0 label eth0:1  #配置eth0标签为eth0:1的辅助IP

ip addr add 10.0.0.13/24 dev eth0   	  		#配置eth0的辅助IP
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:08:d2:49 brd ff:ff:ff:ff:ff:ff
        inet 172.25.50.171/18 brd 172.25.63.255 scope global dynamic eth0
           valid_lft 296833138sec preferred_lft 296833138sec
        inet 10.0.0.13/24 scope global #eth0
           valid_lft forever preferred_lft forever
        inet 10.0.0.13/23 scope global #eth0:1
           valid_lft forever preferred_lft forever   
           
ip addr del 10.0.0.13/24 dev eth0   	  		#删除eth0的辅助IP

#配置永久ip
[root@oldboy-c7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33:0
NAME=ens33:0
DEVICE=ens33:0
IPADDR=10.0.0.200
PREFIX=24

网络故障排查

![](E:\运维学习\shell.assets\out (1)-16877082738067.jpg)

  • 网络命令

    #ifconfig命令
    用于显示网路配置信息
    #ip命令
    用于显示网路配置信息
    #route命令
    查看路由配置信息 route -n
    #hostname(uname -n)
    显示主机名称信息,也可以利用hostname显示ip地址配置信息hostname -I
    #netstat(ss)
    显示主机的端口与服务的端口与服务网络网络连接状态连接状态。ESTABLISHED 建立连接的状态,数量即表示网络连接数
    	ss -n   #显示连接状态 把端口号/ip --->对应名字
    	ss -an  #显示所有类型的连接 tcp udp 其他类型
    	ss -ant #-t 只显示tcp 连接状态
    	ss -l   #只显示处于listen状态的信息
    	ss -u   #显示udp连接信息
    	ss -p   #process pid 显示进程信息
    #lsof:lsof -n -i :22
    显示主机的端口与服务网络连接状态。的端口与服务网络连接状态
    #ping
    #traceroute (linux) tracert(windows)
    追踪IP
    #iftop
    检查/查看网卡流量
    	-n ip不要转换为域名
    	-N 端口不要转换为服务名
    	-i 指定网卡
    	-P 显示端口号
    #nethogs 
    精确到进程,每个进程占用网速
    
    
  • 排查

    • 检查 路径是否通畅
      • ping
      • traceroute/tracert
    • 检查服务是否开启
      • 检查端口
        • telnet ip 端口
        • nmap -p端口 ip
        • nmap -p端口x-端口y ip
        • nmap -p端口 ip/网段
      • 检查进行
        • ps -ef
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值