[TOC]

CentOS/RHEL命令学习笔记

Linux命令

软件包与软件源

软件的安装方式

  • yum 软件包管理器

    • 底层是rpm
    • 自动解决依赖问题
    • 安装完成会自动清理软件包文缓存
    • 安装分为远程安装本地安装

      • 本地yum源 file://本地yum源路径
      • 远程yum源 http://xxx ftp://xxx
    用法:yum [参数] 包名
    参数介绍:
    常用指令参数组合:
        yum install 软件名 # 安装软件包
        yum repolist # 查询yum源信息
        yum install epel-release # 增加拓展源
        yum clean all # 清除缓存
        # 若替换了yum源 系统默认的缓存内容不会变化,
        # 找不到新替换的yum源,此时会报错 需要及时清理缓存
        yum makecache # 加载缓存
        ls -al /etc/yum.repos.d/ # 查看可使用的yum源
        yum provides 命令 # 查看命令属于哪个软件,即使本地不存在的软件指令,yum也可以寻找
        yum list # 查看系统已经安装好的软件和没有安装的软件(源里存在即可查找到)
        yum -y reinstall 软件名 # 重装
        yum remove 软件名 # 卸载
        yum erase 软件名 # 清除软件配置文件
    示例:
        1. yum安装mysql
            yum install mysql
  • rpm 软件包管理器,较少使用

    • 无法自动解决依赖关系,需要手动解决
    • 适用于依赖较少或已知依赖关系的情况
    • rpm软件包名称:
      软件名称 版本号(主版本 次版本 修订号) 操作系统 ---- 90%的命名规律

      用法:rpm [参数] 包名
      - 资源路径可以是本地路径,也可以是网络链接
      1. 查找rpm包
      2. wget 网络资源路径
          - wget需要手动安装
      3. 使用 rpm -ivh xxx.rpm 从本地安装
      4. 使用 rpm -ivh url链接 从网络安装(与上面的步骤二选一)
      参数介绍:
      -i 安装
      -v 显示安装信息
      -h 显示安装进度
      -U 安装时检测安装包版本是否最新,如不是则先升级再安装
      -a 查看所有已安装的软件包
      -q 查询所有已安装的软件包
      -l 显示软件包的文件列表
      -e 卸载指定的软件包
      -f 软件包中的文件
      常用指令参数组合:
      -ivh 安装指定软件包并显示进度
      -qa 查询所有已安装的软件包
      -qi 查询软件包的安装信息
      示例:
      5. 查询指定软件包
          rpm -qa | grep 包名
      6. 显示软件包的安装文件
          rpm -ql 包名
      7. 查询某个文件属于哪个软件包
          rpm -qf 软件安装路径 # 只能查看已安装好的软件包
      rpm软件包查找网站:
      - rpm find
          https://www.rpmfind.net/
      - pkgs.org
          https://pkgs.org/
  • 源码安装

    一个软件想要在linux中运行,必须是二进制文件。
    因此当我们拿到软件源码以后,需要将它编译(翻译)为二进制文件,才能在linux中运行。
    
    源码包在编译时需要使用Linux系统的编译器. 
    通常源码包都是用C语言开发的[这是因为C语言是Linux最标准的程序语言,效率高]。
    Linux中C语言编译器叫做 gcc. 利用gcc 可以把C语言变成可执行的二进制文件
    
源码安装的优点
- 编译安装的过程,可以设定参数[例如 安装路径 日志路径....],
- 按照需求增加功能,并且可以指定安装的版本,灵活性比较大。
获取源码包
    - 研发部自研
    - 官方网站,获取软件包

CentOS7换源

  • /etc/yum.repos.d 源的存放位置
  • http://mirrors.aliyun.com/repo/Centos-7.repo Ali Mirror
  • https://mirrors.163.com/.help/CentOS7-Base-163.repo wangyi Mirror
  • 备份源

      mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  • 下载Ali Mirror

      curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  • 更新镜像源

      yum clean all # 清理缓存
      yum makecache # 重新建立缓存

防火墙

  • 防火墙
    防范一些网络攻击。有软件防火墙、硬件防火墙之分

区域

区域策略
trusted 信任区允许所有数据包
home 家庭区拒绝流入的流量,除非与流出的流量相关。
允许ssh mdns ippclient amba-client dhcpv6-client服务通过
internal 内部区等同于home
work 工作区拒绝流入的流量,除非与流出的流量相关。允许ssh dhcpv6-client服务通过
public 公共区域拒绝流入的流量,除非与流出的流量相关。允许ssh dhcpv6-client服务通过
external 外部区域拒绝流入的流量,除非与流出的流量相关。允许ssh服务通过
dmz 隔离区域/非军事区域拒绝流入的流量,除非与流出的流量相关。允许ssh服务通过
block 限制区域拒绝流入的流量,除非与流出的流量相关。非法流量采取拒绝操作,有响应消息
drop 丢弃区域拒绝流入的流量,除非与流出的流量相关。非法流量采取拒绝操作,无响应消息
拒绝流入的流量,除非与流出的流量相关。例如下载东西,需要先访问对方服务器,即流出。
此时对方会发送回复,即流入。此时就是流入与流出相关。

如果是对方发送一个请求,比如你的多年不联系的微信好友突然找你借钱一样,很突然,而且事先没有联系。这种就是只有流入的流量。

响应消息。即朋友突然找你借钱,你不借,跟他说没钱。这种就是拒绝操作,有响应消息。

如果朋友突然找你借钱,你假装看不见也不借给他。这种就是拒绝操作,无响应消息。

区域管理

  • firewall-cmd 防火墙管理工具,默认是临时操作

    • 用法:
    • 参数介绍:

      --get-default-zone 查看当前默认区域
      --get-zones 查看所有区域
      --list-all 查看当前区域配置
      --list-all-zones 查看所有区域配置
      --permanent 使操作永久生效
      --reload 重新加载配置,相当于 `systemctl reload firewall`
      --zone=区域 指定区域
      --add-service=服务名 指定服务
      --remove-service=服务名 移除服务
      --add-port=端口号/协议 添加指定协议上的端口
      --remove-port=端口号/协议 移除指定协议上的端口
      配置详情:
      [root@mkirin ~]# firewall-cmd --list-all
      public (active)
        target: default # 没有指定特定的目标规则集,可能是使用默认的规则集。
        icmp-block-inversion: no # 不反转 ICMP 阻塞规则,即不对 ICMP 进行特殊处理。
        interfaces: ens160 # 规则应用于 ens160 网络接口。
        sources: # 
        services: dhcpv6-client ssh # 允许通过防火墙的流量服务包括 SSH 和 DHCPv6 客户端。
        ports: # 没有特定端口被指定,这可能意味着允许所有端口的流量通过。
        protocols: # 没有指定特定的协议,这可能意味着允许所有协议的流量通过。
        masquerade: no # 不对流量进行伪装,即不修改数据包的源地址。
        forward-ports: # 没有指定端口转发规则,这可能意味着不进行端口转发。
        source-ports: # 没有指定源端口规则,这可能意味着允许所有源端口的流量通过。
        icmp-blocks: # 没有指定 ICMP 阻塞规则,这可能意味着 ICMP 流量不受阻碍。
        rich rules: # 没有提供详细的规则,通常用于指定更复杂的防火墙规则
防火墙放行
添加服务方式
  • 服务需必须存储在/usr/lib/firewalld/services目录中
  • 方法:firewall-cmd --zone=区域 --add-service=服务名
  • 示例

    1. 允许ftp通过防火墙
      firewall-cmd --zone=public --add-service=ftp
    2. 禁止ftp通过防火墙
      firewall-cmd --zone=public --remove-service=ftp
    3. 永久允许ftp通过防火墙
      firewall-cmd --permanent --zone=public --add-service=ftp
添加端口方式
  • 方法:firewall-cmd --zone=区域 --add-port=端口号/协议
  • 示例

    1. 允许tcp80端口通过防火墙
      firewall-cmd --zone=public --add-port=80/tcp
    2. 禁止tcp80端口通过防火墙
      firewall-cmd --zone=public --remove-port=80/tcp
    3. 允许udp80端口通过防火墙
      firewall-cmd --zone=public --add-port=80/udp
    4. 禁止udp80端口通过防火墙
      firewall-cmd --zone=public --remove-port=80/udp

防火墙开关

  • 查看防火墙状态
    systemctl status firewalld
  • 开启防火墙
    systemctl start firewalld
  • 关闭防火墙状态
    systemctl stop firewalld
  • 防火墙开机自启
    systemctl enable firewalld
  • 关闭防火墙开机自启(永久关闭防火墙)
    systemctl disable firewalld

Selinux

/etc/sysconfig/selinux selinux配置文件

  • 查看selinux是否运行
    getenforce
  • 临时设置selinux状态:0:关闭 1:开启
    setenforce 0
  • 永久关闭selinux

    1. vi /etc/sysconfig/selinux
    2. 找到SELinux=
    3. 将其改为SELINUX=disabled
    4. 保存配置文件,重启生效

进程管理

进程:
- 进程是已经启动的可执行程序的运行实例。 
- 是程序的运行过程。 
- 动态的,有生命周期以及运行状态

查看进程

静态查看进程
  • ps 进程查看指令

    用法:ps [参数]
    参数介绍
        a 只能查看系统里面运行的所有终端进程
        u 显示进程拥有者
        x 显示系统内所有进程S
        f 显示进程之间的父子关系
        -e 显示所有进程
        -f 展示完整格式
        -l 长格式展示

    1720843742979

    STAT 进程状态(了解)
    ? 表示没有占用终端
    R 运行
    S 可中断睡眠 sleep
    D 不可中断睡眠
    T 停止的进程
    Z 僵尸进程
    X 死掉的进程
    Sl 以线程的方式运行
    Ss s进程的领导者,也叫父进程
    R+ +表示进程组
    S< 优先级较高的进程
    SN N优先级较低的进程
    # 僵尸进程
    表示进程已经退出,但它的父进程还没有回收子进程占用的资源。 短暂的僵尸状态通常不必理会,但进程如果长时间处于僵尸状态,就应该引起注意,可能是引用程序没有正常处理子进程的退出。
    # S 可中断睡眠 Sleep ---- 类似于挂起,等待接受socket链接或者一些信号重新被唤起
    # D 不可中断睡眠 --- 不可被打断,表示进程正在和硬件进行交互,为了保护进程数据和硬件数据一致,系统不允许其他进程中断这个过程。 进程长时间处于不可中断状态,通常表示系统的IO(内存与磁盘的交互)性能有问题
    # 主进程和工作进程(子进程): 主进程的主要作用是读取和评估配置文件,以及维护工作进程。 工作进程用于执行请求。
动态查看进程
  • top 动态展示信息,三秒刷新一次

    用法:top
    内置命令介绍:
        h 帮助
        > 往下翻页
        < 往上翻页
        M 按照内存占用排序
        P 按照cpu占用排序
        q 退出
        z 彩色展示
    示例:
查看单个进程的PID
  • ps -ef | grep '进程名或PID'

    示例:
        1. 查看nginx的进程PID
            ps -ef | grep 'nginx'
  • 查看pid文件

        1. 查看httpd的PID
            cat /var/run/httpd/http.pid
            # 会输出pid,但是PID每次开启进程,都会变化
        2. 查看nginx的pid
            cat /usr/local/nginx/logs/nginx.pid 
            # 获取pid的效率比 ps aux 效率高

管理进程

杀死进程
  • kill

    用法:kill [参数] pid
    参数介绍:
        -l 查看所有信号参数
    常见信号:
        -1 重新加载进程或者重新加载配置文件
        -9 强制杀死
        -15 正常杀死(这个参数可以省略)
        -18 激活线程
        -19 挂起线程
    示例:
  • pkill

    用法:pkill [参数] pid
    参数介绍:
    示例:
查看端口占用
  • lsof 查看端口占用情况,与ps类似,配合grep使用

    安装方法:yum install lsof

    用法:lsof [参数]
    参数介绍:
    示例:
        1. 查看80端口占用
            lsof -i :80
  • netstat 查看网络进程和正在监听的端口,配合grep使用

    安装方法:yum install net-tools

    用法:netstat [参数]
    参数介绍:
        -l 只显示正在被监听的端口
        -p 显示进程的名称和 pid
        -n 以数字的形式显示协议名称
        -t 显示tcp
        -a 显示全部的进程
        -u 显示 udp
    示例:
  • ss 查看socket连接状态,与netstat类似

    用法:ss [参数]
    参数介绍:
        -l 列出所有打开的端口
        -p 显示进程的名称和 pid
        -n 以数字的形式显示协议名称
        -t 显示tcp
        -a 显示全部的进程
        -u 显示 udp
        -m 查看内存情况
        -s 显示socket摘要
    示例:

系统别名

  • alias 查看系统指令别名
  • alias 别名='实际命令名' 为某个命令起别名
  • type -a 别名 查看指定别名对应的命令
  • unalias 别名 取消某个别名

用户相关

  • logout 退出当前用户
  • /etc/passwd 保存用户相关信息
  • /etc/group 保存用户组相关信息
  • /etc/shadow 保存用户密码信息

用户

  • 用户

    • UID 用户唯一ID,等同于身份证号
    • GID 用户组唯一ID,等同于户口本号
    • root用户

      • UID root用户UID0
      • GID root用户GID0
    • 普通用户

      • UID1000开始,由超级管理员创建
      • GID1000开始
      • 普通用户在被创建时,会在系统中创建一个同名的组(主属组
    • 虚拟用户(系统用户)

      • UID 1~999
创建用户
  • useradd 创建用户,默认从1000开始递增(或者从当前最大值开始递增)

    用法:useradd [参数] 用户名
        - 新建用户的同时会自动构建一个属组(组名和用户名一样,也叫`主属组`)
        - 普通用户家目录位于`/home`目录下
    参数介绍:
        -u UID 指定UID,不允许重复值
        -s Shell 指定解释器版本
        -G 组名或GID 指定副属组,副属组需已存在
        -g 组名或GID 指定主属组,主属组需已存在
        -c 添加用户描述信息
        -d 指定用户登陆时的起始目录(家目录),如果把其他用户的家目录当成自己的,会导致其他用户命令提示符消失,且难以统一管理。
        -e 指定账户的过期时间
        -f 缓冲天数,密码过期后多少天关闭该账户
        -m 自动建立用户的登录目录
        -r 创建系统用户
        -D 参数 修改配置文件`/etc/default/useradd`的默认值
删除用户
  • userdel 删除用户

    用法:userdel [参数] 用户名
    参数介绍:
        -r 删除用户时同时删除家目录
修改用户
  • usermod 修改用户

    用法: usermod [参数] 用户名
        - 如果只修改用户名,则UID、GID、所属组不变
    参数介绍:
        -l 新用户名 将`旧用户名`修改成`新用户名`
        -g 新GID 将`旧GID`修改为`新GID`(更换主属组),新GID需已存在
        -u 新UID 将`旧UID`修改为`新UID`,不能重复
        -s shell解释器路径 修改用户的shell解释器版本
        -d 路径 修改用户家目录
查看用户信息
  • id 查看用户ID信息[uidunamegid副属组]
  • whoami 查看当前用户
  • w 展示当前已登陆的用户信息

    第一行显示的是系统时间,系统从启动到运行的时间,系统运行中的用户数量和平均负载
    第二行信息
    user 用户名
    TTY 用户使用终端号
    FROM 标识用户从哪来 [终端所在机器的 ip地址]
    LOGIN@ 登录系统的时间
    IDLE 代表终端空闲时间
    JCPU 该终端所有进行以及子进程使用系统的总时间
    PCPU 活动进程使用系统的时间
    WHAT 用户执行的进程名称
  • who 等同于w的简化版
  • lastlog 查看当前机器所有用户最近登录信息
用户密码
  • 密码

    • root用户可以给其他用户设置密码
    • 普通用户设置密码后才能登录
    • root用户可以随意设置密码
    • 普通用户设置密码需遵守规则
    • 普通用户限制出错重试3次
  • passwd 修改密码

    用法:passwd [参数] 用户名
    参数介绍:
        -n 至少多少天不可修改密码
        -x 最多多少天不可修改密码
        -w 密码过期前多少天通知用户
        -i 过期多久禁止用户登录
    示例:
        1. 设置user6的密码,7~60天内禁止修改密码,过期前三天提示,账户过期7天后禁止登录
            passwd user6 -n 7 -x 60 -w 3 -i 7
  • chpasswd 批量修改密码

    用法:chpasswd
        - 交互式窗口,修改格式 username:passwd
        - Ctrl^D 退出交互
        - 需要root用户使用
    示例:
        1. 设置user0~user10的密码为11223344
            chpasswd [回车]
            user0:11223344
            user1:11223344
            user2:11223344
            此处省略一些内容
            user10:11223344
            [Ctrl^D]
用户切换
  • su 用户 只切换用户身份,不切换环境变量
  • su - 用户 切换用户身份和环境变量
用户提权
  • sudo 临时获得root权限,可以执行一些普通用户没有权限执行的命令
加入sudo用户组
  1. vi /etc/sudoers ,找到以下行:

    ## The COMMANDS section may have other options added to it.
    ##
    ## Allow root to run any commands anywhere 
    root    ALL=(ALL)     ALL
  2. 参照格式,在root行后添加以下行
    用户名 ALL=(ALL) ALL
  3. 保存退出,重启系统生效。
用户创建流程
  1. 系统读取/etc/login.defs(用户定义文件)、/etc/default/useradd(用户默认配置文件),根据这两个文件定义的规则创建新用户
  2. /etc/passwd/etc/group文件添加用户信息,向/etc/shadow中添加用户密码,向/etc/gshadow中添加组密码
  3. 根据/etc/default/useradd文件创建新用户家目录
  4. /etc/skel中的所有文件复制到新用户的家目录
  • /etc/login.defs参数介绍

    MAIL_DIR    /var/spool/mail # 系统发送邮件的位置
    
    PASS_MAX_DAYS    99999 # 密码最长使用天数
    PASS_MIN_DAYS    0 # 密码最短更换时间
    PASS_MIN_LEN    5 # 密码最短长度
    PASS_WARN_AGE    7 # 密码失效前几天发出警告
    
    UID_MIN                  1000 # 新建普通用户最小UID
    UID_MAX                 60000 # 新建普通用户最大UID
    
    SYS_UID_MIN               201 # 新建系统用户最小UID
    SYS_UID_MAX               999 # 新建系统用户最大UID
    
    GID_MIN                  1000 # 新建普通用户组最小GID
    GID_MAX                 60000 # 新建普通用户组最大GID
    # System accounts
    SYS_GID_MIN               201 # 新建系统用户组最小GID
    SYS_GID_MAX               999 # 新建系统用户组最大GID
    
    CREATE_HOME    yes # 是否自动创建家目录
    
    UMASK           077 默认权限掩码
    
    # This enables userdel to remove user groups if no members     exist.
    #
    USERGROUPS_ENAB yes
    
    # Use SHA512 to encrypt password.
    ENCRYPT_METHOD SHA512 # 密码加密算法
  • /etc/default/useradd参数介绍

    # useradd defaults file
    GROUP=100
    HOME=/home # 在 /home 目录下 创建用户的家目录
    INACTIVE=-1 # 开启用户过期
    EXPIRE=
    SHELL=/bin/bash # 新用户默认的解释器
    SKEL=/etc/skel # 用户环境变量文件的存放目录
    CREATE_MAIL_SPOOL=yes

用户组

  • 用户组 方便管理同一组用户
  • GID 组与组之间区分
  • 用户与组的关系

    • 一对一 一个用户存在一个组里,一个组里只有一个用户
    • 一对多 一个用户可以加入多个组
    • 多对一 多个用户可以加入一个组
    • 多对多 多个用户可以存在多个组中
创建组
  • groupadd 创建组,默认从1000开始递增(或者从当前最大值开始递增)

    用法:groupadd [参数] 组名
    参数介绍:
        -g GID 指定GID,不允许重复值
修改组
  • groupmod 修改组信息

    用法:groupmod [参数] 组名
    参数介绍:
        -g 新UID 修改GID,不允许重复值,不允许小于1000
        -n 新组名 修改组名
删除组
  • groupdel 删除组,需要该组未充当用户的主属组才可以删除

    用法:groupdel 组名
        - 用户的主属组不能删除[创建用户时,会自动分配主属组(主属组和用户名相同)]
        - 若组内存在用户,该组不可删除
    示例:
        1. 创建test组
            groupadd test
        2. 创建demo组并设置gid
            groupadd -g 1002 demo
        3. 将test组的gid修改为1003
            groupmod -g 1003 test
        4. 将demo组的名字修改为DEMO
            groupmod -n DEMO demo
        5. 删除DEMO组
            groupdel DEMO
    练习:
        1. 新建用户组group01
            groupadd group01
        2. 新建用户组group02并指定gid为1111
            groupadd group02 -g 1111
        3. 将group01的组名修改为group11
            groupmod -n group11 group01
        4. 删除用户组group02
            groupdel group02
        5. 基于root用户新建文件/dir2/demo.txt练习vi编辑器指令
        6. 新建用户并指定shell解释器版本为/sbin/nologin
            useradd user01 -s /sbin/nologin
        7. 新建用户并指定主属组为user02副属组为 group11
            useradd user03 -g user02 -G group11
添加组成员
  • gpasswd 管理组成员

    用法:gpasswd [参数] 组名
    参数介绍:
        -a 用户 添加用户到组
        -M 用户1,用户2,用户3 添加多个用户到组
        -d 用户 从组中删除用户

主机相关

  • hostname 查看当前主机名
  • hostnamectl set-hostname 新主机名 修改当前主机名,重启生效

网络相关

  • ip aip addr 查看主机IP地址
  • wget 文件下载器

    - 默认将文件下载到当前目录下
    参数介绍:
        -O 路径 将文件保存到指定路径
  • curl 文件下载器

    参数介绍:
        -o 路径 将文件保存到指定路径

远程登陆

ssh

openssh-server 提供服务
openssh-clients 客户端
sshd服务默认的端口号:22
安装
1. 安装
    yum install openssh-server # 安装ssh服务端
2. 查看sshd启动状态
    systemctl status sshd # 查看sshd启动状态
3. 如果sshd未启动
    systemctl start sshd # 启动sshd
4. 关闭防火墙
    systemctl stop firewalld # 关闭防火墙
使用
用法:ssh [参数] 用户名@ip
参数介绍:
    -p 端口号 指定端口连接
示例:
    1. 连接到服务器192.168.119.20,用户名是root
        ssh root@192.168.119.20
证书与密钥
  • ssh生成密钥对

    ssh-keygen [回车]
        Generating public/private rsa key pair.
        Enter file in which to save the key (/root/.ssh/id_rsa): # 设置私钥保存位置
        Enter passphrase (empty for no passphrase): # 输入密码,回车代表密码为空
        Enter same passphrase again: # 再次输入密码
        Your identification has been saved in /root/.ssh/id_rsa. # 私钥保存位置
        Your public key has been saved in /root/.ssh/id_rsa.pub. # 公钥保存位置
        The key fingerprint is:
        SHA256:a+zSpj2nrjz9XgdBUiNYbN46BKg0Id309MRuqc3o09U root@mkirin # 密钥指纹
        The key's randomart image is:
        +---[RSA 2048]----+
        |  ...+...==.+    |
        |   .+ oooo++ .   |
        |   . o  .=.o.    |
        |    .     * ..   |
        |        SB ...   |
        |       .o.= ..E  |
        |       ++. o. .  |
        |     .o+B o. .   |
        |      +B=Bo      |
        +----[SHA256]-----+
修改配置
  • /etc/ssh/sshd_config sshd服务器配置文件
  • 端口号修改:

    1. 编辑/etc/ssh/sshd_config
      vi /etc/ssh/sshd_config
    2. 找到Port 22行,将该行前的#删除,修改22为指定的端口号
      Port 2222
    3. 保存文件
    4. 重启系统

硬件相关

  • init 0 切换运行级别为0,此级别代表关机
  • init 6 切换运行级别为6,此级别代表重启
  • shutdown -r [参数] 重启

    • shutdown -r 10 10分钟后重启
    • shutdown -r 0 立即重启
    • shutdown -r now 立即重启
  • shutdown -h [参数] 关机

    • shutdown -h 10 10分钟后关机
    • shutdown -h 0 立即关机
    • shutdown -h now 立即关机
  • reboot 重启
  • poweroff 关机,立即关闭系统并切断电源
  • halt 关机,立即关闭系统,但需要手动切断电源

Init等级

    0:停机或者关机(千万不能将initdefault设置为0)
    1:单用户模式,只root用户进行维护
    2:多用户模式,不能使用NFS(Net File System)
    3:完全多用户模式(标准的运行级别)
    4:安全模式
    5:图形化(即图形界面)
    6:重启(千万不要把initdefault设置为6)

时间相关

  • date 查看当前时间

    用法:date '+参数'
    参数介绍:
        %F 只查看当前日期的年月日
        %X 只显示当前时间的时分秒
        %s 从1970年1月1日0时0分0秒到 现在 过了多少秒
        %S 秒
        %c 直接显示日期与时间(年月日 星期 时分秒)
        %x 直接显示日期(年月日)
        %T 显示时分秒   HH:mm:dd[24小时]
        %r 显示时分秒[12小时]
        %p 显示上午还是下午
        %Z 显示时区
        %w 一周中的第几天
        %a 星期几(简写)
        %A 星期几
        %b 月份(简写)
        %B 月份()全称
    
        -s 时间 手动设置时间
  • ntp 网络校时

    • 安装
      yum install ntp
    • 使用
      ntpdate 时间服务器网址
    • 中国时间服务器 cn.pool.ntp.org

定时任务(计划任务)

后台运行,到了预定的时间就会自动执行的任务。
前提是,事先手动将计划任务设定好
例如:
    1. 周期性的任务执行
    2. 清空 /tmp 目录下的内容
    3. mysql数据库的备份
    4. redis数据备份

一次调度执行

  • at 定时任务工具,依赖于atd 服务 适用于执行一次就结束的调度任务。

    安装:yum install at
    systemctl status atd # 查看 atd 计划任务的开启状态
    systemctl start atd # 若服务未开启则手动开启
    用法:
      #方式一
        语法格式:
        1. at 时间 #回车
        2. 输入你的计划任务指令
        3. ctrl + D # 任务写完了
      # 方式二
        at 时间 < 文件
    参数介绍:
        -l 查看计划
        -d 删除计划
      时间细节:
        now+1min        # 一分钟以后
        now+10min        # 十分钟以后
        HH:MM            # 小时:分钟 10:30
        YYYY-mm-dd        # 年月日 2030-10-10
        noon            # 刚好中午12点
        midnight        # 刚好午夜12点
        teatime            # 下午茶时间 下午 4点
        tomorrow        # 明天
        now+1hours        # 一小时以后
        now+1minutes    # 1分钟以后
        now+1days        # 一天以后
        now+1weeks        # 一周以后
    示例:
        1. 新建文件,存储任务
            vim at.jobs
            填充内容:touch /test4/dir1/a.txt
            # 将任务设定时间指定
            at 10:30 < at.jobs
        2. 查看一次性任务
            atq 或者 at -l
        3. 取消计划任务
            atrm 序号 或者 at -d 序号
        4. 取消7号定时任务
            atrm 7 # 取消指定的计划任务

循环调度执行

Cron是Linux系统中以后台进程模式周期性的执行命令,
或者指定程序任务的服务软件名

Linux系统启动以后,cron软件就会开机自启。
默认是定期(每分钟检查一次)检查系统中是否有需要执行的任务计划。
如果有,则按照计划进行。类似于我们生活中定的闹铃
  • cron 定时任务工具

    # 安装 cronie 软件
    yum -y install cronie
    # 查看服务状态,确保服务开启
    systemctl status crond.service
    # 存储位置
    /var/spool/cron
    # 查看系统的循环调度任务
    `ll /etc | grep 'cron*'`
        cron.d            # 系统定时任务
        cron.daily        # 每天的任务
        cron.hourly        # 每小时的任务
        cron.monthly    # 每月的任务
        cron.weekly        # 每周的定时任务
    # 使用者权限文件
        /etc/cron.deny # 该文件中所列出的用户不允许使用 crontab命令
        /etc/cron.allow # 该文件中所列用户允许使用crontab命令,默认不存在,需要手动创建,可以忽略
        /etc/crontab # 系统计划任务
    
    用法:
      方式一:
        crontab -e
            50 21 * * * touch a.txt # 在crontab的编辑器中编写任务指令
      方式二:
        # 1. 准备已经写好了指令的脚本文件(后缀是 .sh)
          vim /root/cronDemo.sh
          文件内容
            #!/bin/bash
            mkdir -p /test4/fileDemo
            touch /test4/fileDemo/a.txt
        # 2. 编辑周期计划任务
        crontab -e
            * * * * * bash /root/cronDemo.sh # 直接执行任务脚本
    参数介绍:
        -l # 列出当前用户的计划任务
        -r # 删除当前用户的所有计划任务
        -e # 编辑当前用户的计划任务
        -u # 管理其他用户的计划任务,仅限root管理员
    示例:
      使用其他用户创建周期计划任务
        1. 代替某个用户执行周期性计划任务
            crontab -u 用户名 -e # 基于root用户
        2. 查看某个用户的计划任务
            crontab -u 用户名 -l
        3. 删除指定用户的周期性计划任务
            crontab -u 用户名 -r

    1720965769396

cron时间参数介绍(从左向右):* * * * * bash /root/cronDemo.sh

分钟小时指令
0-590-231-311-120-7,其中0和7都代表星期天cmd
*****bash /root/cronDemo.sh
支持的符号描述备注
*代表任何可能的值
-定义一个范围
,分隔数值列表
/指定数值的增量
L表示月份的最后一天或星期几的最后一个
W表示最接近指定日期的工作日
#用于指定月份中的第几个星期几当前cron不一定支持
cron演示
分钟小时指令描述
0002***指令1每天 凌晨2点整 执行指令1
00021**指令2每个月的 1号 凌晨2点整 执行指令2
0002142*指令3每年的 2月 14号 凌晨2点整 执行指令3
0002**7指令4每周日 凌晨2点整 执行指令4
0002*65指令5每年 6月的 周五 凌晨2点整 执行指令5
00021,5,8**指令6每个月的 1号,5号,8号 凌晨2点整 执行指令6
00021-8**指令7每个月的 1号到8号 凌晨2点整 执行指令7
008-14*3指令8每个月 第二个 星期三 执行指令8

日志

Linux系统日志对于程序员来说,是了解系统运行的主要途径,因此需要对Linux日志系统有一个详细的了解。
Linux系统内核和许多程序在工作中都会产生各种错误信息、警告信息、其他的一些提示信息,
这些信息都记录在各自的日志文件中, 完成日志记录的过程需要使用的程序rsyslog 
rsyslog可以根据日志的类别和优先级将日志保存到不同的文件中

常见的日志文件(系统,进程,应用程序)

  • 系统主日志 /var/log/messages
  • 认证与安全日志 /var/log/secure
  • 邮件日志 /var/log/maillog
  • cron日志 /var/log/cron
  • 系统启动日志 /var/log/dmesg
  • yum日志 /var/log/yum.log
# 动态查看系统主日志文件的尾部
tail -f /var/log/messages
# 记录认证,安全的日志
tail -f /var/log/secure
# 跟邮件相关 postfix
tail -f /var/log/maillog
# crond at进程产生的日志
tail -f /var/log/cron
# 系统启动相关
tail -f /var/log/dmesg
# yum相关的日志
tail -f /var/log/yum.log

日志优先级

日志级别分为: 9种 日志级别代号 0 ~ 7
    0 debug        # 记录调试信息 日志信息最多
    1 info        # 一般信息的日志 最常用
    2 notice    # 最具有重要性的信息
    3 warning    # 警告信息
    4 error        # 错误级别 阻止某个功能或者软件 正常工作的信息
    5 crit        # 严重错误级别 阻止整个系统或者整个软件正常工作的信息
    6 alert        # 需要立刻修改的信息
    7 emerg        # 内核崩溃等严重信息
    none        # 什么都不记录

日志轮转与切割

1. 如果没有日志轮转,日志文件会越来越大
2. 可以丢掉系统中旧文件,节省空间
3. 可以针对日志文件进行分割,如:按照大小分割:10MB/个 按照时间轮转:1天/次,1周/次
  • logrotate

    • 配置文件位置:/etc/logrotate.conf

    1720966968145

    具体信息参考上图,代码参考以下内容
    
    weekly        # 轮转周期
    rotate 4    # 保留4份
    create        #轮转后创建新文件
    dateext        # 使用日期作为新文件后缀
    include /etc/logrotate.d # 包含该目录下的配置文件
    /var/log/wtmp { # 对指定日志文件设置轮转方法
      monthly # 一月一次
      create 0664 root utmp # 轮转后创建新文件并且设置权限
      minsize 1M # 最小大小1M才轮转,否则即使到时间也不轮转
      rotate 1 # 保留一份
    }
    /var/log/btmp {
      missingok # 允许丢失,丢失不提示
      monthly
      create 0600 root utmp
      rotate 1
    }
    
    用法:
    参数介绍:
      -d, --debug :debug 模式,测试配置文件是否有错误。
      -f, --force :强制转储文件。
      -m, --mail=command :压缩日志后,发送日志到指定邮箱。
      -s, --state=statefile :使用指定的状态文件。
      -v, --verbose :显示转储过程。
    示例:
      1. 轮转日志/var/log/yum.log
      cat /etc/logrotate.d/yum
        文件内容:
          /var/log/yum.log {
              missingok # 丢失不提示
              notifempty # 空文件不轮转
              maxsize 30k # 到达30K就轮转,无论是否到时间
              yearly # 每年一次
              create 0600 root root # #轮转后创建新文件且设置权限
          }
      2. 手动轮转
          logrotate -f 轮转配置文件
          案例:配置 nginx的日志轮转
              access.log
              error.log
              #1. 在 /etc/logrotate.d/ 创建一个文件 nginx
              #2. 文件内容
              /usr/local/nginx/logs/*.log{
                  missingok
                  notifempty
                  daily
                  size 100k
                  create 0600 root root
              }

文件存储

磁盘分区方式

注意: 从MBR分区转到GPT分区(或者反过来)是可以的,但是数据会全部丢失

MBR

MBRMSDOS根据分区表来指定分区规则,叫做主引导记录)

  • 大小:<2TB
  • 分区工具:fdisk
  • 分区限制:一共可以划分14个分区(主分区、扩展分区、逻辑分区),例如 3主 + 1扩展 + 逻辑分区
  • 一块硬盘最多4主分区
  • 一块硬盘最多1拓展分区
GPT

GPTGUID分区表)

  • 大小:>2TB
  • 分区工具:gdisk
  • 分区限制:一共可以划分128个主分区

分区工具

  • fdisk MBR分区工具

    • 安装:yum install util-linux

      用法:fdisk [参数] 路径
      参数介绍:
      -l 列出分区表
      内置命令:
      m 帮助
      n 创建新分区
      d 删除分区
      w 将更改写入磁盘并退出
      q 退出不保存
      a 活动分区标记/引导分区
      l 显示分区类型
      p 显示分区信息
      t 设置分区号
      v 进行分区检查
      示例:
      1. 列出分区表
          fdisk -l
      2. 创建分区
        fdisk /dev/nvme0n2
          欢迎使用 fdisk (util-linux 2.23.2)。
      
          更改将停留在内存中,直到您决定将更改写入磁盘。
          使用写入命令前请三思。
      
          Device does not contain a recognized partition table
          使用磁盘标识符 0xaf3e45ca 创建新的 DOS 磁盘标签。
      
          命令(输入 m 获取帮助):n
          Partition type:
             p   primary (0 primary, 0 extended, 4 free) # 主分区
             e   extended # 拓展分区
          Select (default p): p # 选择分区类型
          分区号 (1-4,默认 1):1 # 选择分区号
          起始 扇区 (2048-41943039,默认为 2048):2048 # 选择起始扇区,回车表示默认
          Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+1G # 选择结束扇区
          分区 1 已设置为 Linux 类型,大小设为 1 GiB
  • gdisk GPT分区工具,与fdisk使用方式基本相同

    • 安装:yum install gdisk

      用法:gdisk [参数] 路径
      参数介绍:
      内置命令:
      ?/help 帮助
      n 创建新分区
      d 删除分区
      w 将更改写入磁盘并退出
      q 退出不保存
      l 显示分区类型
      p 显示分区信息
      t 设置分区号
      v 进行分区检查
      示例:
      1. 创建分区
        gdisk /dev/nvme0n2
          GPT fdisk (gdisk) version 0.8.10
      
          Partition table scan:
            MBR: protective
            BSD: not present
            APM: not present
            GPT: present
      
          Found valid GPT with protective MBR; using GPT.
      
          Command (? for help): n
          Partition number (1-128, default 1): 1 # 选择分区号
          First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 34 # 起始扇区
          Information: Moved requested sector from 34 to 2048 in
          order to align on 2048-sector boundaries.
          Use 'l' on the experts' menu to adjust alignment
          Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +1G # 结束扇区
          Current type is 'Linux filesystem'
          Hex code or GUID (L to show codes, Enter = 8300): # 设置分区类型,回车表示默认
          Changed type of partition to 'Linux filesystem'

    分区格式化

  • mkfs

        用法:mkfs [参数] 路径
        参数介绍:
            -t 格式 指定内容格式,默认为`ext2`
        示例:
            1. 将 /dev/sdc1 格式化为 ext4 格式的 文件系统
                mkfs -t ext4 /dev/sdc1
            2. 将 /dev/sdc2 格式化为 xfs 格式的文件系统
                mkfs -t xfs /dev/sdc
  • mkfs.[格式]

        用法:mkfs.[格式] [参数] 路径
        格式介绍:
            ext4 使用ext4格式
            xfs 使用xfs格式
            fat 使用fat格式
        参数介绍:
            -c 格式化前检查分区是否有坏块
        示例:
            1. 将 /dev/sdc1 格式化为 ext4 格式的 文件系统
                mkfs.ext4 /dev/sdc1
            2. 将 /dev/sdc2 格式化为 xfs 格式的文件系统
                mkfs.xfs /dev/sdc

分区挂载

  • mount 临时挂载,断电失效

    用法:mount [参数] 源路径 目标路径
    参数介绍:
    示例
        1. 挂载/dev/sda到/mnt目录
            mount /dev/sda /mnt
  • fstab 分区表配置,开机自动挂载

    • /etc/fstab 配置文件位置

      fstab参数介绍:
      <设备>  <挂载点>  <文件系统类型>  <挂载选项>  <dump 备份>  <fsck 启动检查>

      示例:

设备挂载点文件系统类型挂载选项dump 备份fsck 启动检查
/dev/mapper/centos-root/xfsdefaults00
UUID=a50ffbf4-0817-4619-b993-9826ea53643a/bootxfsdefaults00
/dev/mapper/centos-swapswapswapdefaults00
  • 开机自启动脚本挂载

    • /etc/rc.d/rc.local 开机自启动脚本,注意需要有执行权限

      • 编写mount挂载命令放入其中,即可实现开机挂载

        #!/bin/bash
        # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
        #
        # It is highly advisable to create own systemd services or udev rules
        # to run scripts during boot instead of using this file.
        #
        # In contrast to previous versions due to parallel     execution during boot
        # this script will NOT be run after all other services.
        #
        # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
        # that this script will be executed during boot.
        
        touch /var/lock/subsys/local
        mount /dev/sda /mnt # 挂载/dev/sda到/mnt目录

磁盘查看

  • lsblK 查看磁盘分区
  • blkid 查看磁盘UUID

    用法:blkid [参数] 路径
    参数介绍:
    示例:
        1. 查看分区/dev/sdc1的UUID
            blkid /dev/sdc1

文件与目录

Linux文件目录组成

/
├── boot 存放系统内核与启动文件
├── dev 存放硬件设备相关信息
├── etc 存放系统配置文件
│   ├── resolv.conf 设置域名解析
│   ├── hostname 设置主机名
│   ├── motd 设置开机提示语
│   ├── os-release 查看发行版和版本号
│   └── sysconfig
│       └── network-scripts
│           └── ifconfig-xxx 设置网络环境,如动态IP等
├── home 普通用户的主目录
├── media 可卸载的存储介质挂载点
├── mnt mount文件的临时挂载点
├── opt 应用程序包的安装目录
├── proc 系统内存的映射目录,提供内核与进程信息
├── root 特权用户目录
├── run 存放组件运行时所需文件[文件夹]
├── srv 存放组件运行时所需文件
├── temp 存放临时文件
├── usr 存放用户程序
└── var 存放运行时内容会改变的文件,如日志等
特殊文件
  • /dev/null 黑洞文件,只进不出。
  • /dev/zero 提供无限空字符(0x00)

文件分类

    -:普通文件
    d:目录文件
    l:链接文件
    b:块设备文件
    c:字符设备文件
    p:管道文件
    s:socket套接字文件

文件路径

绝对路径
    /文件
    /文件夹/文件

    /mysql.rpm # 根目录下的mysql.rpm
    /root/mysql.rpm # root目录下的mysql.rpm
相对路径
    ./    当前目录
    ../    上级目录

    ./mysql.rpm # 当前目录下的mysql.rpm
    ../mysql.rpm # 上级目录下的mysql.rpm

创建目录

  • mkdir 创建文件夹

    • mkdir /path/{a,b,c} 一次创建指定数量个文件夹
    • mkdir /path/{1..n} 一次创建n个文件夹

      用法:mkdir [参数] 文件夹(包含路径)
      参数介绍:
      -p 递归创建文件夹
      -v 显示详细创建信息

创建文件

  • touch 创建普通文件;修改文件时间

    • touch /path/{file1,file2,file3} 一次创建指定数量个文件
    • touch /path/file{1..n} 一次创建n个文件

      用法:touch [参数] 文件(包含路径)
      参数介绍:
      -t [年月日时分] 修改创建时间为指定的年月日时分
      -r [file1] 将目标文件的创建时间修改为file1相同
      -v 显示详细创建信息
      案例:
      1. 修改filez.png时间为当前系统年份的7月6号16时30分
          touch -t 07061630 filez.png # 年份为空,自动调用系统当前年份
      2. 修改filez.png时间为2025年7月6号16时30分
          touch -t 202507061630 filez.png

删除文件或文件夹

  • rm 删除文件或文件夹

    用法:rm [参数] 文件或目录
    参数介绍:
        -i 删除时询问
        -r 删除目录,不加该参数只能删除文件
        -f 强制执行,不显示提示信息
        -v 显示详细删除信息

复制文件或目录

  • cp 复制文件或文件夹

    用法:cp [参数] 源文件 目标文件
    参数介绍:
        -i 覆盖前询问
        -r 递归复制目录和子文件
        -f 强制执行,不显示提示信息
        -v 显示详细复制信息
        -d 复制的时候保持软链接
        -p 完全复制,包括权限时间戳等与原文件相同
        -a 等价于使用-pdr

移动文件或目录

  • mv 移动文件或目录;重命名文件或目录

    用法:mv [参数] 源路径 目标路径
    参数介绍:
        -i 覆盖前询问
        -f 强制执行,不显示提示信息

查看文件或目录

  • pwd 查看当前工作目录
  • ls 列出文件夹下内容,隐藏文件默认不展示。

    用法:ls [参数] 路径
    参数介绍:
        -a 列出指定路径下所有内容,包括隐藏文件
        -l 列出指定路径下文件的详细信息
        -h 配合-l使用,查看文件详细大小
        --full-time 查看详细时间
        -t 按照最后一次修改时间降序排序。
        -F 在不同文件结尾输出不同符号,如:
            文件夹后是 /
            可执行文件后是 *
            软链接后是 @
            . 开头的是隐藏文件
            普通文件无后缀
        -d 只列出指定文件夹信息
        -r 逆转排序
        -S 从大到小排序
        -i 显示文件inode编号

    1720623288875

  • stat 查看文件详细信息(访问和修改时间、属性改变时间)
  • file 查看文件类型

文件内容查看

  • cat 查看文件内容

    用法:cat [参数] 文件
    参数介绍:
        -n 显示行号
        -A 显示标记符号(制表符、换行符等)
  • head 查看文件头部内容,默认是10行

    用法:head [参数] 文件
    参数介绍:
        -数字 查看文件头部指定数量行的内容
  • tail 查看文件尾部内容,默认是10行

    用法:tail [参数] 文件
    参数介绍:
        -数字 查看文件尾部指定数量行的内容
        -f 用于动态变化的文件,Ctrl^C退出监测
  • grep 查找、过滤文件内容关键字

    用法:grep '参数' 文件
    参数介绍:
        ^字符串 以字符串开头的行
        字符串$ 以字符串结尾的行
        -n 查看行号
        -i 不区分关键字大小写
        -E 开启ERE正则表达式拓展
        -v 反向查找,只打印不匹配的行
        -w 只显示全字符合的列
    用例:
        1. 过滤带有root的行
            grep 'root' /etc/passwd
        2. 过滤以root开头的行
            grep '^root' /etc/passwd
        3. 过滤以nologin结尾的行
            grep 'nologin$' /etc/passwd
  • less 分页查看内容比较大的文件,按q退出

    用法:less 文件
    功能说明:
        空格 翻页
        回车键 下一行
        方向键↑↓ 上下滚动
        /关键字 在文件中查找关键字并高亮显示
        n 搜索时上翻
        N 搜索时下翻
  • more 分页查看文件,看完自动退出,窗口底部展示百分比

    用法:more 文件
    功能说明:
        空格 翻页
        回车键 下一行
  • echo 字符串 输出指定字符串,默认输出到当前控制台

文件内容切割

  • cut 提取文件片段

    用法:cut [参数] 文件
    参数介绍:
        -c 提取指定位置的字符
        -d 符号 指定分隔符符号,默认分隔符是空格
        -f 与-d连用,置顶显示区域,与-c作用类似
    示例:
        1. 提取每行第四个字符
            cut -c 4 /etc/passwd
        2. 提取每行第4~8个字符
            cut -c 4-8 /etc/passwd
        3. 提取每行前8个字符
            cut -c -8 /etc/passwd
            cut -c 1-8 /etc/passwd
        4. 提取每行第8个到末尾的字符
            cut -c 8- /etc/passwd
        5. 提取每行第4、6个字符
            cut -c 4,6 /etc/passwd
        6. 提取每行第1-3、6-8个字符
            cut -c 1-3,6-8 /etc/passwd
        7. 以':'为分隔符切割,保留第1段
            cut -d : -f 1 /etc/passwd
        8. 以':'为分隔符切割,保留第1~3段
            cut -d : -f 1-3 /etc/passwd

文件排序与去重

  • sort 按照制定规则对文件进行排序

    用法:sort [参数] 文件
    参数介绍:
        -b 忽略前导的空白区域
        -n 根据字符串数值比较,默认升序
        -r 反转排序
        -u 去重排序,与-c连用
        -t 分隔符 指定分隔符,默认是空格
        -k [位置1,位置2] 指定某个排序规则的作用域:位置1~位置2
    示例:
        1. 对IP第4段(主机号)进行排序
            sort -n -t '.' -k 4 ./ip.txt
        2. 对1.txt进行升序去重排序
            sort -n -u ./1.txt
    
        1.txt 内容:
            0 a
            1 c
            2 s
            3 a
            4 f
            5 e
            6 g
            0 a
            7 b
            8 h
            9 y
            0 u
            9 j
            7 k
            0 a
            5 i
            4 o
            2 l
            9 y
            1 p
        ip.txt 内容
            192.168.10.1
            192.168.10.20
            192.168.10.15
            192.168.10.2
            192.168.10.3
            192.168.10.5
            192.168.10.2
            192.168.10.3
            192.168.10.7
            202.184.250.20
            138.4.52.61
  • uniq 输出或忽略文件中的重复行,只能去除连续的相邻行。一般与sort连用

    用法:uniq [参数] 文件
        1.排序排序命令进行排序
        2.使用uniq命令去重或统计
    参数介绍:
        -c 统计每一行的重复次数(连续相邻行)
        -d 统计出现两次及以上的行
        -u 统计只出现一次的行
    示例:
        1. 对sort排序后的输出进行去重
            sort -n ./1.txt | uniq
        2. 对sort排序后的输出进行重复次数统计,统计每一行
            sort -n ./1.txt | uniq -c
        3. 对sort排序后的输出进行统计,只统计重复行
            sort -n ./1.txt | uniq -c -d
        4. 对sort排序后的输出进行统计,只统计重复一次的行
            sort -n ./1.txt | uniq -c -u
        5.查看哪些IP被占用
            sort -n -t '.' -k 4 ./ip.txt | uniq -c -d
        6.查看哪些IP处于空闲状态
            sort -n -t '.' -k 4 ./ip.txt | uniq -c -u

文件编辑

vi的文本模式

  • 工作模式
  • 命令模式 [ESC]

    • 无法编辑
    • 只能查看
  • 编辑模式 [i,a,A,o,O]

    • 可以编辑
    • 可以查看
  • 尾行模式 [:]

    • 保存文件
    • 退出编辑器
  • 可视模式 [ESC,Shift^v,Ctrl^v]

    • 可视块
    • 可视行

vi模式转换图

  • vi 系统默认的文本文件编辑器
  • vim 高级文本编辑器,编辑器之神

    用法:vi 文件
    功能说明:
        1. 进入编辑模式
            i 在光标处进入编辑模式
            a 在当前光标后面进入编辑模式
            A 在光标所在行的行尾进入编辑模式
            o 在光标下一行进入编辑模式
            O 在光标上一行进入编辑模式
        2. 命令模式
          光标定位:
            方向键 ↑ ↓ ← →
            按键 h(←) j(↓) k(↑) l(→)
            0 回到行首(等同于HOME按键)
            $ 回到行尾(等同于END按键)
            gg 回到页面左上角(文本顶部)
            G 回到页面右下角(文本底部)
            3G 进入第3行 4G(进入第四行)
            /关键字 查找关键字
            n 跳转到下一个搜索结果
            N 跳转到上一个搜索结果
          复制:
            yy 复制当前行
            3yy 从光标处复制3行 5yy(从光标处复制5行)
            ygg 从当前光标复制到页首(区域复制)
            yG 从当前光标复制到页尾(区域复制)
          粘贴:
            p 粘贴剪贴板到本行下方
            P 粘贴剪贴板到本行上方
          删除
            dd 删除光标所在行(向下删除)
            3dd 从光标处向下删除3行 5dd(从光标处向下删除5行)
            dgg 从当前光标删除到页首(区域删除)
            dG 从当前光标删除到页尾(区域删除)
            d^ 删除光标所在位置到行首之间的内容(光标到行首)
            x 删除光标处的内容
            D 删除光标所在位置到行尾之间的内容(光标到行尾)
            u 撤销
          替换:
            r 替换修改光标处的字符
        3. 尾行模式
            : 进入尾行模式
            :3 进入第三行
            :w 保存
            :q 退出
            :q! 强制退出不保存
            :wq 保存并退出
            :wq! 强制保存退出
        4. 可视化模式
            Ctrl^v 可视块模式
            Shift^v 可视行模式
        5. 查找替换
            :s/原内容/新内容/ 替换光标所在行的原内容为新内容,只匹配替换一次
            :3 s/原内容/新内容/ 替换第3行的原内容为新内容,只匹配替换一次
            :1,3 s/原内容/新内容/ 替换第1~3行的原内容为新内容,只匹配替换一次
            :% s/原内容/新内容/ 替换所有行的原内容为新内容,只匹配替换一次
            :% s/原内容/新内容/g 替换所有行的原内容为新内容,全部匹配替换
        6. 设置环境
            :set nu 设置行号
            :set nonu 取消设置行号
            :set list 显示控制字符,可以查看筛选带行尾空格的行
  • emacs 高级文本编辑器,神的编辑器

文件权限

权限分类

权限分配所有者所属组其他用户
权限项执行执行执行
字符表示rwxrwxrwx
数字表示421421421
  • chmod 设置文件权限

    • 对软链接的修改只影响软链接自身,与原文件无关

      用法:chmod [参数] 文件或目录
      参数介绍:
      u 所有者
      g 所属组
      o 其他人
      a 所有人
      + 添加权限
      - 撤销权限
      = 只留下某个权限,其他权限撤销
      r 读权限
      w 写权限
      x 执行权限
      数字 三位数字,如777、755等代表权限的数字
      -R 递归设置权限
  • chown 设置所属用户/组

    用法:chown [参数] 路径
        - chown 用户 文件 修改所有者
        - chown :组 文件 修改属组
        - chown 用户:组 文件 修改所有者和所属组
    参数介绍:
        -R 递归设置权限
        -v 显示详细信息
  • chgrp 修改属组

    用法:chgrp [参数] 文件或文件夹
        -c 只输出改变的部分的详细信息
        -v 输出全部详细信息
        -h 只对符号链接的文件进行修改
        -R 递归设置权限
        -f 不显示错误信息
  • umask 权限掩码,用于限制新文件权限

    • 新文件被创建时,最初的权限由umask决定
    • 用户每次进入系统时,umask命令都会被执行并自动设置掩码,改变新建文件初始的权限
    • umask只对当前终端有效,如需永久保存,请写入脚本

      计算方法: 777 - mask掩码值 = 新文件权限
      用法:umask [参数] 权限掩码
      只输入umask,会展示当前掩码值
      参数介绍:
      -S 以字母形式显示权限掩码
      -p 以数字形式展示 umask
  • chattr 更改文件的扩展属性,比chmod更改权限更底层

    用法:chmod [参数] 文件
    参数介绍:
        -R 递归设置权限
        -v 显示详细信息
    
        + 添加模式
        - 移除模式
        = 指定模式
        a 只能向文件中添加数据,不得删除
        A 不让系统修改文件最后访问时间
        i 文件不能被删除,改名,修改内容
    示例:
        1. 给 d.txt 增加 i 模式
            chattr +i d.txt
                rm -f d.txt # 删除失败
        2. 查看 d.txt 的模式
            lsattr d.txt
                -------i------ d.txt
        3. 取消 i 模式
            chattr -i d.txt
        4. 查看 d.txt 的模式
            lsattr d.txt
                ------------- d.txt
        5. 演示 a 模式:只能向文件中增加内容 不得更改
            chattr +a a.txt
                echo "测试数据" > a.txt # 覆盖源数据
                -bash: a.txt: 不允许的操作
            echo "测试数据" >> a.txt # 可以追加数据
  • lsattr 用于查看文件的第二扩展属性(看底层模式),与chattr结合使用

    用法:lsattr [参数] 路径
    参数介绍:
    -R 递归列出目录以及子目录下的 chattr设置的模式 该参数默认存在
    -V 显示程序版本
    -v 显示文件版本
    -a 列出目录中的所有文件 包括隐藏文件的属性
    -d 只列出当前目录的模式 不展示子目录的模式

文件查找

参考章节:文件分类

  • find

    用法:
    find 路径 [参数] 
    参数介绍:
        -P 路径 要查找的路径,可省略
        -maxdepth 深度 查找是搜索的最大深度
        -mindepth 深度 查找是搜索的最小深度
        -atime 时间 按照文件访问时间查找 
            -n n天内访问过
            n 正好n天访问过
            +7 超过n天前访问过
        -ctime 时间 按照文件的改变状态查找
        -mtime 时间 按照文件修改时间查找
        -name 名字 按照文件名查找
        -group 按照文件的所属组查找
        -perm 按照文件的权限查找
        -size 大小[后缀] 按照文件按大小查找
            b 位
            c 字节
            w 字[2字节]
            k KB
            M 兆
            G 千兆
        -type 类型 查找指定类型文件,参考文件分类章节
            b 块设备
            d 目录
            c 字符设备
            p 管道文件
            l 符号链接
            f 普通文件
            s socket文件
        -user 按照文件所有者进行查找
        -path 路径 配合-prune 排除指定目录
        -prune 使find不在指定目录中查找
        -delete 删除找出的文件
        -exec 命令 {} \; 对匹配的文件执行相应的shell命令,在执行后续shell命令时不提示
        -ok 命令 {} \; 同上,在执行后续shell命令时会提示
        -print 将匹配的结果标准输出
        ! 取反
        -a 取交集,与`&&`类似
        -o 取并集,与`或`类似
    示例:
        1. 排除指定目录/dev
            find / -path '/dev' -prune -o -name 'nvme*' -print
        2. 排除多个目录/dev /sys /usr 写法: \( -path -o -path \)
            find / \( -path '/dev' -o -path '/sys' -o -path '/usr' \) -prune -o -name 'nvme*' -print
        3. 查找指定文件并查看权限属性 -exec
            find /root -type f -name 'mysql.rpm' -exec ls -al {} \;
        4. 带提示的查看权限属性操作 -ok
            find /root -type f -name 'mysql.rpm' -ok ls -al {} \;

    time

文件计数

  • wc 统计文件行数、单词数、字节数

    用法:wc [参数] 文件 
    参数介绍:
        -c 打印字节数
        -m 打印字符数
        -l 打印行数
        -L 打印最长行的长度
        -w 打印单词数
    常用命令:
        1. 统计在线用户数
            who | wc -l

文件链接

关联:查看文件或目录

软链接

指向元数据(inode),如果元数据被删除,则软链接将无法打开

硬链接

指向文件的实际存储位置,即使元数据被删除,也不影响硬链接的正常使用

  • ln 创建链接

    • 不加参数默认创建的是硬链接

      用法:ln [参数] 源路径 目标路径
      参数介绍:
      -s 创建软链接

link


输入输出

  • 0 标准输入(键盘)
  • 1 标准正确输出
  • 2 标准错误输出
  • 3~n 进程在执行过程中打开的其他文件
  • & 混合,表示正确错误混合输出

管道与重定向

管道
  • | 链接两条命令,将命令1的输出传递给命令2的输入

    用法:cmd1 | cmd2
  • xargs 通常与管道配合使用

    用法:
    参数介绍:
        -d 分隔符 指定分隔符
        -i 用`{}`代表查找出的文件
        -I str 用字符串代表查找出的文件
        -n 限制单个命令行的参数个数
    示例:
        1. 查找mysql.rpm并移动到/opt目录
            - find /root -type f -name 'mysql.rpm' | xargs -i mv {} /opt/
            - find /root -type f -name 'mysql.rpm' | xargs -I str mv str /opt/
  • tr 从标准输入替换、删除、缩减字符,输出到标准输出,关联:文件排序与去重

    用法:tr [参数] 内容
    参数介绍:
        -d 删除所有限定字符
        -s 去除连续重复限定字符
  • rev 反转输出的字符串顺序,与管道搭配使用

    示例:
        echo '123' | rev
        输出:321
  • history 查看终端执行命令的历史记录
重定向
输入重定向
  • < 重定向文件内容到输入
  • <<EOF 重定向<<EOFEOF之间的内容到输入

    示例:
    1. 重定向输入
        cat < redirect.txt
    ** 2. 通过重定向输入创建文件 **
        cat > redirect.txt <<EOF
        hello
        world
        EOF
        # 调用键盘输入,输入EOF结束输入
    2. 重定向错误输出
        ls 2> redirect.txt
    3. 重定向混合输出
        ls 2&1> redirect.txt
        ls &> redirect.txt
    4. 正确输出和错误输出分开存放
        ls 1> reok.txt 2> reerr.txt
    5. 只保留正确输出,错误输出丢弃
        ls 1> reok.txt 2> /dev/null
输出重定向
  • > 覆盖文件内容
  • >> 追加内容到文件尾

    示例:
    1. 重定向输出(默认只重定向正确输出)
       ls > redirect.txt
    2. 重定向正确输出
       ls 1> redirect.txt
    3. 重定向错误输出
       ls 2> redirect.txt
    4. 重定向混合输出
       ls 2&1> redirect.txt
       ls &> redirect.txt
    5. 正确输出和错误输出分开存放
       ls 1> reok.txt 2> reerr.txt
    6. 只保留正确输出,错误输出丢弃
       ls 1> reok.txt 2> /dev/null

文件打包

  • tar

    用法:tar [参数] 路径
    参数介绍:
        -c 打包文件
        -x 解压文件
        -z 使用压缩指令gzip,与-c或-x连用
        -j 使用压缩指令bzip2
        -v 显示详细信息
        -f 指定目标文件路径
        -A 把一个tar文件追加到另一个tar文件中
        -C 解压缩到指定目录
        -t 列出压缩包中的文件
        -d 记录文件差异
        -B 设置区块大小
        -r 追加文件至归档结尾
        -u 仅追加比归档文件中已有文件更新的文件
        -l 文件系统边界设置
        -k 解压时保留已有文件,不覆盖。
        -m 保留文件不被覆盖
        -w 确认压缩文件的正确性
        -p 保留原来的文件权限与属性
        --exclude 文件 排除指定的文件,其他文件解压缩
        --remove-files 删除原始文件
    示例:
        1. 打包/tmp路径
            tar -cvf tmp.tar /tmp
        2. 解压tmp.tar文件
            tar -xvf tmp.tar -C /
  • gzip 打包/解包.gz文件

    用法:gzip [参数] 路径
    参数介绍:
        -l 列出gz文件的文件信息
  • zip 打包.zip文件

    • 默认未安装,需要手动安装

      用法:zip [参数] 目标文件 路径
      参数介绍:
  • unzip 解压.zip文件包

    • 默认未安装,需要手动安装

      用法:unzip [参数] 路径
      参数介绍:
  • rar 打包.rar文件

    • 默认未安装,需要手动安装

      用法:rar [参数] 路径
      参数介绍:
  • unrar 解包.rar文件

    • 默认未安装,需要手动安装

      用法:rar [参数] 路径
      参数介绍:

通配符与正则表达式

通配符

符号描述
*匹配任意数量的任意字符
?匹配任意一个字符
^测试匹配测试开头的字符
测试$匹配测试结尾的字符
{1..100}1 2 3 .. 1001遍历到100
{1..99..2}1 3 5 7 7 9 ..991遍历到99,间隔为2
{1,2}1 2 输出12
[abcd]匹配abcd任意一个字符
[1-9]匹配1-9任意一个字符
[a-zA-Z]匹配a-zA-Z任意一个字符
[[:upper:]]匹配所有大写字符
[[:lower:]]匹配所有小写字符
[[:alpha:]]匹配所有字母,包括中文
[[:digit:]]匹配所有数字
[[:alnum:]]匹配所有数字和字符
[[:space:]]匹配所有空白
[^1-9]表示取反,^!相似
示例
1. 查找根目录下,最大文件深度是3,所有以l开头,以小写字母结尾,中间任意出现一个字符的文件
    find / maxdepth 3 -name 'l?[[:lower:]]' | rev | cut -d '/' -f 1 | rev
2. 获取/tmp目录下以任意一位数字开头,且以非数字结尾的文件
    find /tmp -name '[[:digit:]]*[[:alpha:]]' | rev | cut -d '/' -f 1 | rev
    find /tmp -name '[[:digit:]]*[^[:digit:]]' | rev | cut -d '/' -f 1 | rev
3. 获取根目录下以非字母开头,后面跟着一个字母以及其他任意长度字符的文件
    find / -name '[[:digit:]][[:alpha:]]*' | rev | cut -d '/' -f 1 | rev
4. 获取/tmp目录下所有以非字母开头的.txt文件,复制到/abc文件夹下
    find /tmp -name '[[:digit:]]*.txt' | xargs -i cp {} /abc
5. 获取 /tmp 目录下所有的 .txt 结尾的文件 且 以 1 或者2 开头
    find /tmp -name '[1,2]*.txt'
6. 

引号

  • ' 强引用,所见即所得,单引号中的内容会原样输出,指令失效转义字符失效
  • " 弱引用,能够识别各种特殊的符号:变量 转义字符 解析结果
示例:
    echo "$(date +%F)"
    输出:2025-07-15

    echo '$(date +%F)'
    输出:$(date +%F)

其他特殊符号

  • ; 分号,命令分隔符或是结束符,代表一条命令的结束
  • | 管道符,传递指令的执行结果到另一个指令,关联:管道与重定向
  • # 代表文件中的注释内容;root账户身份提示符
  • $ $变量表示取出变量中保存的值;普通用户的身份提示符
  • {} 生成序列;引用变量作为变量与普通字符的分隔

逻辑符号

  • && 符号,只有前一条命令执行成功,下一条命令才能执行
  • || 符号,如果前一条命令执行完,下一条命令就不执行
  • ! 符号

    • bash中取反 [!abcd]
    • vim 编辑中表达强制的含义 wq! q!
    • 找出最近执行的指令

      例如:
          !! 再次执行上一次的指令
          ! ls 列出最近一次 以 ls 开头的指令 并执行
          ! cd 列出最近一次 以 cd 开头的指令 并执行

正则表达式

BRE 基本正则表达式[basic regular expression]

BRE对应的元字符 ^ $ . [] *

符号描述
^用于模式匹配最左侧(开头)的行,如^gsc代表匹配以gsc开头的行
$用于模式匹配最右侧(结尾)的行,如gsc$代表匹配以gsc结尾的行
^$表示空行
.匹配任意一个且只有一个字符,不能匹配空行
\转义字符
*匹配符号前一个字符连续出现0次或多次,如a*代表匹配0个多个a
.*组合符 匹配所有内容[包含空行]
^.*组合符 匹配任意多个字符开头
.*$组合符 匹配任意多个字符结尾的内容
[abc]匹配[]集合内的任意一个字符 a b c 或者 [a-c]
[^abc]匹配除了a b c之外的任意字符,^表示对[abc]取反
ERE 拓展正则表达式[extended regluar expression]

EREBRE基础上增加了 () {} ? + |

符号描述
+匹配一个字符1次或多次,如a+代表匹配一个多个a
[ab]匹配[]中的字符1次或多次 例如[ab]+代表匹配ab一次多次
?匹配前一个字符1次或0次,如a?代表匹配1次0次a
|表示或者,同时过滤多个字符串,如a|b代表同时过滤ab
()分组过滤,()中的内容表示一个整体,如(abc)表示过滤abc
a{m,n}匹配a最少m次,最多n次;如a{3,5}代表匹配a最少3,最多5次`
a{m,}匹配a最少m次;如a{3,}代表匹配a最少3次,没有上限
a{,n}匹配a最少0次,最多n次;如a{,5}代表匹配a最少0次,最多5次
a{n}匹配a正好n次;如a{5}代表匹配a 5次
ERE拓展指令之 ()
小括号,将一个或者多个字符捆绑在一起,当做一个整体处理
  • 功能一
    分组过滤被括起来的内容,括号内的内容是一个整体
  • 功能二
    括号中的内容还可以被后面的\n引用,n代表数字,表示引用第几个括号的内容

    示例:
        `\1` 表示从左侧开始,第一个括号中的模式所匹配到的字符
        `\2` 表示从左侧开始,第二个括号模式所匹配的字符
BRE的使用
1. 列出 包含 "root" 的行及行号
        grep -n "root" demo.txt
2. 列出包含 "ROOT" 的行及行号
        grep -n "ROOT" demo.txt
3. 列出包含 root [不区分大小写]的行及行号
        grep -n -i "root" demo.txt
4. 列出不包含 "root"[无论大小写] 的行及行号
        grep -n -i -v "root" demo.txt
5. 列出包含 root 或者 love 的行及 行号
        grep -n "root|love" demo.txt # 这条命令会无输出,因为`|`属于ERE,必须使用 grep -E
        grep -n -E "root|love" demo.txt # 这条才是正确的命令
6. 列出 root 单词所在的行
        grep -n -w "root" demo.txt
7. 使用 grep 列出所有文件内容
        grep -n ".*" demo.txt
8. 列出注释行
        grep -n "^#" demo.txt
9. 列出空白行
        grep -n "^$" demo.txt
10. 列出所有的注释行和空白行
        grep -n -E "^#|^$" demo.txt
11. 排除所有的注释行和空行
        grep -n -E -v "^#|^$" demo.txt
12. 列出所有以 . 结尾的行
        grep -n "\.$" demo.txt
BRE的演示
1. 获取 demo.txt中所有以 H 开头的行
        grep -n "^H" demo.txt
2. 获取demo.txt 中所有以 i 开头的行
        grep -n "^i" demo.txt
        grep -n -i "^i" demo.txt # 忽略匹配规则字符的大小写
3. 获取文件中以 n 结尾的行
        grep -n "n$" demo.txt
4. 获取文件中以 . 结尾的行
        grep -n "\.$" demo.txt
5. 获取文件中的空行及行号
        grep -n "^$" demo.txt
6. 获取文件中非空行以及行号
        grep -n -v "^$" demo.txt
        grep -n -i "." demo.txt
7. 匹配模式是三位字符,其中后两位是 nu 第一位任意
        grep -n ".nu" demo.txt
8. 匹配模式是三位字符 其中中间是任意字符 两边是 f h
        grep -n "f.h" demo.txt
9. 匹配模式为 每行 不区分大小写的 i 出现 0 ~ n次
        grep -n -i "i*" demo.txt
10. 获取所有文件内容
        grep -n ".*" demo.txt
11. 匹配模式为 左侧为 I 右侧为 o 中间任意次数的任意字符
        grep -n "I.*o" demo.txt
12. 匹配模式为 出现 a b c 任意一个字符
        grep -n "[abc]" demo.txt
13. 匹配模式为 未出现 a b c 的任意字符
        grep -n -v "[abc]" demo.txt
14. 匹配非abc内容
        grep -n -v "abc" demo.txt
15. 匹配除了字符a b c的内容
        grep -n "[^abc]" demo.txt # 全选所有字符,除了a b c
16. 匹配不包含字符a b c的行
        grep -n -i -v "[abc]" demo.txt
16. 匹配模式为 出现 a ~ k 之间任意一个字符
        grep -n "[a-k]" demo.txt
17. 匹配模式为 出现 字母的行
        grep -n -i "[a-z]" demo.txt
        grep -n "[a-zA-Z]" demo.txt
18. 匹配所有数字的行
        grep -n "[0-9]" demo.txt
19. 匹配所有数字 所有字母
        grep -n "[0-9a-zA-Z]" demo.txt
        grep -n -i "[0-9a-z]" demo.txt
ERE的演示
1. 找出文件中包含 loe 或者 le 的行
        grep -E -n "lo?e" demo.txt
        grep -n -E  "loe|le" demo.txt
2. 找出文件中出现 1 ~ n 次 l 的行
        grep -E -n "l+" demo.txt
3. 获取文件中出现字符 a 或者 字符 b 的行
        grep -n "[ab]" demo.txt
        grep -n -E "a|b" demo.txt
4. 获取根目录下 所有 名字中包含 a 或者 b的 .txt 文件
        find / -type f -name "*.txt" | grep -E "a|b"
        find ./ -type f -name "*.txt" | grep -E '[^/]*[ab][^/]*\.txt$' 
        # 严格来说这个应该是对的,只匹配文件名包含a或b的文件,
        # 如果使用上一条命令,会存在路径中包含a或b,
        # 但是文件名不包含a或b的错误结果
5. 获取文件中的good glad
        grep -n -E "good|glad" ok.log
        grep -n -E "g(oo|la)d" ok.log
6. (l..e)匹配l在左侧,e在右侧,中间是任意两个字符:(l..e) ... (l..e)
        grep -n -E "(l..e).*\1" ok.log # \1 代表引用前面()的结果
7. 匹配字母a 最少 1次 最多 3次
        grep -E "a{1,3}" demo3.txt 
        # 即使HHDwhdhnaaaaaaaaaaaaaaa这样的结果也是 正确的,
        # 因为a{1,3} 表示:连续 1 到 3 个 a。
        # 只要某个子串满足这个条件,整行都会被匹配出来。
        # 所以 "HHDwhdhnaaaaaaaaaaaaaaa" 中,
        # 任意一段连续的 1~3 个 a(比如 "aaa" 或 "aa" 或 "a")都满足条件。
8. 匹配字母a 最少 2 次 最多 3次
        grep -E -o "a{2,3}" demo3.txt
9. 逐行匹配字母a 最少 4次
        grep -E -o "a{4,}" demo3.txt
10. 逐行匹配字母a 最多4次
        grep -E "a{,4}" demo3.txt
11. 逐行匹配字母a 恰好4次
        grep -E -o "a{4}" demo3.txt

Linux文本三剑客

grep
sed
  • sed 流编辑器,Stream Editor
  • 操作过滤转换文本内容

    用法:sed [参数] [匹配模式/内置命令] 文件
    参数介绍:
      -n 取消默认sed的输出,常与sed内置命令p一起用,不加-n则会输出一遍原始文件
      -i 直接将修改结果写入文件, 未使用-i,sed修改的只是内存数据(对文件数据没有影响)
      -e 多次编辑,不需要管道符
      -r 支持扩展正则表达式
    内置命令:用于对文件进行不同的操作,例如 增加,删除,修改,查询打印文件信息
      a append,对文本追加,在指定行`后面添加`一行或者多行文本
      d delete,删除匹配的行
      i insert 表示插入文本,在指定行`之前添加`一行或者多行文本
      p print 打印匹配行的内容 通常与参数`-n`一起用
      s/正则表达式/替换内容/g 或者 s#正则表达式#替换内容#g 批量替换内容
    示例:
      1. sed打印第2~5行的内容
          sed -n '2,5p' ok.log
      2. sed匹配并输出linux字符串
          sed -n '/linux/p' ok.log
      3. 删除games字符串的行
          sed -n '/games/d' ok.log
      4. 将文件中所有的a替换为g
          sed -n -i 's/a/g/g' ok.log
      5. 替换所有hes为my,同时把qq替换为88888888
          sed -i -e 's/hes/my/g' -e 's/qq/88888888/g'
      6. 在文件第二行追加内容并写入文件
          sed -i '2a hello world' ok.log
      7. 在文件第二行追加两行内容
          sed -i '2a hello world \nnihaozhangsan' ok.log
      8. 在文件每一行后都添加新内容
          sed -i 'a ---测试---' ok.log
      9. 删除每一行的内容
          sed -i 'd' ok.log
      10. 删除第2行的内容
          sed -i '2d' ok.log
      11. 删除第2~5行的内容
          sed -i '2,5d' ok.log
      12. 删除第2、5行的内容
          sed -i -e '2d' -e '5d' ok.log
      13. 删除第2~最后一行的内容
          sed -i '2,$d' ok.log
      14. 过滤ip地址所在的行
          ip a  | sed -n '9p' 
          # 9p是指定第9行(ens160)网卡的IP
      15. 只保留ip地址
          ip a  | sed -n '9p' | sed -e 's/.*inet.//g' -e 's/\/24.*//g'
          # inet 192.168.119.20/24 brd 192.168.119.255 scope global noprefixroute ens160
          # 删除inet包括前后的空格:s/.*inet.//g
          # 删除网段号/24及以后的内容:s/\/24.*//g
          # 这样写也是可以的:s#/24.*##g
awk
awk可以进行文本的格式化。 ---- 将文本数据格式化为专业的excel表样式
awk早期在Unix系统中使用,我们使用的 awk 实际是 gawk GUN awk。
awk也是一门编程语言,支持条件判断、数组、循环
用法:awk 可选参数 模式 {动作} 文件(或者数据)
注意:
    - 动作主要是指数据的"格式"化 ---- 最常用的动作 print 和 printf
    - awk默认的空格就是分隔符,且多个空格也会识别为一个空格并作为分隔符
    - awk按行处理,一行处理完毕,再处理下一行;根据用户指定的分隔符去工作,没有指定分隔符默认使用空格
    - 指定了分隔符,awk把每一行切割后的数据对应到内置变量中
参数介绍:
    -F 指定输入分隔符
    -v 定义或修改内置变量
    -f 从脚本文件读取awk指令
内置变量:
    $n 输出第几列,默认以空格分割
    $0 完整的输入记录,即输出全部内容,个人理解是$0表示一整行内容
    FS 输入字段分隔符,默认是空格
    OFS 输出字段分隔符 默认是 空格
    NF 分割后,当前行一共有多少列
    $NF 表示当前分割的最后一列
    $(NF-1) 表示分割后倒数第二列
    NR 当前记录数 ---- 多少行
    2 输出2
示例:
    1. 查看ok.log的内容
        awk '{print $0}' ok.log
    2. 查看第二列的内容
        awk '{print $2}' ok.log
    3. 查看第1、2、3列的内容
        awk '{print $1,$2,$3}' ok.log
    3. 查看第1、2、3列的内容,格式化输出
        awk '{print "第一行:",$1,"第二行:",$2,"第三行:",$3}' ok.log
    4. 打印3,有几行就打印几个
        awk '{print 3}' ok.log
        # 输出结果如下所示:如果有100行,就打印100行3,每行一个
        # 3
        # 3
        # 3
        # 3
        # 3
        # 3
        # 3
    5. 查看文件有多少行
        awk '{print NR}' ok.log 
    6. 给每一行添加行号
        awk '{print NR,$0}' ok.log
    6. 查看文件每行有几列
        awk '{print NF}' ok.log
    7. 查看文件最后一列
        awk '{print $NF}' ok.log
    8. 查看文件倒数第二列
        awk '{print $(NF-1)}' ok.log
    9. 输出第五行
        注意:
        NR==5 一个等号是赋值的含义 两个等号才是关系运算符
        awk 'NR==5' ok.log
    10. 输出第2~5行
        awk 'NR==2,NR==5' ok.log
    11. 指定分隔符 : ,获取用户名和UID
        awk -F : '{print $1,$3}' /etc/passwd
        awk -v FS=: '{print $1,$3}' /etc/passwd
使用正则表达式
    1. 指定输出分隔符 # ,分隔用户名和UID
        awk -v FS=: -v OFS=# '{print $1,$3}' /etc/passwd
    2. 获取以root开头的行并输出
        awk '/^root/{print $0}' /etc/passwd
    3. 获取以root开头的行并输出UID
        awk -F : '/^root/{print $3}' /etc/passwd
    4. 获取禁止登陆的用户信息
        awk '/\/sbin\/nologin$/{print $0}' /etc/passwd
    5. 获取禁止登录的用户的用户名
        awk -F : '/\/sbin\/nologin$/{print $1}' /etc/passwd
    6. 获取禁止登录的用户的用户名和UID,格式化输出
        awk -F : '/\/sbin\/nologin$/{print "用户名:",$1,"\t UID:",$3}' /etc/passwd
        awk -F : '/\/sbin\/nologin$/{printf "用户名:%-10s\t,UID:%-10s\n",$1,$3}' /etc/passwd # 这条指令用的C风格输出

Ansible

  1. 目标机器安装控制中心的ssh公钥
  2. 安装ansible的方式

    • pip安装
      pip install ansible
    • yum安装
      yum install ansible
    • 源码安装
    • docker安装
  3. 配置工作目录ansible_quickstart
    mkdir ansible_quickstart && cd ansible_quickstart
  4. 创建配置清单inventory.ini
    vi inventory.ini
  5. 添加myhosts组,指定目标机器的ip或域名,

    [myhosts]
    192.0.2.50
    192.0.2.51
    192.0.2.52
  6. 验证配置文件是否正确
    ansible-inventory -i inventory.ini --list
  7. ping测试ip或域名是否可用
    ansible myhosts -m ping -i inventory.ini
  8. 根据规模需求选择ini或者yml配置文件

    • ini

      [myhosts]
      192.0.2.50
      192.0.2.51
      192.0.2.52
    • yaml

      myhosts:
        hosts:
          my_host_01:
            ansible_host: 192.0.2.50
          my_host_02:
            ansible_host: 192.0.2.51
          my_host_03:
            ansible_host: 192.0.2.52
  9. 集群主机分组技巧

    • 拓扑结构分组
    • 地理位置分组
    • 按照开发阶段分组

创建元组

    metagroupname:
        children:
  • 示例:

      leafs:
          hosts:
              leaf01:
                  ansible_host: 192.0.2.100
              leaf02:
                  ansible_host: 192.0.2.110
    
      spines:
          hosts:
              spine01:
                  ansible_host: 192.0.2.120
              spine02:
                  ansible_host: 192.0.2.130
    
      network:
          children:
              leafs:
              spines:
    
      webservers:
          hosts:
              webserver01:
                  ansible_host: 192.0.2.140
              webserver02:
                  ansible_host: 192.0.2.150
    
      datacenter:
          children:
              network:
              webservers:

局部变量

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443

全局变量

webservers:
  hosts:
    webserver01:
      ansible_host: 192.0.2.140
      http_port: 80
    webserver02:
      ansible_host: 192.0.2.150
      http_port: 443
  vars:
    ansible_user: my_server_user

剧本

  • 创建剧本playbook.yml

    - name: My first play
      hosts: myhosts
      tasks:
       - name: Ping my hosts
         ansible.builtin.ping:
    
       - name: Print message
         ansible.builtin.debug:
           msg: Hello world
  • 运行剧本
    ansible-playbook -i inventory.ini playbook.yaml

Python

  • 更新pip
    python -m pip install --upgrade pip

Nginx

官网: http://www.nginx.org
链接: https://nginx.org/download/nginx-1.24.0.tar.gz

参数与使用

    用法:
    参数介绍:
    示例:

源码编译安装

  1. 准备工作

    1. 获取源码包链接
    2. 编译环境准备 gcc make

      1. 编译环境准备

        yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel

      2. 软件介绍
        gcc 是编译工具,编译单个文件

        make 工具是一个只能得批处理工具,通过makefile 文件中用户指定的命令来进行编译(将高级语言写的代码编译成二进制语言)

        pcre 支持正则表达式

        zlib-devel 有些应用依赖于这个库

        openssl-devel 某些库文件跟开发有关

  2. 获取nginx的压缩安装包(二选一即可)

    • wget [-O 源码包保存目录并重命名] https://nginx.org/download/nginx-1.24.0.tar.gz
    • curl -o 源码包保存目录并重命名 https://nginx.org/download/nginx-1.24.0.tar.gz
  3. 解压缩获取的安装包

    tar -zxvf nginx.tar.gz
    得到一个文件夹 nginx-1.24.0

  4. 切换进nginx-1.24.0文件夹

    cd nginx-1.24.0

  5. 执行内部指令(内部指令必须使用相对或者绝对路径选中)

    ./configure --user=alex --group=alex --prefix=/usr/local/nginx

    说明:
    --user 指定用户
    --group 指定用户组
    --prefix 指定安装路径

  6. 编译文件

    make

  7. 安装文件

    make install

  8. 若指定的用户不存在-----执行新建用户,默认会构建一个同名的主属组

    useradd alex

  9. 关闭防火墙

    systemctl stop firewalld

  10. 启动nginx

    /usr/local/nginx/sbin/nginx

  11. 使用结束以后关闭nginx

    /usr/local/nginx/sbin/nginx -s stop


LAMP架构

  • LAMPLinux + Apache + MySQL + PHP LAMP 架构(组合)
  • LNMPLinux + Nginx + MySQL + php-fpm LNMP 架构(组合)
  • LNMPALinux + Nginx(80) + MySQL + PHP + Apache Nginx 代理方式

      Apache:Apache是世界使用排名第一的Web服务器软件。
      PHP:一种专门用于Web开发的编程语言。
      MySQL:MySQL是一个关系型数据库管理系统,主要用于永久存储项目数据。

AMP三者之间的关系

  • Apache:用于接收用户的请求(输入网址,返回网页=>结果)
  • PHP:注册、登录、加入购物车、下单、支付等动态功能(有编程语言的支持)
  • MySQL:永久保存数据,比如你在网站上注册的用户和密码、你加入购物车的产品、你的产品订单

LAMP环境安装

Apache安装
  • 配置文件:/etc/httpd/conf/httpd.conf
  • 项目目录:/var/www/html
  1. 安装apache
    yum install httpd

    1. 修改端口(可选)

      # vim /etc/httpd/conf/httpd.conf
      # 搜索ServerName:/ServerName
      ServerName localhost:80
  2. 设置开机自启动

    systemctl status httpd # 查看当前运行状态
    systemctl start httpd # 启动httpd
    systemctl stop httpd # 关闭httpd
    systemctl enable httpd # 打开开机自启
    systemctl disable httpd # 取消开机自启
  3. 访问测试
    打开浏览器,访问http://localhost:80/,观察是否能进入测试页面
Mysql安装
  1. 安装mysql源

    wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    rpm -ivh mysql-community-release-el7-5.noarch.rpm
  2. 安装mysql
    yum install mysql-community-server
  3. 设置开机自启动

    systemctl status mysqld # 查看当前运行状态
    systemctl start mysqld # 启动mysqld
    systemctl stop mysqld # 关闭mysqld
    systemctl enable mysqld # 打开开机自启
    systemctl disable mysqld # 取消开机自启
  4. 初始化mysql

    • 默认情况下,数据库没有密码,也没有任何数据,必须要初始化
    • 初始化数据,设置root密码(MySQL管理员)
      mysql_secure_installation
      1722180047933
      1722180056300
    • 注意:以上说的root和Linux中的root不是同一个用户,这个root代表MySQL数据库的管理员,只不过这个管理员也叫root。

    1722180102429
    1722180114240
    1722180129051
    1722180138175
    1722180148488
    1722180158047

  5. 访问测试
    打开终端,输入mysql -u root -p,回车,输入密码,查看是否能成功登录
Php安装
  1. 安装php
    yum install php
  2. 重启apache

    systemctl stop httpd # 关闭httpd
    systemctl start httpd # 启动httpd
  3. 测试php

    • apache项目目录:/var/www/html
    • 打开项目目录
      cd /var/www/html
    • 创建demo.php
      vi demo.php
    • 在demo.php中输入php代码并保存

      <?php 
      echo 'hello 帅辉'; 
      ?>
    • 访问测试
      打开浏览器,输入http://localhost:80/demp.php,测试能否成功看到 "hello 帅辉"

实战:部署Discuz!论坛

升级php到7.4

  1. 更新php源:
    yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
  2. 启用PHP 7.4 Remi仓库

    yum -y install yum-utils
    yum-config-manager --enable remi-php74
  3. 安装新版本php和拓展包
    yum install php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json
  4. 测试php是否更新
    php -v查看版本

    php -v
        PHP 7.4.33 (cli) (built: Jun  5 2024 05:05:14) ( NTS )
        Copyright (c) The PHP Group
        Zend Engine v3.4.0, Copyright (c) Zend Technologies

开始安装Discuz

下载界面

下载链接

  • 下载Discuz到/var/www/html目录下
    wget https://gitee.com/Discuz/DiscuzX/attach_files/2044572/download

    会得到一个Discuz_X3.5_SC_UTF8_20250205.zip的压缩包。

  • 解压安装包
    unzip Discuz_X3.5_SC_UTF8_20250205.zip
    解压到当前目录
  • 删除安装包
    rm -rf Discuz_X3.5_SC_UTF8_20250205.zip
  • 设置权限
    /var/www/html增加写权限
    chmod -R o+w /var/www/html
  • 重启http服务器

    systemctl stop httpd # 关闭httpd
    systemctl start httpd # 启动httpd
  • 安装部署
    打开浏览器,输入http://localhost:80/upload,开始安装

帮助指令

  • man 查看所有帮助手册
  • 指令 --help 查看指令的用法帮助

RHEL重置root密码

  1. 重启Linux,进入内核选择界面,按下e,进入内核编辑模式
  2. 在启动参数后添加rd.break参数,按下Ctrl^X执行修改过的程序
  3. 等待系统进入救援模式,挂载系统分区。

    mount -o remount,rw /sysroot
    chroot /sysroot
    passwd
    touch /.autorelabel
    exit
    reboot

附件

Linux目录树原始Markdown

+ /
  + boot 存放系统内核与启动文件
  + dev 存放硬件设备相关信息
  + etc 存放系统配置文件
    - resolv.conf 设置域名解析
    - hostname 设置主机名
    - motd 设置开机提示语
    - os-release 查看发行版和版本号
    + sysconfig
      + network-scripts
        - ifconfig-xxx 设置网络环境,如动态IP等
  + home 普通用户的主目录
  + media 可卸载的存储介质挂载点
  + mnt mount文件的临时挂载点
  + opt 应用程序包的安装目录
  + proc 系统内存的映射目录,提供内核与进程信息
  + root 特权用户目录
  + run 存放组件运行时所需文件[文件夹]
  + srv 存放组件运行时所需文件
  + temp 存放临时文件
  + usr 存放用户程序
  + var 存放运行时内容会改变的文件,如日志等