Linux笔记

linux 终端界面调大调小(推荐使用外部的终端软件)
1:调大  shift + ctrl + +号
2:调小   ctrl + - 号
进入终端:当前用户名@主机名 当前工作的目录 #管理员提示符
!:localhost是默认的
~ 当前所在的工作目录是家目录 (用户的私有场所)其他用户不能随便访问的
root 用户的家目录在 /root 
普通用户的家目录在 /home/用户名同名
#号处是代表当前用户的身份(#是超级管理员,$是普通用户)
linux系统而言
1:多用户系统,允许同时有很多个用户登录系统,来使用系统的资源
2:多任务的系统,允许同时执行多个任务
3:一切皆是文件,无论是硬件还是软件 比如硬盘,内存条,等,一切都是以文件的形式存在
4:不管是文件还是目录都是以倒挂的树形结构存在于/(根)是linux系统的起点
5:对于linux系统而言,不管是文件还是目录没有扩展名一说,比如(.txt .jpg .png)区别于windows
.sh(脚本文件) .conf(配置文件) .log(日志文件) .rpm(软件包).tar (压缩包)  是给人看的,系统不区分这些文件。
6:没有提示就是最好的提示(代表命令成功了)
linux快捷键
清屏 ctrl + L  或者clear命令都可以可以
退出系统 exit
取消当前执行的命令 ctrl + C
tab键:自动命令补全和文件补全的功能(按一下不行的话,按两下,会显示可补全的命令)
ctrl +a  将当前光标到行首
ctrl +e  将当前光标到行尾
ctrl +u 清空至行首
ctrl +w 删除一个单词
linux命令格式
命令行的一般格式 命令字 (-选项…)(参数…)严格区分大小写  之间一定要有空格
选项分为 短选项 (-a -l -d 等单字符 可以合并使用如 -la  -lh )和长选项 (-help 单词 长选项通常不能合并使用)
参数是被命令的执行对象 可能是一个文件和目录,也可能是一个程序等
注意:选项和参数是一个可选的,不是必须的,看需求
           选项:可以同时有多个选项 如 ls -a  -l  
linux系统辨别文件与目录的方法区分颜色
蓝色代表目录  (类似与windows的文件夹)
白色代表文件
浅蓝色代表链接文件(链接文件类似于windows的快捷方式)
绿色代表可执行文件
红色代表压缩文件
黄色表示设备文件 (硬盘)(网卡)(键盘)(鼠标)/dev 下居多
紫色表示图片文件:图片文件
红色闪动文件 ----->表示链接文件不可用
linux文件类型(ls -l 查看)

  • 开头的是文件
    d 开头的是目录
    l 开头的是链接 浅蓝色
    b 开头的是跨设备文件
    c 开头的是字符设备文件
    p 开头的是管道设备文件
    s 开头的是套接字
     
    linux系统下的归属关系
    给用户分三类
    1:u 所有者 (文件或目录的拥有者,拥有者的权限通常是最大的)
    2:g 所属组 (文件或目录属于哪一个组,所属组的权限会略微的比所有者要小)
    3:o 其他人 (既不是文件的拥有者,也不属于文件或组内的成员,其他人的权限通常是最小的)
     
    linux文件权限
    -rw-r–r–. 1 root root 0 1月   6 17:35 1
    -rw-r–r–:u所有者,g所属组,o其他人的权限(每个三个字段)
     u   g    o
    也就是说:
    所有者拥有读取和写入的权限
    所属组拥有读取的权限
    其他人拥有读取的权限
     
    linux基本权限
    r :读取
    w:写入
    x :执行
  • :无权限
    权限顺序:rwxrwxrwx (不会改变)
     
    绝对路径和相对路径
    绝对路径永远以 / 开头  比如我以绝对路径的方式进入根下1目录的2目录 cd /1/2
    相对路径是以当前目录为起点   比如我以相对路径的方式进入根下1目录的2目录 cd 1 然后在 cd 2
     
    su命令
    功能:切换用户
    用法:su  用户名
    注意:root用户切换到普通用户不需要密码
              普通户名切换到root用户需要知道root用户的密码
    su - 用户名   #切换用户身份,连同环境一起切换#
    //su 用户名//
    切换用户,但是环境没变,可以pwd一下看一下//
    //su - 用户名//
    切换用户,连同环境一块改变//
    //切换到root用户//
    su root
    //后面什么也不跟也是默认切换root//
    su
     
    ls命令
    功能:查看目录下的内容以及目录和文件详细属性信息
    格式 ls (-选项…)(参数…)
    什么都不加显示当前所在目录下的所有内容
    例如:
    查看根目录下的内容    ls /  
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    上面的为一级子目录
    常用选项:
    -a   显示目录下所有内容包含隐藏内容(隐藏内容以.开头)
    -l    以长格式显示所有内容,显示很多详细属性信息
     ll   也是长格式显示
    解释:以bin为例
    lrwxrwxrwx.   1 root root    7 12月 11 00:03 bin -> usr/bin
    1:代表文件引用的次数,只针对与做了硬链接的文件才有效
    root:代表文件的所有者
    第二个root:所属组
    7:代表文件的大小(默认以字节为单位来显示大小)
    12月 11 00:03:文件最近一次的修改时间
    -h 人性化显示文件属性信息(通常和-l一起用)(-lh 或者 -l  -h  都可以)(KB,MB,GB)
    -d 仅显示目录本身,不显示目录下的内容
    -i  查看inode号(系统任何一个目录或者文件都有唯一的编号) (ls -i 文件名   只显示此文件的编号)
    -R 递归查看目录,意思为从头到尾的查看
    例如:
    //以长格式显示/etc下的内容方法一//
    ls -l /etc
    //以长格式显示/etc下的内容方法二//
    ll /etc
     
    stat命令
    功能:查看文件的元数据信息,获取文件的时间戳
    用法:stat 文件名
    mkdir命令
    功能:创建新的目录
    格式:mkdir (-选项)目录名 (可一次创建多个目录空格例如:mkdir 1 2 3 )
    常用选项:
    -p 递归创建多个目录
    注意事项:
    1:目录还是文件的名字,除了以‘/’以外的任意名称   ‘/’是根目录,路径分隔符
    2:文件和目录的名字长度不能超过255个字符
    例如:
    //直接创建三个文件//
    mkdir 1 2 3
    //递归创建:在一个不存在的目录下创建目录//
    mkdir -p /dev/1/2  首先递归是创建一个不存在的目录下再创建一个目录,就是说/dev下是没有1的
    cd命令
    格式:cd (-选项)(目录名) 很少跟选项
    功能 :切换目录
    提示:可以切换的是绝对路径和绝对路径,如果不指定目录名称,则切换到当前用户的家目录~
    常用的操作:
    ~ 是家目录
    . 是当前目录
    … 是上级目录
  • 可在两目录之间来回切换
    例如:
    //回到家目录//
    cd ~
    //切换到根目录下名为liu的目录//
    cd /liu
    //切换到上级目录//
    cd …
    pwd命令
    功能:打印当前所在的工作目录,执行pwd命令后,可显示当前所在的工作目录的绝对路径名称
    格式:pwd (-选项)
    rmdir命令
    功能:删除空目录(只能删除里面没有文件的目录)
    rmdir (-选项)目录名
    touch命令
    功能:创建一个文件
    用法:touch 文件名
    例如:
    //创建一个名字为test.txt 的文件//
    touch test.txt
    //创建多个文件//
    touch 1 2 3 4
    //在根目录下etc下创建一个名字为1的文件//
    touch /etc/1
     
    cp命令
    功能:复制文件和目录,同时可以改修目录或者文件的名字,linux没有重命名的功能
    用法:cp (-选项)源文件和目录  目标目录
    常用选项:
    -p 保留源文件属性不变(比如修改时间,归属关系,权限)
    -r 复制目录 (包括目录下的所有子目录和文件)
    例如:
    //将liu文件复制到da目录里//
    cp liu da
    //将liu文件复制到根目录下的etc中//
    cp liu /etc
    //将liu目录复制到根目录下//
    cp -r liu /
    //同时复制多个目录将1 2 3 目录复制到/etc//
    cp -r 1 2 3  /etc
    //复制并改名后面直接跟上新的文件名字即可,相对路径和绝对路径自己判断//
    cp 1 2   将1文件修改名字为2
    //将1文件拷贝到根目录下,并且源文件的修改时间不改变//
    cp -p 1 /
     
    mv命令
    功能:移动文件或者目录,也可以用于修改目录和文件名
    用法:mv (-选项)源文件 目标文件
    例如:
    //将1移动到2下//
    mv 1 2
    //多个文件一起移动到根下的etc//
    mv 1 2 3 4  /etc   
     
    cat命令
    功能:用于查看文件内容
    用法:cat (选项)文件名
    选项:
    -n 查看文件以行号的形式显示文件内容(里面内容显示行号,人性化一些)
    例如:
    //查看1文件的内容//
    cat 1
    //查看1文件以行号的形式显示//
    cat -n 1
     
    less命令
    功能:查看文件,对文件的输出进行分页显示的内容,常用于查看内容量较大的文件
    用法:less (选项)文件名
    常用选项:
    -N 以带行号的形式显示文件
    使用技巧:
    1:键盘上下键逐行查看
    2:pgdn键 向上翻一页
    3:pgup键 向下翻一页
    4:/字符串 搜索指定字符串 (n 从上到下搜索,N从下向上搜索)
    5:q 退出
     
    head命令
    功能:用来显示文件开头部分内容,默认显示文件开头10行内容
    用法:head (选项)文件名
    选项:
    -n (行数)显示指定的行数
    例如:
    //显示etc下的passwd//
    head /etc/passwd
    //显示/etc下passwd文件前6行//
    head -n 6 /etc/passwd
     
    tail命令
    功能:用来显示文件末尾部分的内容,默认显示文件末尾10行内容
    用法:tail (选项)文件名
    选项:
    -n (行数)显示指定的行数 
     -f    动态显示  (就是一直盯着这个文件,盯住别的用户修改内容)
    例如:
    //查看etc下的passwd末尾显示//
    tail /etc/passwd
    //查看etc下的passwd的末尾5行//
    tail -n  5  /etc/passwd
     
    rm命令 (rm可以删除一切,切记不要乱用,系统自带的目录不要动,会使系统崩溃)
    功能:命令用于删除目录和文件
    用法:rm (-选项)目录或文件
    选项:
    -f 强制删除
    -r 删除目录
    ""特殊字符:系统常用符号,用来代表任意字符
    例如:
    //强制删除名字为1的目录//
    rm -rf  1
    //删除名为1的文件//
    rm 1
    //同时删除多个目录//
    rm -rf 1 2 3 4 5 6
    //删除/mnt下的所有文件用
    功能!:就代表此目录下的所有目录和文件//
    rm -rf /mnt/

     
    软链接和硬链接
    !:linux的链接相当于windows的程序快捷方式
    软链接特点:可以跨分区,可以对目录进行链接,源文件删除后,链接文件不可用
    软连接命令格式:ln -s 源文件路径(路径必须使用绝对路径) 目标路径
     
    硬链接特点:硬链接不可跨分区,不可以对目录进行链接,源文件删除后,链接文件依然可以使用
    硬链接命令格式:ln 源文件路径(路径必须使用绝对路径) 目标路径
    !:和拷贝的功能区别是硬链接可以实现文件内容同步更新的功能
    !:硬链接还能保持链接文件属性不变
    !:硬链接inode号也保持链接文件不变(inode号,查看上方ls的选项)
     
    内部命令和外部命令
    什么是命令:用来实现某一种功能的指令或程序
    命令的执行依赖于解释器(例如:/bin/bash),/etc/shells文件存放系统可用的shell(我们用的是/bin/bash这个解释器)
    ——>用户–解释器(shell外壳)–内核
    linux命令分类:
    1:内部命令:shell程序自带的基本管理命令
    2:外部命令:有独立的外部可执行程序文件命令
    type 命令用于区别内部命令和外部命令  比如 type ls 就是查看ls命令程序是不是内部命令
    which 命令用于查找可以执行程序文件位置 比如 which ls  就是查找ls程序文件的位置
     
    help命令帮助手册
    功能:help命令用于查看shell内部命令的帮助信息,包括使用方法,选项等…
    用法:help (选项) 命令
    例如:
    //查看cd命令的帮助手册//(用的不多得先判断是外嵌还是内嵌,因为help只能查看内部命令的,一般用的最多的是下面这个例子)
    help cd
    //查看mkdir命令的帮助文档//
    mkdir --help
     
    man获取命令帮助手册
    功能:查看系统命令的帮助信息,包括使用方法,选项,使用例子等…,对比–help ,man输出的信息更加详细
    用法:man  (-选项)命令
    使用技巧:
    1:键盘上下键逐行查看
    2:pgdn键 向上翻一页
    3:pgup键 向下翻一页
    4:/字符串 搜索指定字符串 (n 从上到下搜索,N从下向上搜索)
    5:q 退出
     
    linux系统的运行级别
    Linux系统运行级别: linux系统有7个运行级别,不同的运行级别运行的程序和功能都不一样,而Linux系统默认是运行在一个标准的级别上,系统运行级别文件/etc/inittab文件
    运行级别0:所有进程被终止,机器将有序的停止,关机时系统处于这个运行级别(关机)
    运行级别1:单用户模式,(root用户进行系统维护),系统里运行的所有服务也都不会启动
    运行级别2:多用户模式(网络文件系统NFS服务没有被启动)
    运行级别3:完全多用户模式,(有NFS网络文件系统)标准的运行级别
    运行级别4:系统未使用
    运行级别5:登录后,进入带GUI的图形化界面,标准的运行级别
    运行级别6:系统正常关闭并重启
    //查看系统当前的运行级别//(装了图形化就是5,一般咱们虚拟机就装的带图形化的)
    命令:runlevel
    N 5
    N:代表没有从任何级别跳转过来
    5:代表系统现在处于的系统级别
    //切换运行级别//(切换到3运行级别)
    命令:init 3
    //切换运行级别//(切换到5运行级别)
    命令:init 5
    multi-user.target: analogous to runlevel 3#运行级别3#
    graphical.target: analogous to runlevel 5#运行级别5#
    systemctl get-default #查看当前系统默认的运行级别#
    systemctl set-default TARGET.target #修改当前系统默认运行级别#
    例如:
    //修改当前系统默认运行级别是3//(规律不难发现,一般不要修改成其他的级别,因为其他运行级别没法用)
    systemctl set-default multi-user.target
     
     
    linux系统的关机和重启命令
    linux下常用的关机命令有: shutdown、halt、poweroff、init
    init 0 #立刻关机#
    halt #立刻关机#
    poweroff #立刻关机# (常用这个)
    shutdown -h now #立刻关机#
    shutdown -h 10 #10分钟后自动关机#
    重启命令:reboot ,shutdown
    reboot #立刻重启#  (常用这个)
    shutdown -r now #立刻重启#
    shutdown -r 10 #10分钟后自动重启#
     
    计算机硬件组成部分
    输入设备:键盘,鼠标,触摸屏等
    主机设备:主板,中央处理器(CPU),内存,网卡,声卡,显示卡等
    输出设备:屏幕,耳机,打印机,投影仪等
    外部存储设备:硬盘,软盘,光盘,U盘等
     
    linux系统目录介绍 (有很多目录一般都用不到,但是系统自带的目录最好不要删除)
    /(根) :系统所有数据都存放在根目录下
    /bin:存放用户和管理员必备的可执行的二进制程序文件 (查看二级制的文件命令:od 文件名,一般用不到)
    /boot:存放Linux系统内核及引导系统程序所需要的文件目录
    /dev:存放硬件设备的目录,如键盘、鼠标、硬盘、光盘等等
    /etc:存放服务的配置文件,用户信息文件
    /root:超级管理员的家目录
    /home:系统普通用户的家目录
    /lib:存放系统中的程序运行所需要的共享库及内核模块
    /opt:额外安装的可选应用程序包所放置的位置
    /srv:服务启动之后需要访问的数据目录
    /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下
    /var:存放系统执行过程中经常变化的文件,如随时都在变化的日志文件就存放/var/log/下
    /mnt、/media :光盘和镜像等预设的挂载点
    /proc: Linux伪文件系统,该目录下的数据存在于内存当中,不占用磁盘空间
    /lib64∶存放函式库
    /run :程序或服务启动后,存放PID的目录
    /sys:存放被建立在内存中的虚拟文件系统
    /usr:操作系统软件资源所放置的目录
    /usr/bin:与/bin目录相同,存放用户可以使用的命令程序
    /usr/lib: 与/lib目录相同,存放系统中的程序运行所需要的共享库及内核模块
    /usr/etc:用于存放安装软件时使用的配置文件
    /usr/games:与游戏比较相关的数据放置处
    /usr/include: c/c++等程序语言的档头(header)与包含档(include)放置处
    /usr/lib64:与/lib64目录相同,存放函式库
    /usr/libexec:不经常被使用的执行程序或脚本会放置在此目录中
    /usr/local:额外安装的软件存放目录
    /usr/sbin:该目录与/sbin目录相同,存放用户可执行的二进制程序文件
    /usr/share:放置只读架构的杂项数据文件
    /usr/src: 一般软件源代码建议存放该目录下
     
    查看内核信息
    umame命令用于显示系统内核信息
    用法:umame (-选项)
    常用选项:
    -s :显示内核名称
    -r :显示内核版本
    //查看系统内核名称和版本//
    umame -rs
     
    查看CPU信息
    /proc/cpuinfo文件用于存放系统CPU信息
    lscpu用于显示CPU架构信息
    命令格式:lscpu (-选项)
    //查看系统cpu信息方法1// (比较人性化一些)
    lscpu
    //查看系统cpu信息方法2//
    cat /proc/cpuinfo
     
    查看内存信息
    /proc/meminfo文件用于存放系统内存信息
    free 用于查看内存使用情况
    用法:free (-选项)
    常用选项:
    -h  (以人容易理解的方式显示大小(KB,MB,GB))
    //查看内存信息,以容易理解的方式//
    free -h
    #解释:Mem物理内存统计信息
     total:总内存
     used:已经使用的内存
     free:剩余的内存
     shared:#共享内存总量
     buff/cache:#块设备与普通文件占用的缓存数量
     avai1able:#还可以被应用程序使用的物理内存大小
    #解释:Swap 内存交换空间,当物理内存不足时,可以使用硬盘空间充当内存使用
     total:#交换分区内存总量
     used:#正在使用的交换分区内存
     free:#空闲交换分区内存
     
    查看网卡信息
    网卡配置文件地址: /etc/sysconfig/network-scripts/网卡名
    ifconfig 用于显示和设置网卡的参数
    ip a  也可以查看网卡,显示所有网卡,没有启用的也显示
    用法:ifconfig (网卡名)
    //查看系统网卡信息//
    ifconfig
     
    查看主机名和修改主机名
    /etc/hostname文件用于存放主机名
    hostname命令用于显示和设置主机名
    用法:hostname 新名字(不要用中文,不要加特殊符号,英文即可)
    //临时修改将系统用户名修改为liu//
    hostname liu
    //永久修改系统用户名为liu方法一//
    hostnamectl set-hostname liu
    //永久修改系统用户名为liu方法二//
    修改配置文件,直接vim修改配置文件
    //查看系统主机名方法一//
    hostname
    //查看系统主机名方法二//
    cat /etc/hostname
     
    vi/vim文本编辑器
    vim是从vi发展出来的一个文本编辑器,vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性
    vi/vim共分为三种模式:命令模式,输入模式,底线模式(末行模式)
    命令模式:刚刚启动vi/vim,便进入了命令模式
    输入模式:在命令模式下按a/i/o 就进入了输入模式(就可以开始往里面写东西了)
    ESC,退出输入模式,切换到命令模式
    底线命令模式:在命令模式下按下:(英文冒号)就进入了底线命令模式
     
    命令用法:vim 文件名
    若目标文件不存在,则新创建文件并编辑
    若目标文件已存在,则打开文件并编辑
     
    命令模式:刚刚启动vi/vim,便进入了命令模式
    i #切换到输入模式,在当前光标所在字符前插入(一般用这个模式,这个也相对好用一些)#
    a #切换到输入模式,在当前光标所在字符后插入#
    o #切换到输入模式,在当前光标所在行下插入新行#
    :#切换到底线命令模式,以在最底一行输入命令#
    x  #在命令模式下册除当前光标所在的单字符#
    dd #删除─整行内容,配合数字可删除指定范围内的行#
    C #删除当前光标及光标后所有内容并进入输入模式#
    u #恢复上一次修改内容,一次恢复一个操作,可多次恢复,直到恢复本次操作初始状态为止(在没有保存的情况下)#
    $ #将光标移动至行尾#
    0(数字0) #将光标移动至行首#
    gg #跳转至文件第一行#
    G #跳转至文件最后一行#
    yy #复制当前行,配合数字可以同时复制多行#(复制五行:按 5  yy)
    p #粘贴当前光标所在行下#
    /(关键字)  #搜索文件内关键字,n从上向下快速定位关键字,N从下向上快速定位关键字#
     
    底线命令模式
    可以输入单个或多个字符的命令,可用的命令非常多如下
    :w 保存
    :q 退出
    :wq 保存并退出
    :q!强制退出不保存      //普通用户无法使用!号强制的功能//
    :wq!强制保存并退出   //普通用户无法使用!号强制的功能//
    :set nu 以行号的形式显示文件内容
    :set nonu 取消行号显示
    :行号 快速跳转到指定行
    :r 读入另一个文件的数据,文件内容添加到光标的下一行 //将根目录下的叫liu的文件的内容导入进来,命令是:r /liu //
     
     
    例如:
    //编辑名字为test.txt的文件,并在里面写入hello !!!//
    1:vim test.txt
    2:然后按i键进入插入模式
    3:写入hello !!!
    4:  按ESC键退出到命令模式
    5:然后输入:wq
     
    修改网卡IP地址
    网卡配置文件地址: /etc/sysconfig/network-scripts/网卡名
    步骤:
    1:vim /etc/sysconfig/network-scripts/网卡名
    2:IPADDR=“192.168.0.60”#修改IP地址(其他的自己觉得需要修改的就修改)
    !:ifconfig#用于显示和设置网卡的参数
    systemctl restart network #重启网络(修改完IP需要重新启动)
    ifup 网卡名#启动该网卡设备(当服务器有多个网卡的时候,需要启动其他网卡,这个时候使用这个命令)
    ifdown网卡名#禁用该网卡设备
     
    使用命令修改IP地址
    nmcli connection modify 网卡名 ipv4.method manual ipv4.addresses lp地址/掩码 connection.autoconnect yes
    解释:
    nmcli connection modify(修改)
    网卡名ipv4.method(配置ipv4地址方法)
    manual(手动配置)
    ipv4.addresses ( ipv4地址)
    lp地址/掩码connection.autoconnect yes(开机自动连接)
    激活网卡: nmcli connection up 网卡名
    关闭网卡: nmcli connection down 网卡名
    重启网卡: nmcli connection reload 网卡名
     
    host命令
    host用于将一个域名解析到一个IP地址,或将一个IP地址解析到一个域名
    例如:
    //解析www.baidu.com//
    host www.baidu.com
     
    nslookup命令
    nslookup用于查询域名解析是否正常,在网络故障时用来诊断网络问题
    例如:
    //查询百度的域名解析//
    nslookup www.baidu.com
     
    alias别名管理命令
    alias命令用于设置命令别名,用户可以使用alias自定义命令别名来简化命令的复杂度
    用户家目录下有一个 .bashrc 文件是用来存放命令别名的,永久修改别名就直接写入这个文件
    用法:alias (别名)=(命令命令记得要用单引号或者双引号括住) !注意:=号前后不能有空格
    unalias 别名 //取消别名//
    alias //查看当前系统有哪些别名//
    \ 别名   //本次取消别名功能(\)//
    例如:
    //将ls /etc/sysconfig/network别名修改为lsnet//
    alias lsnet=‘ls  /etc/sysconfig/network’
    //永久修改别名//
    vim .bashrc 写入即可
    !注意:定义别名还是不要与系统自带的命令冲突
     
    history管理历史命令
    history命令用于显示历史记录和执行过的命令,登录shell时会读取~./bash_history历史文件中记录下的命令,当退出或登出shell时,会自动保存到历史命令文件,该命令单独使用时,仅显示历史命令
     .bash_history  //在家目录下,存放历史命令//
    用法:history (-选项)(参数)
    常用选项:
    -a 追加本次新执行的命令至历史命令文件中
    -d 删除历史命令中指定的命令
    -c 清空历史命令列表(但是不彻底,最彻底的是删除存放文件)
    快捷方式:
    !(命令编号)    快速调用命令历史中第N条命令
    !e                 调用命令历史中以e开头的命令(只调用最新使用的以e开头的命令)
    !!                  重复执行上一条命令
    例如:
    //查看系统历史命令//
    history
    或者直接查看存放文件 .bash_history
    cat .bash_history
    //删除指定历史命令//
    先history查看命令编号
    然后  history -d 编号
    !默认情况下历史命令能够存1000条, 要修改默认的保存命令的条数vim etc/profile,然后修改46 HISTSIZE=1000,
    后面的1000就可以改成想默认保存命令条数的数字即可
     
    date命令
    date命令用于显示或设置系统日期与时间
    用法:date (-选项)(+格式符)#查看系统日期时间#
    date (-选项)[MMDDhhmm[[CC]YY][.ss]]
    常用选项:
    -s 设置日期时间
    格式符:
    +%Y 年份
    +%B 月份
    +%d   日
    +%H   时
    +%M  分
    +%S    秒
    +%F  年-月-日
    +%X 时:分:秒
    例如:
    //查看当前系统的时间//
    date
    //只显示月份//
    date +%B
    //可以组合使用,中间可以加一些符号来区分,什么符号也行,空格不可以//
    [root@localhost ~]# date +%X-%F
    21时34分33秒-2022-01-19
    //修改年月日时间//
    [root@localhost ~]# date -s 2022-1-1
    2022年 01月 01日 星期六 00:00:00 CST
    //修改时分秒时间//
    [root@localhost ~]# date -s 12:12:00
    2022年 01月 01日 星期六 12:12:00 CST
    //同时设置年月日和时分秒//#这里用单引号和双引号都可以#
    [root@localhost ~]# date -s ‘2020-1-1 12:12:00’
    2020年 01月 01日 星期三 12:12:00 CST
    !注意:区别双引号和单引号:
     ‘’ 单引号,屏蔽特殊符号的功能,引用整体
    “” 双引号,引用整体,不会屏蔽特殊符号的功能
    linux两种时钟:
    系统时钟:内核通过CPU的工作频率去计算的时间
    //显示系统时间//
    [root@localhost ~]# date
    2020年 01月 01日 星期三 12:20:03 CST
    硬件时钟:
    //显示硬件时间//
    [root@localhost ~]# clock
    2020年01月01日 星期三 12时18分53秒  -0.615914 秒
    //显示并设置系统与硬件时间//
    [root@localhost ~]# hwclock
    2020年01月01日 星期三 12时25分05秒  -0.926933 秒
    hwclock (-选项)
    选项:
    -s :把系统时间设置成与硬件时间相同
    -w:把硬件时间设置成与系统时间相同
    例如:
    //把硬件时间设置成与系统时间相同//
    [root@localhost ~]# hwclock -w
     
    cal命令
    显示日历
    //显示日历//
    [root@localhost ~]# cal
    //显示2020年的日历//
    [root@localhost ~]# cal 2020
     
    wc统计命令
    wc 用于统计文件的字节数、行数,并将统计的结果输出到屏幕
    用法:wc (-选项) 文件名
    常用选项:
    -c #统计字节数
    -l #统计行数
    [root@localhost ~]# wc /etc/passwd
    38   66 1906 /etc/passwd
    38:代表38行数
    66:代表共多少单词
    1906:代表文件的字节
    /etc/passwd 文件名
    例如:
    //查看/etc/passwd文件有多少行//
    [root@localhost ~]# wc -l /etc/passwd
    38 /etc/passwd
     
    管道符
    管道符“|”:将命令的输出结果交给另外一条命令作为参数继续处理
    例如:
    //查看/etc/passwd文件的10行,然后输出的结果再查看末尾5行//
    [root@localhost ~]# head -10   /etc/passwd | tail -5
    sync❌5:0:sync:/sbin:/bin/sync
    shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
    halt❌7:0:halt:/sbin:/sbin/halt
    mail❌8:12:mail:/var/spool/mail:/sbin/nologin
    operator❌11:0:operator:/root:/sbin/nologin
    //查看/etc/passwd文件的10行,然后输出的结果再查看末尾5行,再查看有几行//
    [root@localhost ~]# head -10   /etc/passwd | tail -5 | wc -l
    5
     
    重定向操作
    重定向操作:将前面命令的输出结果,写入到其他的文本文件中
    重定向表示符号:

重定向输出  (覆盖原来的内容)

重定向输出  (追加到原来内容的下面)
<    输入重定向  (覆盖)
<<  输入重定向 (追加)
    只收集正确的输出结果(报错的命令是不行的)
2>  只收集错误的输出结果 (还是覆盖的方式)
2>> 只收集错误的输出结果 (追加的方式)
&> 正确错误的都收集     (覆盖方式)
&>> 正确错误的都收集 (追加的方式)
//将查看的/etc/passwd文件内容里的前五行,输出的内容存到/下,并命名为test,如果文件test是已经存在的,则覆盖原来的内容//
[root@localhost ~]# head -5 /etc/passwd > /text
[root@localhost ~]# cat /text
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
//将错误的执行结果放到/test//
[root@localhost ~]# ls ahah 2> /test
[root@localhost mail]# cat /test
ls: 无法访问ahah: 没有那个文件或目录
 
echo命令与sleep命令
echo命令用于输出指定的字符串和变量
用法:echo (-选项)(参数)
例如:
//将1234567890这个内容追加到/testz中//
[root@localhost /]# echo 1234567890 >> /test
[root@localhost /]# cat /test
ls: 无法访问ahah: 没有那个文件或目录
1234567890
//echo $PATH这个环境变量//
[root@localhost /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
 
sleep命令
sleep命令可以用来将目前动作延迟一段时间
------命令格式:sleep 时间
------常用选项:s 秒 m 分钟 h 小时 d 日
//10秒后终端回来//
sleep 10
! 写脚本的时候有用,在命令行没啥用基本
 
 
用户账号管理
用户账号的作用:用户账号可用来登录系统,可以实现访问控制
 
 
useradd创建用户
useradd命令用于创建新的用户
用法:useradd (-选项)用户名
常用选项:
-u 指定用户的UID
-d 指定用户家目录
-c 用户描述信息
-g 指定用户基本组
-G 指定用户附加组
-s  指定用户的shell
//创建一个叫liu的用户//
[root@localhost /]# useradd liu
 
 
id命令
id命令用于查看系统用户所在组的信息
用法:id (-选项)(用户名)
//查看liu这个用户所在组的信息//
id liu
 
/etc/passwd 文件
用户的基本信息存放在/etc/passwd文件
//查看当前系统的用户基本信息//
root❌0:0:root:/root:/bin/bash
#每个字段含义解释,用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序组成#
UID:0 超级用户
UID:1-499 系统伪用户,不能登录系统并且没有家目录
UID:500-65535 普通用户
组:
基本组(初始组):一个用户只允许有一个基本组
附加组 (在基本组之外的):一个用户可以允许有多个附加组
 
用户–>shell程序–> 内核–>硬件
 
 
 
/etc/default/useradd文件
/etc/default/useradd存放用户默认值信息
//查看一下文件//
[root@localhost ~]# cat /etc/default/useradd

useradd defaults file

GROUP=100   #用户默认组#
HOME=/home #用户家目录#
INACTIVE=-1   #密码过期宽限天数(/etc/shadow文件的第7个字段)#
EXPIRE=  #密码失效时间(/etc/shadow文件第8个字段)#
SHELL=/bin/bash  #默认使用的shell#
SKEL=/etc/skel #模板目录#
CREATE_MAIL_SPOOL=yes  #是否建立邮箱#
 
 
/var/spool/mail用户邮件文件
//查看邮箱目录//
[root@localhost ~]# ls /var/spool/mail/
liu  roo  root  rpc
 
 
passwd命令设置用户密码
passwd命令用于设置用户密码
密码规范:长度不能少于8个字符,复杂度(数字,字母区分大小写,特殊字符),这个规范是给普通用户规范的,root用户设置什么都可以
密码规范:本次修改的密码不能和上次的密码太相近了,对普通用户而言
用法:passwd (-选项)(用户名)
常用选项:
-S 查看密码信息
-l 锁定用户密码
-u 解锁用户密码
-d 删除密码
–stdin 通过管道方式设置用户密码
非交互设置用户密码:
命令格式:echo ‘密码’ | passwd --stdin 用户名
//查看用户的密码信息//
passwd -S 用户名
//锁定用户的密码(只有管理员才能执行,就是密码就算是对的,这个用户也登录不上)//
passwd -l 用户名
//解锁用户密码//
passwd -u 用户名
//删除用户密码//
passwd -d 用户名
 
 
/etc/shadow用户密码文件
用户的密码信息存放在/etc/shadow文件中,该文件默认任何人都没有任何权限(不包括root)
root: 6 6 6aY/MUvVbyEsZ8iWB$wRLwIRRZ5kyA78KVEHx4wlraTpr5Q94WZljUPS73nUt04Mj/imtaw8.TNl.mKvX83yvHmxJG6NvGs2evfNCI0:18971:0:99999:7:::
第一字段:用户名
第二字段:密码加密字符串,加密算法为SHA512散列加密算法,如果密码位是“*"或者“! !"表示密码已过期
第三个字段:密码最后一次修改日期,日期从1970年1月1日起,每过一天时间戳加1
第四个字段:密码修改的期限,如果该字段为0表示随时可以修改密码,例如:该字段为10,代表10天之内不可以修改密码
第五个字段:密码有效期
第六个字段:密码到期前警告时间(和第五个字段相比)
第七个字段:密码过期后的宽限天数(和第五个字段相比)
第八个字段:账号失效时间,日期从1970年1月1日起
第九个字段:保留
//chage命令用于修改/etc/shadow文件信息,修改文件内容第三个字段(密码最后一次修改时间为0)//
[root@localhost /]# chage -d 0 用户名
 
 
usermod修改用户属性
usermod命令用于修改已存在用户的基本信息
用法:usermod (-选项)用户名
常用选项:
-u 修改用户UID
-c 修改用户描述信息
-d 修改用户家目录
-g 修改用户基本组
-G 添加用户附加组
-s  修改用户shell
//修改用户的UID//
usermod -u 1111 用户名
//修改用户的描述信息//
usermod -c www.liudaheng.com 用户名
 
 
userdel删除用户
userdel用于删除给定的用户以及与用户相关的文件,该命令若不加选项仅删除用户账号,不删除用户相关文件
用法:userdel (-选项)用户名
常用选项:
-r   删除用户同时,删除与用户相关的所有文件
//仅删除账号,不删除家目录//
userdel 用户名
//删除账号,然后删除账号的家目录的文件//
userdel -r  用户名
 
 
 
groupadd添加组
groupadd 用于创建一个新的工作组,新组的信息将被添加到/etc/group文件中
用法:groupadd (-选项)组名
常用选项:
-g GID  //指定组的GID//
 
 
/etc/group组信息文件
组信息存放在/etc/group文件中
//查看组文件信息//
[root@localhost /]# cat /etc/group
root❌0:
#每个字符解释:组名:组密码占位符:GID:组中附加用户#
 
/etc/gshadow组密码文件
组密码信息存放在/etc/gshadow文件中
//查看组密码文件//
[root@localhost /]# cat /etc/gshadow
root:::
#每个字段含义:组名:组密码:组内管理员:组中附加用户#
 
groupmod修改组属性
groupmod 用于修改指定工作组属性
用法:groupmod (-选项)组名
常用选项:
-g GID #修改组的GID#
-n  新组名  原组名#修改组名#
//修改组名//
[root@localhost /]# groupmod -n liudaheng2022  da
//修改组GID//
[root@localhost /]# groupmod -g 1111 liu
 
 
gpasswd组管理命令
gpasswd是Linux工作组文件/etc/group和/etc/gshadow管理工具,用于将用户添加到组或从组中删除
用法:gpasswd (-选项)用户名 组名
常用选项:
-a //将用户添加到工作组//
-d //将用户从工作组中删除//
//将用户da添加到组liu//
gpasswd -a da liu
//将用户从工作组里删除//
gpasswd  -d  da liu
 
 
groupdel删除组
groupdel用于删除指定工作组
用法:groupdel 组名
 
 
chmod权限管理
chmod (英文全拼: change mode)设置用户对文件的权限
用法:chmod (-选项)归属关系±=权限类别  文件
root用户可以修改任何文件和目录的权限
文件所有者
常用选项:
-R 递归修改,包含目录下所有的子文件和子目录
归属关系:u所有者 g所属组 o其他人
权限类别:r读取 w写入 ,×执行, -没有权限
操作:+添加权限–去除权限=重新定义权限
权限修改可以使用数字的方式进行更改:r=4,w=2 ,x=1  ,0=没有权限  需要文件拥有哪个权限,加数字即可(3一般没啥用,所以注意组合,没有读写权限,写入和执行没啥用了就)
比如:需要文件的所有者的权限是读写权限,所属组是读权限,其他人是没有权限
则命令就是:chmod  640   文件名
例如:
//给hello文件所属组添加执行权限,给其他人也添加执行权限,使用逗号隔开,英文//
chmod g+x,o+x hello
//给hello文件其他人添加上阅读权限//
chmod o+r  hello
//给hello文件所属组删除执行权限,给其他人也删除执行权限,使用逗号隔开//
chmod g-x,o-x hello
//重新定义hello文件的所有者的权限是rwx//
chmod u=rwx hello
//用数字的方法设置hello文件的权限是rwx//
chmod 777 hello
//文件的其他人没有任何权限//
chmod o=—  hello
//修改文件拥有所有权限//
chmod ugo=rwx  hello
//目录和目录下的文件权限都是一样的//
chmod -R 777 hello
 
 
 
umask预设权限(一般用不到,了解即可)
umask用于显示或设置创建文件的权限掩码,当我们想改变创建文件和目录时的默认访问权限,则可以通过umask命令来实现。
在linux系统中,我们创建一个新的文件或者目录的时候,这些新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关。
若用户创建一个文件,则文件的默认访问权限为 -rw-rw-rw- ,创建目录的默认权限drwxrwxrwx
 ,而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。
 
可以看到umask值为0002,其中第一个0与特殊权限有关,可以暂时不用理会,
后三位002则与普通权限(rwx)有关,其中002中第一个0与用户(user)权限有关,
表示从用户权限减0,也就是权限不变,所以文件的创建者的权限是默认权限(rw),
第二个0与组权限(group)有关,表示从组的权限减0,所以群组的权限也保持默认权限(rw),
最后一位2则与系统中其他用户(others)的权限有关,由于w=2,
所以需要从其他用户默认权限(rw)减去2,也就是去掉写(w)权限,
则其他人的权限为rw - w = r,则创建文件的最终默认权限为 -rw-rw-r-- 。
用法:umask (-p)(-s)(mode)
-p 显示数字的方式
-S 显示字母的方式
例如:
//设置默认的权限为rx,rx,rx//
umask 0222 
 
 
chown归属关系管理
chown(英文全拼: change owner)用于设置文件的所有者和所属组关系
用法:
chown [-选项] 所有者:所属组 文档     #同时修改所有者和所属组身份
chown [-选项] 所有者 文档    #只修改所有者身份
chown [-选项] :所属组 文档    #只修改所属组身份
常用选项:
-R 递归,目录下创建的东西所有者和所属组都和目录一样了
 
 
 
SetUID特殊权限(谨慎使用)
SetUID (SUID):对于一个可执行的文件用了SUID权限后,
普通用户在执行该文件后,临时拥有文件所有者的身份,
该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有身份
SetUID权限会附加在所有者的×权限位上,所有者的×权限标识会变成s(!注意:创建的文件的执行权限位为S时,表示原来文件没有执行权限,如果有执行权限的是小s)
设置SetUID命令格式: chmod u+s 文件名
//可以理解为普通用户可以修改自己的密码,这是因为passwd这个命令暂时成为了root用户权限,
相当于圣旨一样。//
//将cat设置SetUID//
which cat 找出文件路径
chmod u+s 路径文件  
这样普通用户当使用cat时可以暂时使用root
!注意:创建的文件的执行权限位为S时,表示原来文件没有执行权限,如果有执行权限的是小s
 
 
SetGID特殊权限
SetGID (SGID)︰当对一个可执行的二进制文件设置了SGID后,
普通用户在执行该文件时临时拥有其所属组的权限,
该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有组身份
当对一个目录作设置了SGID权限后,普通用户在该目录下创建的文件的所属组,均与该目录的所属组相同
SetGID权限会附加在所属组的×权限位上,所属组的×权限标识会变成s
设置SetGID命令格式: chmod g+s文件名
 
 
SticKY BIT特殊权限
Sticky BIT (SBIT):该权限只针对于目录有效,当普通用户对一个目录拥有w和x权限时,普通用户可以在此目录下拥有增删改的权限,因为普通用户对目录拥有w权限时,是可以删除此目录下的所有文件
如果对一个目录设置了SBIT权限,除了root可以删除所有文件以外,普通用户就算对该目录拥有w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件
SBIT权限会附加在其他人的×权限位上,其他人的×权限标识会变成t
SBIT用法:chmod o+t  目录名
//例如,我想让hello目录下的文件加上SBIT权限,不能让普通用户互相删除文件//
chmod o+t  hello
[root@localhost liudaheng]# ll -d hello/
drwxrwxrwt. 2 root root 6 1月  25 20:58 hello/
 然后用多个用户创建文件然后测试一下
 
 
FACL访问控制列表(简称ACL)
FACL (Filesystenmctl Access Control List)文件系统访问控制列表:利用文件扩展属性保存额外的访问控制权限,单独的为某一个用户量身定制一个权限
命令格式: setfacl  选项  归属关系:权限  文档
常用选项:
-m 设置权限
-x  删除指定用户权限
-b 删除所有用户权限
例如:
//给用户liudaheng设置一个拥有rx权限的ACL,文件名是hello//
setacl -m  u:liudaheng:rx  hello
//查看目录的ACL权限//
getfacl 目录名
用户测试权限就行啦
//删除liudaheng的ACL权限//
setfacl -x u:liudaheng hello
//删除所有用户的特殊权限//
setfacl -b  hello
//用户liudaheng设置为没有任何权限//
setfacl -u:liudaheng:—   hello
 
 
 
常用特殊符号的使用
Linux系统下通配符起到了很大的作用,对于不确定的文档名称可以使用以下特殊字符表示
*常用的特殊符号,在文件名上,用来代表任何多个任意字符
?常用的特殊符号,在文件名上,用来代表任意单个任意字符
[0-9]  #在文件名上,用来代表多个字符或连续范围中的一个,若无则忽略
{a,b,cd,abcd}  #在文件名上,用来代表多组不同的字符串,全匹配(大括号的功能全一些)
例如:
查看etc下以tab结尾的文件
[root@localhost /]# ls /etc/*tab
/etc/anacrontab  /etc/crypttab  /etc/inittab  /etc/rwtab
/etc/crontab     /etc/fstab     /etc/mtab     /etc/statetab
//查看etc下以pass什么d的目录//
[root@localhost /]# ls /etc/pass?d
/etc/passwd
//查看dev下//
[root@localhost /]# ls /dev/tty[1-5]
/dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4  /dev/tty5
[root@localhost /]# ls /dev/tty[3,4,6,7]
/dev/tty3  /dev/tty4  /dev/tty6  /dev/tty7
//查看dev下全匹配//
[root@localhost /]# ls /dev/tty{1,3,5,7,9}
/dev/tty1  /dev/tty3  /dev/tty5  /dev/tty7  /dev/tty9
//匹配1-10//
[root@localhost /]# ls /dev/tty{1…10}
/dev/tty1   /dev/tty2  /dev/tty4  /dev/tty6  /dev/tty8
/dev/tty10  /dev/tty3  /dev/tty5  /dev/tty7  /dev/tty9
[root@localhost /]# ls /dev/tty[1-9]
/dev/tty1  /dev/tty3  /dev/tty5  /dev/tty7  /dev/tty9
/dev/tty2  /dev/tty4  /dev/tty6  /dev/tty8
 
 
grep文件内容过滤
grep用于查找文件中符合条件的字符串,它能利用正则表达式搜索文件中的字符串,并把匹配到的字符串的行打印出来
用法:grep (-选项)“查找条件” 目标文件
常用选项:
-n  以行号的形式输出
-i   忽略字符串大小写
-v  显示不包含匹配的行(排除)
常用正则表达式符号:
^字符串   //显示以该字符串开头的行//
KaTeX parse error: Expected group after '^' at position 23: …/显示以该字符串结尾的行// ^̲          //显示空行//
//查找/etc下passwd文件的带root关键字的//
[root@localhost liudaheng]# grep root /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
roo❌1000:1000:root:/home/roo:/bin/bash
//查找/etc下passwd文件的带root关键字的,带行号//
[root@localhost liudaheng]# grep -n root /etc/passwd
1:root❌0:0:root:/root:/bin/bash
10:operator❌11:0:operator:/root:/sbin/nologin
38:roo❌1000:1000:root:/home/roo:/bin/bash
//排除#的内容//
[root@localhost /]# grep -v ‘#’ /etc/fstab 
 
/dev/mapper/rhel-root   /                       xfs     defaults        1 1
UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot                   xfs     defaults        1 2
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
//显示以#开头的内容//
[root@localhost /]# grep  ‘^#’ /etc/fstab

/etc/fstab

Created by anaconda on Fri Dec 10 16:03:20 2021

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

//将#开头的取反,再将空行取反,然后以行号的显示(用的管道)//
[root@localhost /]# grep -v ‘^#’  /etc/fstab | grep -v ^$  -n
2:/dev/mapper/rhel-root   /                       xfs     defaults        1 1
3:UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot                   xfs     defaults        1 2
4:/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
 
find文件/目录查找命令(这个命令很消耗服务器的cpu,避免高峰期使用)
find命令根据预设的条件递归查找文件或目录所在位置
用法:find 查找路径 查找条件1 查找条件2  …[-exec 处理命令 {} \ ;]
-exec 可接额外的命令来处理查找到结果
{}   代表find查找到的内容放置{}中
;   代表额外处理命令结束
常用查找条件:
-type 类型 (f文件 d目录 l链接文件)
-name “文件名”
-iname 按文件名查找忽略大小写
-size 文件大小 (k,M,G + 大于 - 小于)
-a   两个条件同时满足
-o   两个条件满足任意一个即可
-user  用户名
-mtime 按日期查找 (+代表多少天之前 ,-代表多少天之内,0代表24小时之内)
例如:
//查找类型为目录的在dev下//
[root@localhost /]# find /dev/ -type d
//查看根下的文件,有passwd//
[root@localhost /]# find / -name passwd
find: ‘/run/user/1000/gvfs’: 权限不够
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
//选项组合使用//
[root@localhost ~]# find /etc/ -name passwd -type f
/etc/passwd
/etc/pam.d/passwd
//ls和find查找的区别//
查找/etc/目录下以.conf结尾的文件(只能在/etc这一层路去查找)
[root@localhost ~]# ls /etc/*conf
查找/etc/目录下以.conf结尾的文件(包含所有的子目录)
[root@localhost ~]# find /etc/ -name ‘*conf’ -type f
//查找大于1M的并且是文件的文件//
[root@localhost ~]# find /etc/  -size +1M -type f
/etc/udev/hwdb.bin
/etc/selinux/targeted/policy/policy.29
/etc/brltty/zh-tw.ctb
//查找文件大小为大于10M,并且小于20M的文件//
[root@localhost ~]# find /home -size +10M -a -size -20M -type f
可以查看一下大小,du -h  文件名
//查找两个要求满足其中一个即可//
[root@localhost ~]# find /home -size +10M -o -size -20M -type f
//查找用户的//
[root@localhost ~]# find /home -user liudaheng
//时间查找//
[root@localhost ~]# find /home -mtime +30
//输出的内容存放到指定地方(这里管道不能用)//
[root@localhost /]# find /var/log -mtime -30 -type f -exec cp {} /opt ;
{} 这个括号就代表打印的内容
 
 
 
压缩与解压缩(源文件消失)
Linux独有压缩格式及命令工具:
gzip–> .gz (速度快,压缩比例差,最常用的)
bzip2 --> .bz2  (速快慢一些,压缩比例中等)
xz–> .xz (速度最慢,压缩比例最好)
压缩命令格式:
gzip (-选项)文件名
常用选项:-d  解压缩
bzip2 (-选项)文件名
常用选项:-d 解压缩
xz (-选项)文件名
常用选项:
-d  解压缩
bzcat 压缩的文件名 //查看压缩文件//
压缩比例:gzip<bzip2<xz
 
 
 
tar打包工具(源文件不消失)
tar命令用在linux下用于对文件/目录打包,使用tar程序打出来的包常称为tar包, tar包文件通常都是以.tal结尾
tar命令格式: tar 选项  /路径/压缩包名字   被压缩文件
常用选项:
-c  创建打包文件
-f  指定打包后的文件名称 (这个选项必须在所有选项最后面)
-z 调用gzip压缩工具     -J  调用xz压缩工具     -j  调用bzip2压缩工具
-t  列出打包文档内容
-x  释放打包文件
-C 指定解压路径
-v  显示详细信息
例如:
//压缩文件//
[root@localhost /]# tar -czf hello.tar.zip   /liudaheng/passwd  /etc/passwd
//查看压缩的文件//
[root@localhost liudaheng]# tar -tf 111.tar.zip
passwd
//解压文件,解压到当前目录//
[root@localhost liudaheng]# tar -xf 111.tar.zip -C .
 
 
 
 
分区过程:
添加新硬盘–分区–格式化文件系统–挂载使用
扇区是磁盘存储数据的最小单元,默认一个扇区可以存储512字节的数据
 
 
 
硬盘类型介绍
IDE接口类型:主要用于个人家用计算机领域  (价格便宜,数据传输的速度慢)
SCSI接口类型:主要用于服务器理念关于,数据传输速度快,支持热插拔,主要应用在服务器领域
STAT接口类型:主要用于个人加用计算机领域
NVMe接口类型:固态硬盘接口
光纤通道接口:是一种用于高速存储设备以及存储网络的连接协议,在光纤通道网络上传输小型计算机系统接口命令的高速串行接口
 
Linux常用分区格式
MBR分区格式:比较古老的分区格式,分为,只能划分四个主分区,与扩展分区(容器)逻辑分区
最大支持2.2T以内磁盘容量
IDE接口硬盘逻辑分区最多可以划分59个
SCSI接口硬盘逻辑分区最多可以划分11个
GPT分区格式:可划分128个主分区,最大支持18EB磁盘容量(1EB=1024PB,1PB=1024TB,1TB=1024GB)
 
文件系统类型详解
文件管理系统,赋予分区文件系统分区才可以正常使用,根文件系统,多少个多少个文件系统
centos5:分区默认使用的文件系统是ext3
centos6:分区默认使用的文件系统是ext4
ext4:有日志记录的功能,如果系统意外的宕机了,通过日志记录把没有保存的数据,在系统再次重启时快速的恢复回来
ext4:单个文件系统最大支持1EB的分区容量,单个文件最大可以存储16TB的数据
centos7:分区默认使用的文件系统是xfs
xfs:开启了日志记录的功能,数据恢复的时候要比ext4的要快
xfs:单个文件系统最大支持8EB的分区容量,单个文件最大可以存储500TB的数据
xfs:单个文件每秒读写数据的速度可以达到4G
swap文件系统:交换分区,硬盘空间去充当内存去使用
 
 
分区挂载
在linux系统中用户是无法直接使用硬件设备的,硬件设备都是系统以只读的方式存在的,必须挂载
挂载就是给我们用户提供一个可以使用设备的一个接口
挂载的注意事项:
挂载点必须是一个目录,理论上来讲,还得是一个空目录
一个文件系统不允许重复挂载到多个目录下的
一个目录不允许重复挂载多个文件系统
 
 
lsblk查看系统所有磁盘信息
lsblk (英文全拼: list block) 用于列出当前系统所有磁盘与磁盘内的分区信息
用法:lsblk (-选项)(设备名)
常用选项:
-d  //仅显示磁盘本身,不会列出磁盘的分区数据//
-f   //列出磁盘分区使用的文件系统类型//
-l   //使用列表格式显示//
lsblk命令示例:
[root@localhost ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda             8:0    0   20G  0 disk
├─sda1          8:1    0  500M  0 part /boot
└─sda2          8:2    0 19.5G  0 part
  ├─rhel-root 253:0    0 17.5G  0 lvm  /
  └─rhel-swap 253:1    0    2G  0 lvm  [SWAP]
sr0            11:0    1    4G  0 rom  /run/media/roo/RHEL-7.0 Server.x86_64
解释:
NAME #设各名称#
MAJ : MIN #主设备号:次设备号,内核通过主次设备号识别磁盘#
RM    #是否为可卸载设备,1可卸载,0不可卸载#
SIZE   #设备的容量大小#
RO     #表示设备是否为只读,0非只读设备,1只读设备#
TYPE  #表示设备类型(disk为磁盘,part为分区,lvm逻辑卷,rom只读)#
MOUNTPOINT   #设备挂载点 ( SWAP没有挂载点)#
sda1:sd: SCSI 磁盘接口类型,sda:a代表第一块磁盘,1:代表第一个分区
sdb2:sd: SCSI 磁盘接口类型,sdb:b代表第一块磁盘,2:代表第二个分区
例如:
[root@localhost ~]# lsblk -d /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda    8:0    0  20G  0 disk
 
 
 
df命令查看分区使用情况
df命令用于查看文件系统使用情况
用法:df  (-选项)(参数)
常用选项:
-h   以人类易读方式显示文件系统容量
-T     显示文件系统类型
例如:
[root@localhost ~]# df
文件系统                 1K-块    已用     可用 已用% 挂载点
/dev/mapper/rhel-root 18348032 3120248 15227784   18% /
devtmpfs                926076       0   926076    0% /dev
tmpfs                   935356     148   935208    1% /dev/shm
tmpfs                   935356   17300   918056    2% /run
tmpfs                   935356       0   935356    0% /sys/fs/cgroup
/dev/sda1               508588  121284   387304   24% /boot
/dev/sr0               4138442 4138442        0  100% /run/media/roo/RHEL-7.0 Server.x86_64
[root@localhost ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   18G  3.0G   15G   18% /
devtmpfs               905M     0  905M    0% /dev
tmpfs                  914M  148K  914M    1% /dev/shm
tmpfs                  914M   17M  897M    2% /run
tmpfs                  914M     0  914M    0% /sys/fs/cgroup
/dev/sda1              497M  119M  379M   24% /boot
/dev/sr0               4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
[root@localhost ~]# df -h /
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   18G  3.0G   15G   18% /
[root@localhost ~]# df -Th
文件系统              类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root xfs        18G  3.0G   15G   18% /
devtmpfs              devtmpfs  905M     0  905M    0% /dev
tmpfs                 tmpfs     914M  148K  914M    1% /dev/shm
tmpfs                 tmpfs     914M   17M  897M    2% /run
tmpfs                 tmpfs     914M     0  914M    0% /sys/fs/cgroup
/dev/sda1             xfs       497M  119M  379M   24% /boot
/dev/sr0              iso9660   4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
 
 
du命令统计文件/目录大小
du命令用于统计磁盘下目录或文件大小
用法:du (-选项)(参数)
常用选项:
-h  以人类易读方式(KB,MB,GB)
-s   只统计每个参数的总数
例如:
[root@localhost ~]# du -h /liudaheng/
20K     /liudaheng/
 
 
 
blkid查看设备属性
blkid命令显示块设备属性信息(设备名称,设备UUID,文件系统类型)
用法:blkid (-选项)(参数)
例如:
//查看所有的设备属性信息//
[root@localhost ~]# blkid
/dev/sda1: UUID=“e7023a32-d275-4a37-b26d-47808f21f871” TYPE=“xfs”
/dev/sda2: UUID=“CqIToj-MKY1-hPz7-hPst-GwPI-fUfv-fjTXyc” TYPE=“LVM2_member”
/dev/sr0: UUID=“2014-04-09-14-14-56-00” LABEL=“RHEL-7.0 Server.x86_64” TYPE=“iso9660” PTTYPE=“dos”
/dev/mapper/rhel-root: UUID=“9dd77a08-0006-4456-93b1-bb853c6609ae” TYPE=“xfs”
/dev/mapper/rhel-swap: UUID=“9aee733d-8ea0-44b9-8796-9538cf365ef2” TYPE=“swap”
//查看sda1设备属性信息//
[root@localhost ~]# blkid  /dev/sda1
/dev/sda1: UUID=“e7023a32-d275-4a37-b26d-47808f21f871” TYPE=“xfs”
 
 
 
/dev/目录下的文件详解
hd[a-t]: IDE设备
sd[a-z]: SCSI设备
fd[o-7]:软盘驱动设备
md[0-32]:软RAID设备
loop[0-7]:本地回环设设备
lp[0-3]:打印机设备
mem:内存设备
null:空设备,也称为黑洞,任何写入的数据都将被丢弃
zero:零资源设备,任何写入的数据都将被丢弃
full:满设备,任何写入的数据都将失败
tty[0-63]:虚拟终端设备
random:随机数设备
urandom:随机数设备
port:存取I/O端口
 
 
 
 
MBR分区格式
fdisk命令用于查看磁盘使用情况和磁盘分区(MBR分区格式)
用法:fdisk (-选项)(设备路径)
常用选项:-l  列出磁盘分区表类型与分区信息
分区
[root@localhost ~]# fdisk /dev/sdb
m  获取命令帮助
p   显示磁盘分区表
n   新增加一个分区
q   不保存分区退出
d   删除一个分区
w   保存分区退出
a   设置可引导标记
b   编辑bsd磁盘标签
c   设置DOS操作系统兼容标记
l    显示已知的文件系统类型,82为swap交换系统,83为linux分区
o   建立空白DOS分区表
s   新建空白SUM磁盘标签
t    改变分区的系统ID
u   改变显示记录单位
v   验证分区表
x   附加功能
例如:
[root@localhost /]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
 
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
 
Device does not contain a recognized partition table
使用磁盘标识符 0xe9659bd7 创建新的 DOS 磁盘标签。
 
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB
 
命令(输入 m 获取帮助):p
 
磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xe9659bd7
 
   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   83  Linux
 
//创建扩展分区//
命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): e
分区号 (2-4,默认 2):2
起始 扇区 (2099200-20971519,默认为 2099200):
将使用默认值 2099200
Last 扇区, +扇区 or +size{K,M,G} (2099200-20971519,默认为 20971519):
将使用默认值 20971519
分区 2 已设置为 Extended 类型,大小设为 9 GiB
 
//删除分区//
命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除
 
//保存//
命令(输入 m 获取帮助):w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
正在同步磁盘
 
 
 
 
格式化文件系统
mkfs命令用于在分区上建立文件系统
常用文件系统类型:
ext4 ,xfs
命令格式:
mkfs.xfs 分区设备路径   //格式化为xfs类型文件//
mkfs.ext4 分区设备路径  //格式化为ext4类型文件//
例如:
[root@localhost /]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376
 
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
 
 
 
mount挂载 (不是永久的)
mount文件系统挂载命令
用法:mount  设备路径 挂载点目录
常用选项:
-a   依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-o   该选项后边可跟挂载时额外参数
remount命令:重新挂载文件系统,在文件系统出错时或重新挂载文件系统时非常重要,
例如:
[root@localhost /]# mount  /dev/sdb1  /guazaidian/
 
分区总步骤总结:
添加硬盘–查看系统是否识别新硬盘  lsblk 
划分分区–fdisk   设备路径
格式化文件系统–mkfs.xfs
挂载–创建挂载点目录–挂载  mount  设备路径 挂载点目录
查看分区使用情况:df  -hT
 
 
umount卸载文件系统
umount命令用于卸载文件系统
用法:umount 挂载点目录
例如:
[root@localhost /]# mount /dev/sdb1 /guazaidian/
[root@localhost /]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   18G  3.0G   15G   18% /
devtmpfs               905M     0  905M    0% /dev
tmpfs                  914M  148K  914M    1% /dev/shm
tmpfs                  914M  9.0M  905M    1% /run
tmpfs                  914M     0  914M    0% /sys/fs/cgroup
/dev/sda1              497M  119M  379M   24% /boot
/dev/sr0               4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/sdb1              976M  2.6M  907M    1% /guazaidian
[root@localhost /]# umount /guazaidian/
[root@localhost /]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   18G  3.0G   15G   18% /
devtmpfs               905M     0  905M    0% /dev
tmpfs                  914M  148K  914M    1% /dev/shm
tmpfs                  914M  9.0M  905M    1% /run
tmpfs                  914M     0  914M    0% /sys/fs/cgroup
/dev/sda1              497M  119M  379M   24% /boot
/dev/sr0               4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
 
 
 
 
永久挂载文件系统,开机自动挂载(直接去修改配置文件)
/etc/fstab用于存放文件系统信息,当系统启动时,系统会自动读取文件内容将指定的文件系统挂载到指定的目录
[root@localhost /]# vim /etc/fstab
 #

/etc/fstab

Created by anaconda on Fri Dec 10 16:03:20 2021

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

/dev/mapper/rhel-root   /                       xfs     defaults        1 1
UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot                   xfs     defaults        1 2
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
/dev/sdb1               /guazaidian             ext4     defaults       0 0
#解释:该文件内容为6个字段,每个字段详解如下
第一个字段:要挂载的设备路径
第二个字段:挂载点目录
第三个字段:设备文件系统类型
第四个字段:挂载参数,参数如下l
sync,async:此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步(async)
atime,noatime:更新访问时间/不更新访问时间,访问分区时,是否更新文件的访问时间,默认为更新
ro,rw:挂载文件为只读(ro)或读写(rw),默认为rw
auto,noauto:自动挂载/手动挂载,执行mount -a时,是否自动挂载/etc/fstab文件内容,默认为自动(auto)
dev,nodev:是否允许此文件系统上,可建立装置文件,默认为允许(dev)
suid,nosuid:是否允许文件系统上含有sUID与SGID特殊权限,默认为允许(SUID)
exec,noexec:是否允许文件系统上拥有可执行文件,默认为允许(exec)
user,nouser:是否允许普通用户执行挂载操作,默认为不允许(nouser) ,只有root用户可以挂载分区
defaults默认值:代表async,rw, auto,dev,suid,exec,nouser七个选项
第五个字段:是否对文件系统进行备份,0不备份,1为备份
第六个字段:是否检查文件系统顺序,允许的数字是0,1,2,0表示不检查,1的优先权最高
完成后需要重新重启配置文件才生效,不想重启看下面的命令:
mount 常用选项:
-a   依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-o   该选项后边可跟挂载时额外参数
remount命令:重新挂载文件系统,在文件系统出错时或重新挂载文件系统时非常重要,
挂载完了,使用mount -a 就不需要重启了
 
 
 
 
GPT分区格式
gdisk命令用于查看磁盘使用情况和磁盘分区(GPT分区格式)
用法:gdisk (-选项) (设备路径)
常用选项:-l  列出磁盘分区表类型与分区信息
例如:
[root@localhost /]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.6
 
Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing ‘q’ if
you don’t want to convert your MBR partitions to GPT format!


Command (? for help): ?
b       back up GPT data to a file
c       change a partition’s name
d       delete a partition //删除一个分区//
i       show detailed information on a partition
l       list known partition types
n       add a new partition   //新增加一个分区//
o       create a new empty GUID partition table (GPT)
p       print the partition table //常用的,显示磁盘分区表//
q       quit without saving changes   //不保存分区退出//
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition’s type code
v       verify disk
w       write table to disk and exit   //保存分区退出//
x       extra functionality (experts only)
?       print this menu
//增加分区,可以看到能添加128块分区,这个分区还是非常强大的//
 Command (? for help): n
Partition number (2-128, default 2):
//整体来看一下//
Command (? for help): n   (创建分区)
Partition number (1-128, default 1):   (这里选择分区号,回车即可)
First sector (34-20971486, default = 2048) or {±}size{KMGTP}:   (输入起始扇区,默认2048开始)
Last sector (2048-20971486, default = 20971486) or {±}size{KMGTP}: +1G   (#输入新增分区的大小,可以通过扇区数来增加,也可以通过+size{KMGTP}方式来增加)
Current type is ‘Linux filesystem’
Hex code or GUID (L to show codes, Enter = 8300):   (这里要求输入分区的类型,直接回车就行)
Changed type of partition to ‘Linux filesystem’
 
Command (? for help): p  (显示分区)
Disk /dev/sdb: 20971520 sectors, 10.0 GiB   (磁盘总容量)
Logical sector size: 512 bytes
Disk identifier (GUID): AE3CC833-A089-43C9-9C07-412211F8BFBC
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 18874301 sectors (9.0 GiB)   (磁盘的剩余容量)
 
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2099199   1024.0 MiB  8300  Linux filesystem
Command (? for help): w   (保存退出,不想保存输入q退出)
 
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
 
Do you want to proceed? (Y/N): y    (这里选择yes即可,允许继续的意思)
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.   (写入成功)
//格式化文件系统//
mkfs.xfs /dev/sdb1
//查看文件系统类型//
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID=“58c8eb49-9d66-4d05-b701-f78a0b432991” TYPE=“ext4” PARTLABEL=“Linux filesystem” PARTUUID=“10ccb34c-d2d7-4529-a74c-14eab9b4f55d”
//创建挂载的文件,并挂载//
[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/sdb1 /web
[root@localhost ~]# df -hT
文件系统              类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root xfs        18G  3.0G   15G   18% /
devtmpfs              devtmpfs  905M     0  905M    0% /dev
tmpfs                 tmpfs     914M  148K  914M    1% /dev/shm
tmpfs                 tmpfs     914M  9.0M  905M    1% /run
tmpfs                 tmpfs     914M     0  914M    0% /sys/fs/cgroup
/dev/sda1             xfs       497M  119M  379M   24% /boot
/dev/sr0              iso9660   4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/sdb1             xfs      976M  2.6M  907M    1% /web
//永久挂载呢,就直接去修改配置文件//
[root@localhost ~]# vim /etc/fstab
 
 
 
 
LVM逻辑卷(缺点是数据损坏不容易恢复)
逻辑卷:IVM (Logical Volume Manager)逻辑卷管理系统
逻辑卷可以实现将底层的物理分区整合成一个大的虚拟硬盘
逻辑卷的技术是通过linux系统内核dm(device mapper)设备映射组件
创建逻辑卷命令:
    功能                     物理卷管理          卷组管理        逻辑卷管理
scan  扫描                  pvscan             vgscan              lvscan
create 创建                pvcreate           vgcreate           lvcreate
display  显示              pvdisplay         vgremove         lvdisplay
remove 删除              pvremove         vgextend          lvremove
extend   扩展                                                             lvextend
!注意:物理卷:centos6的时候创建需要创建物理卷,centos7不需要了
例如:
[root@localhost ~]# vgcreate liudahengdejuan /dev/sdb1 /dev/sdb2  /dev/sdb3
[root@localhost ~]# vgdisplay liudahengdejuan
  — Volume group —
  VG Name               liudahengdejuan    //卷的名字//
  System ID            
  Format                lvm2         //卷的格式//
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               2.99 GiB     //卷的大小//
  PE Size               4.00 MiB
  Total PE              765
  Alloc PE / Size       0 / 0  
  Free  PE / Size       765 / 2.99 GiB
  VG UUID               kz1G51-8dzB-d6q7-0QwE-jtv5-TixH-2Q70aZ   //卷的UUID,系统识别的一个编号//
//简要的显示卷组的信息查看//
[root@localhost ~]# vgs liudahengdejuan 
  VG              #PV #LV #SN Attr   VSize VFree
  liudahengdejuan   3   0   0 wz–n- 2.99g 2.99g
//创建lv逻辑卷//
[root@localhost ~]# lvcreate -L 1G -n liudahengdelv liudahengdejuan 
  Logical volume “liudahengdelv” created
-L:指定大小
-n:lv逻辑卷的名字
查看一下:
[root@localhost ~]# lvs
  LV            VG              Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
  liudahengdelv liudahengdejuan -wi-a-----  1.00g                                            
  root          rhel            -wi-ao---- 17.51g                                            
  swap          rhel            -wi-ao----  2.00g                                        
也可以这么查看:
[root@localhost ~]# lvs /dev/liudahengdejuan/liudahengdelv
  LV            VG              Attr       LSize Pool Origin Data%  Move Log Cpy%Sync Convert
  liudahengdelv liudahengdejuan -wi-a----- 1.00g                                  
//然后再格式化//
[root@localhost ~]# mkfs.xfs /dev/liudahengdejuan/liudahengdelv
//查看系统文件类型// 
[root@localhost ~]# blkid /dev/liudahengdejuan/liudahengdelv
/dev/liudahengdejuan/liudahengdelv: UUID=“86717dc5-0e68-4e02-9e7e-7716e5b5d381” TYPE=“xfs”
//创建挂载点,挂载,使用//
[root@localhost ~]# mkdir /liudaheng
[root@localhost ~]# mount /dev/liudahengdejuan/liudahengdelv /liudaheng
[root@localhost ~]# df -Th
文件系统                                  类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root                     xfs        18G  3.0G   15G   18% /
devtmpfs                                  devtmpfs  905M     0  905M    0% /dev
tmpfs                                     tmpfs     914M   92K  914M    1% /dev/shm
tmpfs                                     tmpfs     914M  9.0M  905M    1% /run
tmpfs                                     tmpfs     914M     0  914M    0% /sys/fs/cgroup
/dev/sr0                                  iso9660   4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/mapper/liudahengdejuan-liudahengdelv xfs      1014M   33M  982M    4% /liudaheng
//扩容lv逻辑卷,支持线上扩容,就是使用的时候可以直接扩容//
[root@localhost ~]# lvextend -L +100MB  /dev/liudahengdejuan/liudahengdelv
  Extending logical volume liudahengdelv to 1.10 GiB
  Logical volume liudahengdelv successfully resized
//查看扩容的情况//
[root@localhost ~]# lvs
  LV            VG              Attr       LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
  liudahengdelv liudahengdejuan -wi-ao----  1.10g                                            
  root          rhel            -wi-ao---- 17.51g                                            
  swap          rhel            -wi-ao----  2.00g               
//扩容了还要扩展文件系统,要不然无法使用//
当逻辑卷扩大以后,也需要多逻辑卷的文件系统进行扩展
刷新文件系统容量:
xfs_growfs  //用于刷新XFS设备//
resize2fs    //用于刷新EXT3,EXT4设备//
–命令格式:xfs_growfs 挂载点目录
[root@localhost ~]# xfs_growfs /dev/liudahengdejuan/liudahengdelv 
meta-data=/dev/mapper/liudahengdejuan-liudahengdelv isize=256    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 262144 to 287744
 
           
 
 
扩展文件系统
当逻辑卷扩大以后,也需要多逻辑卷的文件系统进行扩展
刷新文件系统容量:
xfs_growfs  //用于刷新XFS设备//
resize2fs    //用于刷新EXT3,EXT4设备//
–命令格式:xfs_growfs 挂载点目录
[root@localhost ~]# xfs_growfs /liudaheng
meta-data=/dev/mapper/liudahengdejuan-liudahengdelv isize=256    agcount=5, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=287744, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
//再查看一下//
[root@localhost ~]# df -Th
文件系统                                  类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root                     xfs        18G  3.0G   15G   18% /
devtmpfs                                  devtmpfs  905M     0  905M    0% /dev
tmpfs                                     tmpfs     914M   92K  914M    1% /dev/shm
tmpfs                                     tmpfs     914M  9.0M  905M    1% /run
tmpfs                                     tmpfs     914M     0  914M    0% /sys/fs/cgroup
/dev/sr0                                  iso9660   4.0G  4.0G     0  100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/mapper/liudahengdejuan-liudahengdelv xfs       1.1G   33M  1.1G    3% /liudaheng  //这里就显示成1.1G了,原来是1G//
 
//扩容卷组//
vgextend   组名   /dev/磁盘  
 
 
 
删除逻辑卷
逻辑卷的删除不允许联机操作,需要先卸载,在执行删除
在执行删除操作时,首先删除LV逻辑卷,再删除VG卷组,最后删除PV物理卷
删除命令:lvremove   逻辑卷路径
步骤:
1:umount  卸载挂载
2:lvremove   逻辑卷路径
删除卷组:
1:vgremove   卷组名字
 
 
 
逻辑卷的缩减
命令:lvreduce
不允许联机缩减
先缩减文件系统的空间,然后再缩减逻辑卷的空间
 
 
 
 
 
RAID磁盘阵列
RAID中文全称:独立磁盘冗余阵列,简称磁盘阵列
RAID可通过技术(软件/硬件)将多个独立的磁盘整合成一个巨大容量大逻辑磁盘使用
RAID可以提高数据I/O(读写)速度,和冗余数据的功能
 
RAID级别
RAIDO:等量存储,至少由2块磁盘组成,同一个文档等量存放在不同的磁盘并行写入数据来提高效率,但只是单纯的提高效率,并没有冗余功能,如果其中一块盘故障,数据会丢失,不适合存放重要数据
RAID1:完整备份,至少由两块磁组成,同一个文档复制成多份存储到不同磁盘提高可靠性,读写速度没有提升,适合存储重要的数据(以磁盘容量最小的为准,就是100G的磁盘和200G的磁盘,实际上还是100G)
RAID2:至少由3块磁盘组成,数据分散存储在不同磁盘,在读写数据时需要对数据时时校验,由于采用的校验算法复杂,数据量比原有数据增大,而且导致硬件开销较大
RAID3:至少由三块磁盘组成,同一份文档分散写入不同的磁盘,校验数据单独存放在另外一块磁盘,由于每次读写操作都会访问校验盘,容易导致校验盘长时间高负荷工作而挂掉,如果校验盘损坏数据将无法恢复
RAID4:与RAID3类似,至少由3块磁盘组成,同一份文档分散存写入不同磁盘,校验数据单独存放在另外一块磁盘,由于每次读写操作都会访问校验盘,容易导致校验盘长时间高负荷工作而挂掉,如果校验盘损坏数据将无法恢复,与RAID3的区别是数据分割方式不一样
RAID5:至少由3块磁盘组成,同一份文档分散写入不同磁盘,每个硬盘都有校验数据,其中校验数据会占用磁盘三分之一的空间,三分之二的空间存放原始数据,允许同时坏一块磁盘当一块磁盘损坏,其他磁盘里的数据配合校验信息可将数据恢复回来
磁盘空间最好一致,因为他们会以最小的磁盘空间来作为准空间,比如2T,4T,4T的磁盘,那这么使用的话就成了2T,2T,2T
RAID6:至少由4块磁盘组成,同一份文档分散写入不同磁盘,每个磁盘都有校验数据,由于采用双校验算法,所以校验数据量是RAID5的两倍,需要占用2块磁盘空间存放校验数据,两块盘存放原始数据,由于数据校验的算法计算量偏大,所以在速写速度上没有RAID5快,允许同时坏2块磁盘
RAID7︰美国SCC公司专利 ,花钱
RAID10:RAID10=RAID1+RAIDO合二为一,最少需要4块磁盘,先将4块硬盘组成两组RAID1,在将两组RAID1组成一个RAIDO,既提高数据读写速度,又能保障数据安全性,缺点是可用容量是总容量的一半
 
 
 
实现RAID方式
实现RAID通常有三种方式,通过软件技术实现RAID功能(软RAID)
RAID功能外接式磁盘阵列柜,被常用在大型服务器上,不过这类产品价格昂贵
RAID磁盘阵列卡,分为服务器自带和额外安装,硬RAID比软RAID更安全稳定,RAID卡带有缓存功可实现数据自动恢复,RAID卡带有电池
 
 
 
 
 
 
进程管理
什么是程序:用计算机语言编写的命令序列集合,用来实现特定的目标或者解决特定的问题,程序占用的是磁盘的空间,程序是静态的并且是永久的
什么是进程:正在运行中的程序叫做进程,进程有自己的独立内存空间,每启动一个进程,系统就会为它分配
空间并分配一个PID号,每个进程都会对应一个父进程,而父进程可以复制多个子进程,每种进程都有两种
方式存在,前台与后台,一般进程都是以后台的方式运行,内存占用的是内存空间,进程是动态的,进程是有生命周期的
什么是线程:线程也被称为轻量级进程,被包含在进程中,是进程的一个子集,是进程中的实际运作单位,
一个进程中可以并发多个线程,每条线程并行执行不同的任务,每个线程都是独立的,
线程之间共享进程的内存空间,在多线程的程序中,由于线程很“轻",
故线程的切换非常迅速且开销小(在同一进程中)
 
 
 
 
pstree命令查看进程树
pstree以树状结构显示进程信息,包括进程之间的关系
常用格式:pstree  (-选项) (参数)
常用选项:
-p    显示进程PID
-a    显示完整的命令行
-u    列出每个进程所属账号名称
//显示进程信息//
[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
centos7版本:天父进程是systemd ,就是根
centos6版本:天父进程是init , Apstart
centos5版本:天父进程init
//以PID的形式显示进程信息//
[root@localhost ~]# pstree -p
//组合使用//
[root@localhost ~]# pstree -pu
//查看指定用户的进程//
[root@localhost ~]# pstree -pu liudaheng
 
 
 
ps aux:unix格式静态查看系统进程,查看系统所有进程信息
常用选项:(没有横杠是因为是unix系统)
a    显示当前终端所有进程
u    以用户格式输出
x    当前用户在所在终端下的进程
ps -ef :linux格式静态查看系统进程,查看系统所有进程信息
-e   显示系统所有进程
-l    以长格式输出信息
-f    显示最完整的进程信息
//显示系统进程//
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
字段介绍:
USER  进程属于哪个用户
PID   进程PID号
%cpu    进程占用cpu资源百分比
%MEM   进程占用物理内存百分比
VSZ   进程使用掉的虚拟内存量(单位:kb)
RSS    进程占用固定内存量 (单位:kb)
TTY   进程在哪个终端运行,如果内核直接调用则显示”?“,tty1-tty6表示本机终端登录的用户进程,pts/0-255则表示远程终端登录用户的进程
STAT:进程状态:R (运行),S (休眠), s 包含子进程,  T (停止), Z (僵尸)   , + (后台进程)
START:进程启动时间
TIME:占用cpu运算时间
COMMAND:产生进程的命令
//查看系统所有进程用ps  -ef//
[root@localhost ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
PPID:该进程的父进程的ID号
 
 
 
top查看系统健康状态
top命令动态来查看系统运行性能及状态信息
命令格式:top  (-选项)
常用选项 :-d   指定刷新秒数,默认为3秒刷新一次
交互界面显示指令:
键盘上下键翻行
h   获取交互模式帮助
P(大写)     按照CPU使用资源排序
M     按照内存使用资源排序
q     退出
//显示系统,3秒更新//
[root@localhost ~]# top -d 3
top - 22:10:37 up 10 days,  4:19,  4 users,  load average: 0.03, 0.05, 0.05
Tasks: 504 total,   1 running, 503 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.7 us,  6.7 sy,  0.0 ni, 86.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1870716 total,  1394608 used,   476108 free,     1128 buffers
KiB Swap:  2097148 total,        0 used,  2097148 free.   365216 cached Mem
#第一行top每个字段含义#
22:10:37:当前系统时间
up 10 days 4:19 :系统运行时间,运行了10天4小时19分钟了
4 users:当前系统登录用户数量
load average: 0.03, 0.05, 0.05:cpu1分钟,5分钟,15分钟之前平均负载量,根据cpu核数判断系统cpu负载量,1核cpu若高于1代表负载过高,2核cpu若高于2代表负载过高,以此类推。。
#第二行Tasks每个字段含义如下#
504 total:当前系统中进程的总数量
1 running:正在运行的进程数量
503 sleeping:正在睡眠的进程数量
0 stopped:正在停止的进程数量
0 zombie:僵尸进程数量,僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
 
//查找僵尸进程与父进程//
ps -A -o  stat,ppid,pid,cmd   | grep  “^Zz”
命令解释:
-A 参数列出所有进程
-o  自定义输出字段,我们设定显示字段为 stat (状态),ppid(父进程id),pid (进程id),cmd (命令)这四个参数,因为状态为Z或者z的进程
为僵尸进程,所以我们使用grep和stat状态为zZ进程
//杀死进程//
kill  -9   +父进程号
//第三行%cpu(s)每个字段含义如下://
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
o.o us:用户占用的CPU百分比
o.o sy:系统占用的CPU百分比
0.0 ni:改变过优先级的用户进程占用的CPU百分比
99.8 id:空闲的CPU百分比(重点关注,大了就空闲,如果小那就比较忙了,比如10,表示非常忙)
0.0 wa:等待输入/输出的进程的占用CPU百分比
0.0 hi:硬中断请求服务占用的CPU百分比
0.0 si:软中断请求服务占用的CPU百分比
0.0 st:虚拟时间百分比,当有虚拟机时,虚拟cpu等待实际cpu的时间百分比
//第四行的字段含义//
KiB Mem:   1870716 total,   945040 used,   925676 free,      928 buffers
total:物理内存总量,单位KB
free : 空闲内存总量,单位KB
used :  已使用的内存总量,单位KB
buffers : 块设备与普通文件占用的缓存数量
//第五行的字段含义//
KiB Swap:  2097148 total,        0 used,  2097148 free.   342576 cached Mem
total:交换空间总量,单位KB
free :空闲交换空间总量,单位KB
used :已经使用的交换空间总量,单位KB
Mem:可用于进程下一次分配的物理内存数量
//第六行每个字段含义如下//
PID : 进程PID号
USER :进程所有者的用户名
PR : 进程优先级执行顺序,越小越优先被执行
NI :负值表示高优先级,正值表示低优先级,越小越优先被执行(比如0是最大的)
VIPT :进程使用的虚拟内存总量,单位kb
RES : 进程使用的,未被换出的物理内存大小,单位kb
SHR : 共享内存大小,单位kb
S:进程状态。D=不可中端的睡眠状态,R=运行 ,S=睡眠,T=跟踪/停止,Z=僵尸进程
%CPU:进程使用的CPU百分比
%MEM:进程使用的物理内存百分比
TIME+ : 进程使用的CPU时间总计,单位1/100秒
COMMAND:命令名/命令行
 
 
 
检索进程
pgrep 通过匹配其程序名,找到匹配的进程
命令格式:pgrep  (-选项) (参数)
常用选项:
-l   输出进程名与PID
-U  检索指定用户进程
-t    检索指定终端进程
-x   精确匹配完整进程名
//过滤sshd进程//
[root@localhost ~]# pgrep sshd
1620
3923
[root@localhost ~]# pgrep -l sshd
1620 sshd
3923 sshd
这里是加l的区别,就是显示名字
//检索liudaheng用户的进程//
[root@localhost ~]# pgrep -lU  liudaheng
4525 sshd
4527 bash
//查看终端所有终端用户//
[root@localhost ~]# who
roo      :0           2022-02-02 15:05 (:0)
roo      pts/0        2022-02-02 15:05 (:0)
root     pts/1        2022-02-02 15:06 (192.168.59.1)
liudaheng pts/2        2022-02-02 15:45 (192.168.59.1)
//检索用户的指定终端的进程//
[root@localhost ~]# pgrep -lU liudaheng -t pts/2
4527 bash
//精确匹配//
[root@localhost ~]# pgrep -x ssh
 
 
 
 
进程的前后台调度(jobs,bg,fg)
&  将进程放入后台运行
jobs -l  查看后台进程列表
fg 进程编号   将后台进程恢复至前台运行
ctrl+z 组合键    挂起当前进程并放入后台
bg 进程编号     激活后台被挂起进程
//将命令放入后台运行//
[root@localhost ~]# sleep 10 &
[1] 4779
//查看所有后台运行//
[root@localhost ~]# jobs -l
[1]+  4779 运行中               sleep 10 &
//恢复到前台//
[root@localhost ~]# fg 1
-bash: fg: 任务已经终止
[1]+  完成                  sleep 10
 
 
 
杀死进程kill命令(系统的进程尽量不要动)
杀死进程的方式
ctrl +c 组合键结束当前命令程序
kill  (-选项) PID
常用选项:
-l   #列出可用进程信号#
常用信号:
-1    #重启进程#
-9    #强制杀死进程#
-15    #正常杀死进程(默认信号无需指定)#
killall -9 进程号   #强制杀死进程#
killall    -9   -u   用户名   #强制杀死该用户所有用户#
pkill   -9  进程名     #强制杀死进程#(who查看终端号,配合-t选项使用)
常用选项:-t  终端号   #踢出终端用户#
//将liudaheng用户提出进程//
[root@localhost ~]# killall -9 -u liudaheng
//杀死终端//     (who查看终端)
[root@localhost ~]# pkill -9 -t pts/2
 
 
 
用户登录分析
users  和  who  和  w#查看已登录的用户信息#(详细度不同)
last   #显示登录成功的用户信息#
lastb  #显示登录失败的用户信息#
//以下是各个命令的详细程度//
[root@localhost /]# users
roo roo root
[root@localhost /]# who
roo      :0           2022-02-04 11:39 (:0)
roo      pts/0        2022-02-04 11:39 (:0)
root     pts/1        2022-02-04 11:39 (192.168.59.1)
第一列:已经登录系统的用户名
第二列:用户登录的终端编号
第三列:登录时间
第四列:远程登录地址
[root@localhost /]# w
 11:56:28 up 41 min,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
roo      :0        11:39   ?xdm?   1:26   0.13s gdm-session-worker [pam/gdm-password]
roo      pts/0     11:39   17:00   0.06s  0.06s /bin/bash
root     pts/1     11:39    4.00s  0.10s  0.00s w
第一行:为top命令显示的第一行数据
第二行:
USER:已经登录的用户名
TTY:用户登录的终端编号
FROM:登录地址
LOGIN@:登录时间
IDLE:用户空闲时间,这是个计数器,一旦用户执行任何操作,该计时器便会被重置
JCPU:该终端所有进程占用CPU处理时间,包括正在运行和后台作业占用时间
PCPU:进程执行以后消耗的CPU时间
WHAT:当前正在执行的任务
//last命令注释,显示登录成功的用户//
[root@localhost /]# last
liudahen pts/2        192.168.59.1     Fri Feb  4 12:05   still logged in  
root     pts/1        192.168.59.1     Fri Feb  4 11:39   still logged in  
roo      pts/0        :0               Fri Feb  4 11:39   still logged in  
roo      :0           :0               Fri Feb  4 11:39   still logged in  
(unknown :0           :0               Fri Feb  4 11:14 - 11:39  (00:24)   
reboot   system boot  3.10.0-121.el7.x Fri Feb  4 11:14 - 12:05  (00:50)   
liudahen pts/2        192.168.59.1     Wed Feb  2 16:34 - crash (1+18:40)  
第一列:用户名
第二列:用户登录终端编号
第三列:登录地址
第四列:登录起始时间
第五列:登录结束时间
第六列:登录持续时间
//查看最近两次登录系统的用户//
[root@localhost /]# last -2
liudahen pts/2        192.168.59.1     Fri Feb  4 12:05   still logged in  
root     pts/1        192.168.59.1     Fri Feb  4 11:39   still logged in  
 
wtmp begins Sat Dec 11 00:19:31 2021
//查看登录失败的用户//
[root@localhost /]# lastb
liudahen ssh:notty    192.168.59.1     Fri Feb  4 12:10 - 12:10  (00:00)   
liudahen ssh:notty    192.168.59.1     Fri Feb  4 12:10 - 12:10  (00:00)   
 
btmp begins Fri Feb  4 12:10:07 2022
 
 
 
 
Linux软件包的分类
源码包
二进制包(RPM包)
源码包特点:
源码包的缺点:安装过程麻烦,需要用户手动编译,需要手动解决软件包的依赖关系
源码包的优点:软件源代码开放,允许用户二次开发,安装灵活,可以自定义安装路径与安装功能,卸载方便
RPM包特点:
RPM包缺点:所有功能用户无法自定义,安装没有源码包灵活,不可以看到软件源代码
RPM包优点:由于已经提前被编译过,所以安装简单,安装速度快
RPM包命名规则,如: vsftpd-3.0.2-25.el7.x86_64.rpm
vsftpd     #软件包名称#
3.0.2    #软件包版本,主版本.次版本.修改版本#
25   #补丁次数#
el7   #适合的系统(el7表示RHEL7)#
x86_64    #适合的CPU架构#
rpm      #rpm包扩展名#
 
 
 
 
RPM管理软件包(古老的安装方式,现在最大的作用是查询和卸载,一般很少使用这个安装软件了)
RPM命令管理软件包需要手动解决软件之间依赖关系,这里有时一些软件包很麻烦
树形依赖:a—b–c–d
环形依赖:a–b–c—a
模块依赖:需要模块支持,模块查询地址:www.rpmfind.net (有些软件包需要支持模块依赖,进入官网查看一下,然后知道软件包名字回系统里再安装即可)
命令用法:rpm   选项…   软件包全名
常用选项:
-q    仅查询软件是否安装
-qa     列出所有已经安装在系统的所有软件,可配合grep过滤指定的软件包
-qi      列出软件包详细信息,包含版本与官网地址
-qf      后边接文件名,查询配置文件由哪个软件包产生
-ql      列出与该软件包相关所有文件与目录的存放位置
-ivh     i安装,v显示详细信息,h显示软件安装进度
-Uvh    升级安装软件包
-e     卸载软件包
–import     导入红帽签名(解决提示警告的,用处不大)
 
//挂载镜像文件,永久挂载就进入配置文件修改//
[root@localhost /]# mkdir ruanjinbao
[root@localhost /]# mount /dev/cdrom /ruanjinbao
mount: /dev/sr0 写保护,将以只读方式挂载
//修改为永久挂载//
[root@localhost /]# vim /etc/fstab
/dev/cdrom   /ruanjianbao     iso9660      defaults     0 0
[root@localhost /]# mount -a
//查询软件包安装没有//
[root@localhost ruanjinbao]# rpm -q vsftpd
未安装软件包 vstap
//安装vsftpd//
[root@localhost ruanjinbao]# rpm -i Packages/vsftpd-3.0.2-9.el7.x86_64.rpm 
警告:Packages/vsftpd-3.0.2-9.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
安装成功
[root@localhost ruanjinbao]# rpm -q vsftpd
vsftpd-3.0.2-9.el7.x86_64
//过滤查询//
[root@localhost /]# rpm -qa | grep vsftpd
vsftpd-3.0.2-9.el7.x86_64
//查看qi//
[root@localhost /]# rpm -qi vsftpd
Name        : vsftpd      #软件包名#
Version     : 3.0.2      #版本# 
Release     : 9.el7      #最终稳定版本#
Architecture: x86_64   #适合安装的cpu架构#
Install Date: 2022年02月04日 星期五 13时02分33秒          #安装时间#
Group       : System Environment/Daemons       #属于哪个群组#
Size        : 351462         #软件包大小#
License     : GPLv2 with exceptions
Signature   : RSA/SHA256, 2014年04月03日 星期四 05时54分58秒, Key ID 199e2f91fd431d51
Source RPM  : vsftpd-3.0.2-9.el7.src.rpm
Build Date  : 2014年03月07日 星期五 17时58分22秒
Build Host  : x86-025.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager    : Red Hat, Inc. http://bugzilla.redhat.com/bugzilla
Vendor      : Red Hat, Inc.
URL         : https://security.appspot.com/vsftpd.html     #软件包官网#
Summary     : Very Secure Ftp Daemon
Description :      #描述信息#
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.
//查看文件是由哪个软件包产生的//
[root@localhost /]# rpm -qf /usr/bin/ls
coreutils-8.22-11.el7.x86_64
//查看ql//
[root@localhost /]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf  (主配置文件)
//安装软件包,体验感好一点,不影响体验感//
[root@localhost /]# rpm -ivh vsftpd
错误:打开 vsftpd 失败: 没有那个文件或目录
[root@localhost /]# rpm -ivh /ruanjinbao/Packages/vsftpd-3.0.2-9.el7.x86_64.rpm
警告:/ruanjinbao/Packages/vsftpd-3.0.2-9.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中…                          ################################# [100%]
正在升级/安装…
   1:vsftpd-3.0.2-9.el7               ################################# [100%]
PRM安装有些软件包依赖特别多
 
 
 
 
yum软件包管理(红帽8与红帽7不一样的配置,这里是红帽7的配置)
yum(软件仓库):提供众多软件包的仓库,并自动解决软件包之间复杂依赖关系
yum常用命令:
yum repolist    #列出仓库可用的软件包#
yum   list    软件包名            #查看系统中提供的软件包(包含未安装的软件包)#
yum   list    updates            #查看系统中可供本机升级的软件包#
yum install   软件包名          #安装软件包,-y 自动回答yes#
yum   update    软件包名      #升级软件包版本#  (光打yum update会升级所有的,谨慎使用,最好不要这么用)
yum     remove    软件包名    #卸载软件包# (最好别用)
yum   clean all                     #清除仓库缓存#
yum     provides   文件名(命令)     # 查看文件由哪个软件包产生(主要用于查看程序文件)#
//编写本地yum仓库//
[root@localhost /]# vim /etc/yum.repos.d/local.repo
[liudaheng]        //仓库名称,名字自定义,但具有唯一性//
name=liudahengdeyum     //仓库描述,(类似于仓库解释),描述信息自定义,不具有唯一性//
baseurl=file:///mnt/liudahengdeyum    //指定软件仓库地址,file:///用于本地软件包存放位置//
enable=1      //软件仓库是否启动,1启动,0不启动 //
gpgcheck=0    //是否检测软件包签名,0不检测,1检测(签名是表示这是官方的软件包,没大有必要)//
//检测仓库可用性//
[root@localhost /]# yum repolist
//所有步骤//
mkdir /mnt/liudahengdeyum
mount -t iso9660 /dev/sr0 /mnt/liudahengdeyum 挂载镜像
cd /etc/yum.repos.d 切换到yum文件位置
vim 名称.repo 建立一个repo为后缀的文件
 
编辑内容如下 完成后保存退出
[liu]
name=liu
baseurl=file:///mnt/liu
enable=1
gpgcheck=0
 
yum list 查看yum源是否配置完成
 
yum install httpd*             #安装http服务#
systemctl start httpd         #开启http服务#
systemctl enable httpd     #将模式设计为开机自启#
systemctl status https       #查看http状态#
//注意//
Is this ok [y/d/N]: y      //y:确定安装,d:只下载不安装,N:不安装//
//查询安装包//
[root@localhost /]# rpm -q  httpd
httpd-2.4.6-17.el7.x86_64
//自动回答yes//
[root@localhost /]# yum -y install httpd
//卸掉挂载点后,软件包不能用了,就得用清理yum源缓存的命令了//
[root@localhost /]# yum clean all
网络yum源配置:
https://developer.aliyun.com/mirror/   阿里云官方镜像站
[liu]
name=liu
baseurl=https://mirrors.tuna.tsinghua.edu.cn/  //这里用的是清华大学的镜像站//
enable=1
gpgcheck=0
//配置阿里云的yum源//
配置阿里Base源(基于软件仓库,解决rpm软件的依赖关系)
wget -o /etc/yum.repos.d/centos-Base.repo
配置阿里epel源(额外软件仓库,包含许多基本软件没有的软件包)
wget -o /etc/yum.repos.d/epe1.repo
vim /etc/yum.repos.d/centos-Base.repo
//生成yum仓库缓存,可以提高软件包的下载速度,但是消耗一定的内存//
yum  makecache
!注意:当配置了本地源和网络源,默认优先下载网络源的软件包,这样一些软件包不如本地源下载的快,解决方法如下,配置yum源优先级
 
 
 
配置yum源优先级
[liu]
name=liu
baseurl=file:///mnt/liu
enable=1
gpgcheck=0
priority=1   //优先级为1-99之间,数字越小越优先//
 
 
 
 
源码包安装方式
//从官网下载源码包//
http: //nginx. org/
//安装源码包依赖包//
yum -y install   gcc pcre-deve1 openss7-deve1 z1ib
//解压源码包并进入源码包路径//
tar -xf nginx-1.20.0.tar.gz
cd nginx-1.20.0/
ls
//使用configure程序检查环境并指定安装参数//
./configure --with-http_ss1_module --with-file-aio --with-http_realip_module
//make将源码包转换成二进制//
make
//make install安装源码包//
make  install
cd  /usr/local/nginx/
ls
conf   html   logs   sbin 
 
 
 
 
源码包的管理方式
//启动nginx服务//
sbin/nginx
//netstat 和 ss 命令用于查看系统中启动的端口信息//
-a   显示所有端口信息
-n   以数字格式显示端口号
-t    显示TCP连接的端口
-u   显示UDP连接的端口
-l   显示服务正在监听的端口信息
-p   显示监听端口的服务名称是什么 (也就是程序名)
例如:ss -anptul | grep nginx (配合管道使用)
//查看nginx服务端口信息//
ss -anptul  |  grep nginx
tcp      LISTEN   0     128    :80    //Nginx服务默认通过TCP 80 端口监听客户端请求
//查看系统所有服务查看的端口信息//
LISTEN     0      128                                   :22                                   :      users:((“sshd”,1620,3))
 
 
 
 
systemd管理服务(管理rpm包,不能管理源码包)
systemd是内核加载的第一个进程(PID=1),systemd负责整个Linux系统的运行与服务控制,systemd为用户提供systemctl命令来管理RPM包安装的服务,如:启动服务、重启服务、关闭服务、查看服务状态,服务随机自启
服务的启动有两个阶段,一是系统开机时随着系统的启动而启动(随机自启),二是系统启动以后用户手动将服务启动
常用命令:
systemctl start    程序名     #启动服务#
systemctl restart   程序名    #重启服务#
systemctl stop      程序名      #停止服务#
systemctl enable  程序名    #设置服务随机自启(前提是服务在启动中)#
systemctl disable   程序名      #设置服务不随机自启,也就是取消随机自启#
svstemctl status   程序名     #杳看服务状态#
systemctl is-enabled    程序名     #查看服务是否被设置随机自启#
[root@localhost /]# yum -y install vsftpd 
[root@localhost /]# rpm -ql vsftpd
[root@localhost /]# systemctl start vsftpd    //开启服务//
[root@localhost /]# systemctl status vsftpd    //查看服务,主要是看(running)//
vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
   Active: active (running) since 六 2022-02-05 14:14:40 CST; 22s ago
  Process: 30278 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 30279 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─30279 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
 
2月 05 14:14:40 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon…
2月 05 14:14:40 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
[root@localhost /]# ss -anptul | grep vsftpd   //查看端口号  :::21  显示21端口//
 
 
 
 
shell概述
shell是一个程序,它连接了用户和Linux内核,它可以解释用户输入的命令传递给内核,让用户可以更加方便的使用Linux系统
shell本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序
shell是具备编程的能力的,shell也是一种语言,c语言,c++,jave,python,go语言等
语言分为:编译型语言:c,c++,Go ,语言提前编译,编译语言都有编译器
                解释型语言:shell,python,php,不需要提前编译,一边执行一边编译,每种语言都有解释器
shell语言支持大部分编程语言都具备的功能,if判断,for循环,变量,数组,函数,加减乘除,逻辑运算
shell算是比较简单的,相比于其他语言
shell语言:就是linux一些命令,都叫shell命令
[root@localhost /]# cat /etc/shells (这里都是解释器)
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash   (常用的)
/usr/sbin/nologin
/bin/tcsh
/bin/csh
//规范shell脚本组成//
vim user.sh
#! /bin/bash   (环境声明)
#注释信息
可执行代码…
//如何写好一个shell脚本//
明确任务需求
按需求整理好每一个步骤,先做什么,后做什么
运行脚本,并根据运行结果排除错误
优化脚本并达到最终效果
 
编写一个脚本
[root@localhost ~]# vim hello.sh
#!/bin/bash
#hello word
echo hello word
[root@localhost ~]# chmod u+x  hello.sh    赋予权限
[root@localhost ~]# /root/hello.sh    执行脚本
hello word
例子2:
#!/bin/bash
useradd adc
passwd abc
[root@localhost ~]# chmod u+x  user.sh          
[root@localhost ~]# ./user.sh
例子3:
[root@localhost ~]# cat user.sh
#!/bin/bash
useradd wang
echo 1 | passwd  --stdin wang
 
编写批量查看脚本
#查看系统版本信息,查看系统内核信息,
[root@localhost ~]# cat info.sh
#!/bin/bash
cat /etc/redhat-release
uname -r
free -h
ifconfig
hostname
[root@localhost ~]# chmod 777 info.sh
[root@localhost ~]# ./info.sh
 
编写本地yum源的脚本
 
麻烦版:
#!/bin/bash
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng
rm -rf /etc/yum.repos.d/

echo ‘/dev/cdrom /mnt/liudaheng   iso9660  defaults 0 0’ >>/etc/fstab
touch /etc/yum.repos.d/local.repo
echo ‘[liudaheng]’ >/etc/yum.repos.d/local.repo
echo ‘name=liudahen’ >>/etc/yum.repos.d/local.repo
echo ‘baseurl=file:///mnt/liudaheng’ >> /etc/yum.repos.d/local.repo
echo ‘enable=1’  >> /etc/yum.repos.d/local.repo
echo ‘gpgcheck=0’ >> /etc/yum.repos.d/local.repo
 
简易版:
#!/bin/bash
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng
echo ‘/dev/cdrom /mnt/liudaheng iso9660 defaults 0 0’ >> /etc/fstab
mount -a
rm -rf /etc/yum.repos.d/

echo ‘[liudaheng]
name=liudaheng
baseurl=file:///mnt/liudaheng
enable=1
gpgcheck=0’ > /etc/yum.repos.d/local.repo
优化版:
#!/bin/bash
echo ‘正在配置本地yum仓库…’
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng &> /dev/null  (这个就是个黑洞地址)
echo ‘/dev/cdrom /mnt/liudaheng iso9660 defaults 0 0’ >> /etc/fstab
mount -a
rm -rf /etc/yum.repos.d/*
echo ‘[liudaheng]
name=liudaheng
baseurl=file:///mnt/liudaheng
enable=1
gpgcheck=0’ > /etc/yum.repos.d/local.repo
echo ‘本地yum仓库已完成…’
yum clean all  &>/dev/null
yum repolist | tail -1
echo ‘仓库软件包数量…’
 
 
 
脚本的执行方式
执行一个脚本的方式有很多种
方法一:赋予脚本执行权限后,可用绝对路径或者当前路径执行
方法二:调用解释器执行脚本文件
//绝对路径执行脚本//
/root/hello.sh
//相对路径执行脚本//
./hello.sh
//去除执行权限//
chmod  u-x hello.sh
//执行脚本//
[root@localhost ~]# ./hello.sh
-bash: ./hello.sh: 权限不够
权限不够的可以用解释器来进行执行
[root@localhost ~]# bash hello.sh
hello word
任何一个解释器都可以
 
 
 
 
 
常用特殊符号
“” #双引号,引用整体
‘’ #单引号,引用整体并取消所有字符含义
$[]   # 四则运算(+ - / % 取余数)相当于一个计算器
KaTeX parse error: Expected 'EOF', got '#' at position 8: ()     #̲将命令的输出结果作为参数 #反…PATH"  
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
//引用整体,屏蔽特殊符号的作用//
[root@localhost ~]# echo ‘$PATH’
$PATH
//没有特殊符号单双引都可以//
[root@localhost ~]# echo ‘xxoo’
xxoo
[root@localhost ~]# echo “xxoo”
xxoo
//四则运算1+1//
[root@localhost ~]# echo $[1+1]
2
//四则运算4除以2/
[root@localhost ~]# echo $[4/2]
2
//取命令结果为参数//
[root@localhost ~]# touch $(date +%F)-abc.txt
[root@localhost ~]# ls
2022-02-06-abc.txt  anaconda-ks.cfg  hello.sh  info.sh  initial-setup-ks.cfg  user.sh  yum.sh
 
 
 
 
变量
以固定的名称存放可能变化的值,提高脚本的灵活度来适应多变的环境
定义变量:变量名=变量值,如:a1=abc (等号两边不要有空格)
取消变量:unset 变量名
定义变量注意事项:
1:变量名由字母/数字/下划线组成,区分大小写,不能以数字开头,不要使用命令和特殊符号
2:若指定的变量名已经存在,相当于为此变量重新赋值
例如:
//输出变量里的值//
[root@localhost ~]# xx=haha
[root@localhost ~]# echo $xx
haha
//更新变量//
[root@localhost ~]# xx=abcd
[root@localhost ~]# echo $xx
abcd
//调用变量的值//
[root@localhost ~]# xx=5
[root@localhost ~]# echo $xx
5
[root@localhost ~]# echo $[xx+5]
10
//通过变量定义用户名//
[root@localhost ~]# cat user.sh
#!/bin/bash
user=liudaheng
useradd $user
echo 1 | passwd  --stdin $user
//优化版//
#!/bin/bash
user=dff
useradd u s e r e c h o " 用户 user echo "用户 userecho"用户user创建完毕"
echo 1 | passwd  --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null (输出…user密码设置成功"
[root@localhost ~]# ./user.sh
用户lll创建完毕
用户lll密码设置成功
//更加智能化的版本//
 
 
 
 
read标准输入取值
read读取用户在键盘上输入的内容,并把内容存放在变量里,可以降低脚本的使用难度
命令格式:read -p  “提示信息”  变量名
//小脚本,手动输入用户名和密码//
[root@localhost ~]# cat user.sh
#!/bin/bash
read -p ‘请输入用户名:’ user
useradd u s e r e c h o " 用户 user echo "用户 userecho"用户user创建完毕"
read -p ‘请设置用户密码:’ pass
echo $pass | passwd  --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null ech…user密码设置成功"
//验证//
[root@localhost ~]# ./user.sh
请输入用户名:ooo
用户ooo创建完毕
请设置用户密码:liudaheng
用户ooo密码设置成功
 
 
 
 
变量种类
环境变量:变量名一般都大写,用来设置用户/系统环境
位置变量:bash内置,存储执行脚本时提供的命令参数
预定义变量:bash内置,可直接调用的特殊值,不能直接修改
自定义变量:用户自定义
env 命令查看系统所有环境变量
set 命令查看系统所有变量 ,包括用户自定义变量
环境变量:
[root@localhost ~]# env
系统已经定义好的变量
 
位置变量:
$0  
$1   第一个参数
$2   第二个参数
$3   第三个参数
$n   第n个参数
预定义变量:
$0  代表脚本本身
$*   显示所有参数内容
$#   显示有多少个参数
$?   显示上一条命令的执行结果(0代表正确,非0代表错误)
$$   显示脚本进程号(PID)
例如:需要给未知变量赋值
[root@localhost ~]# ./ttt.sh a b c
./ttt.sh       #$0#
a                #$1#
b                #$2#
c                 #$3#
3                #以此类推#
69321
0
//查看系统所有变量//
[root@localhost ~]# set
//查看自己的变量//
[root@localhost ~]# set | grep abc
 
 
 
 
 
判断文件状态(判断是否存在)
-e    //判断文档(文件或者目录)是否存在,存在为真//
-d    //判断目录是否存在,存在为真//
-f    //判断文件是否存在,存在为真//
-r    //可读为真//
-w   //可写为真//
-x    //可执行为真//
//判断//
[root@localhost ~]# [ -e /etc ]   (括号两边必须有空格)
查看真假
[root@localhost ~]# echo $?
0    #0为真#
//判断2//
[root@localhost ~]# [ -d /opt ]
[root@localhost ~]# echo $?
0
 
 
 
整数比较
-gt  大于
-ge   大于等于
-eq  等于
-lt   小于
-le   小于等于
-ne   不等于
例如:
[root@localhost ~]# [ 1-gt1 ]   //1大于1吗?//
[root@localhost ~]# echo $?    //判断一下//
0
[root@localhost ~]# [ 1 -eq 1  ]   //1等于1吗//
[root@localhost ~]# echo $?      //判断//
0
 
 
 
字符串对比
==相等
!=不等于
//例如//
[root@localhost ~]# [ root == xxoo ]
[root@localhost ~]# echo $?
1
 
 
 
常用数值运算方式
$[]    //四则运算(+ - * / % 取余数)   
$(())   //数值运算工具//
expr   //数值运算工具//
let    //数值运算工具//
//let简写表达式//               //let完整表达式//
let i++                                   let  i+i+1
let i--                                     let i=i-1
let i+=2                                 let i=i+2
let i-=2                                  let i=i-2
let i*=2                                  let  i=i2
let i/=2                                 let  i=i/2
let i%=2                                let i=i%2
例如:
[root@localhost ~]# echo $[10+6]
16
[root@localhost ~]# echo $((10+5))
15
//用expr需要用反引号,每个部分都需要有空格//
[root@localhost ~]# echo expr 2 + 2
4
!//使用乘法时需要跟一个\来进行//
[root@localhost ~]# echo expr 10 \* 3
30
//用let进行加法//
[root@localhost ~]# let x=1+1
[root@localhost ~]# echo $x
2
[root@localhost ~]# let a=10+5
[root@localhost ~]# echo $a
15
//例如//
[root@localhost ~]# let a=10
[root@localhost ~]# let b=20
[root@localhost ~]# let c=a+b
[root@localhost ~]# echo $c
30
//例如//
[root@localhost ~]# i=10
[root@localhost ~]# let i++
[root@localhost ~]# echo $i
11
//例如//
[root@localhost ~]# let i–
[root@localhost ~]# echo $i
10
//例如//
[root@localhost ~]# let i+=2
[root@localhost ~]# echo $i
12
//例如//
[root@localhost ~]# let i
=2
[root@localhost ~]# echo $i
24
 
 
 
 
字符串判断
-z   字符串的值为空为真
-n   字符串的值非空为真
//例如//
[root@localhost ~]# [ -z /etc/passwd ]   !注意:括号里的空格还是不能少的
[root@localhost ~]# echo $?
1
//例如//
[root@localhost ~]# [ -n /etc/passwd ]
[root@localhost ~]# echo $?
0
//例如//
[root@localhost ~]# [ ! -z $i ]
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '&' at position 45: …,当条件不满足时执行什么操作 &̲&  逻辑与(并且) || 逻…RANDOM里面放的是0-65535之间的随机数#
[root@localhost ~]# echo R A N D O M 16832 / / 使用 RANDOM 16832 //使用 RANDOM16832//使用RANDOM对10取余,这样就是0-9的随机数//
[root@localhost ~]# 
[root@localhost ~]# echo $[RANDOM%10]
6
[root@localhost ~]# echo $[RANDOM%10]
6
[root@localhost ~]# echo $[RANDOM%10]
3
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 33: …ot@localhost ~]#̲ //例子,猜数脚本// [r…[RANDOM%10]
if [ $num -eq n m 1 ] ; t h e n e c h o " 恭喜你猜对了,奖励一个哇塞 ! " e l s e   e c h o " 猜错了,请继续努力! "   e c h o " 正确结果为 nm1 ] ; then echo "恭喜你猜对了,奖励一个哇塞!" else  echo "猜错了,请继续努力!"  echo "正确结果为 nm1];thenecho"恭喜你猜对了,奖励一个哇塞!"else echo"猜错了,请继续努力!echo"正确结果为num1"
fi
//例子,安装软件包脚本//
[root@localhost ~]# cat if.4.sh
#!/bin/bash
if [ rpm -q vsftpd &> /dev/null  ; echo $? -eq  0 ] ; then
  systemctl start vsftpd 
  systemctl enable vsftpd  &> /dev/null 
  echo ‘软件包已经安装’
else
 yum -y install vsftpd &> /dev/null 
  systemctl start vsftpd
   systemctl enable vsftpd  &> /dev/null
    echo ‘软件包已经安装,并设置随机自启’
fi
[root@localhost ~]# chmod u+x if.4.sh
[root@localhost ~]# ./if.4.sh
 
 
if多分支语句
if [条件判断1] ; then
 条件1成立时,执行命令A
elif  [条件判断2] ;then
 条件2成立时,执行命令B
elif  [条件判断3] ;then
 条件3成立时,执行命令C
省略…
else
  所有条件都不成立时,执行命令D
fi
//判断成绩的脚本//
[root@localhost ~]# cat chengji.sh
#!/bin/bash
read -p “请输入你的成绩:” num
if [ $num -ge 90 ] ; then
echo “你的成绩很好,优秀!”
elif   [ $num -ge 80 ] ; then
echo “比较优秀!”
elif [ $num -ge 60 ] ; then
echo “勉强及格”
else
echo “回家种地”
fi
[root@localhost ~]# ./chengji.sh
请输入你的成绩:60
勉强及格
 
 
case条件判断结构
case从变量中取值,如果变量中的值与预设的值匹配,则执行对应的命令
语法结构:
case $变量名 in
值1)
  执行的命令xx;;    //如果变量中的值等于值1,则执行的命令
值2)
执行的命令yy;;     //如果变量中的值等于值2,则执行的命令
…省略其他分支
*)
 执行的命令zz;;    //如果变量中的值都不是以上的值,则执行的命令
esac
//例子//
[root@localhost ~]# cat lll.sh
#!/bin/bash
read -p “请输入您喜爱的食物(1)(2)(3)” xxoo
case $xxoo in
1)
   echo “你输入的是1,输出1”;;
 2)
 echo   “你输入的是2,输出2”;;
 3)
 echo   “你输入的是3,输出3”;;
*)
echo “你输入的啥也不是,无法识别”;;
esac
[root@localhost ~]# ./lll.sh
请输入您喜爱的食物(1)(2)(3)2
你输入的是2,输出2
[root@localhost ~]# ./lll.sh
请输入您喜爱的食物(1)(2)(3)5
你输入的啥也不是,无法识别
 
 
 
 
for循环
for循环处理,根据变量的取值,重复执行xx命令
/for循环语法结构//
for 变量名 in 值1 值2 值3 值N…
do
  执行的命令
done
//例子,编写循环创建用户的脚本//
 [root@localhost ~]# cat rrr.sh
#!/bin/bash
for user in xx1 xx2 xx3 xx4
do
   useradd  u s e r     e c h o " user     echo " user   echo"user已经创建成功"
   echo 1 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null    …user密码设置成功,初始密码为1"
done   
//测试企业的服务器连通性//
#!/bin/bash
for i in seq 254  (seq命令这个表示从1到254)
do
ping -c2 -i0.1 -w1  192.168.59.$i &> /dev/null
if [ ? − e q 0 ] ; t h e n     e c h o " 192.168.0. ? -eq 0 ] ; then     echo "192.168.0. ?eq0];then   echo"192.168.0.i UP"  &>> /opt/ping_up.txt
else
 echo  “192.168.0.$i DOWN”   &>> /opt/ping.down.txt
 
fi
done
 
 
 
while循环
死循环,只要条件成立就重复执行命令
while循环语法结构:
while 条件判断
do
 执行的命令
done
//例如//
[root@localhost ~]# cat while.sh
#!/bin/bash
a=1
while [ $a -le 5 ]
do
   echo KaTeX parse error: Expected 'EOF', got '#' at position 41: …ot@localhost ~]#̲ chmod u+x whil…[RANDOM%10]
while :
do
read -p “请输入0-10之间的数字” num1
if [ $num -eq $num1 ]; then &> /dev/null
echo “恭喜啊”
exit    //执行成功后就直接退出//
else
echo “不要灰心”
fi
done
 //使用while来进行网卡进出口流量//
[root@localhost ~]# cat wangka.sh
#!/bin/bash
while :
do   
clear      //清屏//
ifconfig eno16777736 | head -2
ifconfig eno16777736 | grep “RX p”     //网卡入口流量//
ifconfig eno16777736 | grep “TX p”     //网卡出口流量//
sleep 0.2                                             //休眠0.2秒钟//
done
 
 
 
 
 
shell函数
在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数,就是给一堆的命令取一个别名
函数可以使脚本中的代码更加简洁,增强易读性,提高脚本的执行效率
//函数定义格式1//
function 函数名 {
     执行的命令1
     执行的命令2  
     等更多命令   
 }
//函数定义格式2//
函数名(){
      执行的命令1
      执行的命令2
       等更多的命令

//例如,将很多命令变成一个函数来使用,调用函数//
 [root@localhost ~]# net_ens() {

ifconfig | head -2
ifconfig | tail -5
ifconfig | grep “RX p”
}
[root@localhost ~]# net_ens
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.59.142  netmask 255.255.255.0  broadcast 192.168.59.255
        RX packets 4489  bytes 502320 (490.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4489  bytes 502320 (490.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
        RX packets 28664  bytes 2740961 (2.6 MiB)
        RX packets 4489  bytes 502320 (490.5 KiB)
 //例子2//
[root@localhost ~]# miinfo() {
ifconfig
df -Th
free -h
}
[root@localhost ~]# miinfo
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.59.142  netmask 255.255.255.0  broadcast 192.168.59.255
        inet6 fe80::20c:29ff:fef4:6ae9  prefixlen 64  scopeid 0x20
        ether 00:0c:29:f4:6a:e9  txqueuelen 1000  (Ethernet)
        RX packets 28918  bytes 2764081 (2.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21126  bytes 2327675 (2.2 MiB)
        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
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 4489  bytes 502320 (490.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4489  bytes 502320 (490.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
文件系统              类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root xfs        18G  3.0G   15G   17% /
devtmpfs              devtmpfs  905M     0  905M    0% /dev
tmpfs                 tmpfs     914M   92K  914M    1% /dev/shm
tmpfs                 tmpfs     914M  9.0M  905M    1% /run
tmpfs                 tmpfs     914M     0  914M    0% /sys/fs/cgroup
/dev/sr0              iso9660   4.0G  4.0G     0  100% /mnt/liudaheng
/dev/sda1             xfs       497M  119M  379M   24% /boot
             total       used       free     shared    buffers     cached
Mem:          1.8G       1.1G       738M       9.6M       1.8M       386M
-/+ buffers/cache:       700M       1.1G
Swap:         2.0G         0B       2.0G
 
//fork炸弹,卡死系统,无限消耗系统资源//
[root@localhost ~]# cat zhadan.sh
#!/bin/bash
.() {
. | . &  //放后台//
}
.
 
 
 
 
脚本中断及退出
break  //结束整个循环//
continue  //结束本次循环,进入下一次循环//
exit    //退出脚本//
//跳过脚本的某一次循环,第三次循环,进行下一次循环//
[root@localhost ~]# ./for.sh
1
2
4
5
Over
[root@localhost ~]# cat for.sh
#!/bin/bash
for i in {1…5}
do
 [ $i -eq 3 ]  &&  continue
  echo $i
done
echo Over
//结束整个循环//
[root@localhost ~]# ./for.sh
1
2
Over
[root@localhost ~]# cat for.sh
#!/bin/bash
for i in {1…5}
do
 [ $i -eq 3 ]  &&  break
  echo i d o n e e c h o O v e r      字符串截取在使用 s h e l l 脚本完成各种运维任务时,一旦涉及到判断、条件测试等相关操作时往往需要对相关的命令输出进行过滤,提取出符合要求的字符串字符串截取的常用方法: i done echo Over           字符串截取 在使用shell脚本完成各种运维任务时,一旦涉及到判断、条件测试等相关操作时往往需要对相关的命令输出进行过滤,提取出符合要求的字符串 字符串截取的常用方法: idoneechoOver     字符串截取在使用shell脚本完成各种运维任务时,一旦涉及到判断、条件测试等相关操作时往往需要对相关的命令输出进行过滤,提取出符合要求的字符串字符串截取的常用方法:{变量名:起始位置:长度}
${}截取字符串时,起始位置是从0开始的
//例如//
[root@localhost ~]# jiequ=1234567890
[root@localhost ~]# echo $jiequ
1234567890
//统计个数//
[root@localhost ~]# echo ${#jiequ}
10
//截取前三位//
[root@localhost ~]# echo ${jiequ:0:3}
123
[root@localhost ~]# 
//截取后四位//
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 36: …ot@localhost ~]#̲ //截取一个随机八位数密码/…[RANDOM%29]
p= x : n : 1 p a s s = {x:n:1} pass= x:n:1pass=pass$p
done
echo KaTeX parse error: Expected 'EOF', got '#' at position 26: …ot@localhost ~]#̲ ./mima.sh 3klf…{变量名/xx/yy}
替换全部匹配的结果:${变量名//xx/yy}
//替换第一个匹配的结果//
[root@localhost ~]# xx=1111111
[root@localhost ~]# echo ${xx/1/2}
2111111
[root@localhost ~]#
//替换全部匹配的结果//
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 37: …ot@localhost ~]#̲           字符串掐…{变量名#关键字}
从左向右,最长匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键字} 从右向左,最短匹…{变量名%关键字
}
从右向左,最长匹配删除:${变量名%%关键字*}
例如:
//从左到右最短匹配//
[root@localhost ~]# x=head -1 /etc/passwd
[root@localhost ~]# echo $x
root❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo   ${x#root}
❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo   ${x#0}
:0:root:/root:/bin/bash
//加
的区别//
[root@localhost ~]# echo   ${x#0}   (不在第一个位置就得加,不加*他只匹配最左侧的字符串)
:0:root:/root:/bin/bash
[root@localhost ~]# echo   ${x#*root}
❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo   ${x#0}
root❌0:0:root:/root:/bin/bash
//最长匹配//
[root@localhost ~]# echo   ${x##*root}
:/bin/bash
[root@localhost ~]#
//批量改文件后缀名//
[root@localhost liudaheng]# touch {1…40}.doc
[root@localhost liudaheng]# ls
10.doc  14.doc  18.doc  20.doc  24.doc  28.doc  31.doc  35.doc  39.doc  5.doc  9.doc
11.doc  15.doc  19.doc  21.doc  25.doc  29.doc  32.doc  36.doc  3.doc   6.doc
12.doc  16.doc  1.doc   22.doc  26.doc  2.doc   33.doc  37.doc  40.doc  7.doc
13.doc  17.doc  2       23.doc  27.doc  30.doc  34.doc  38.doc  4.doc   8.doc
[root@localhost liudaheng]# touch gai.sh
[root@localhost liudaheng]# vim gai.sh
[root@localhost liudaheng]# chmod 777 gai.sh
[root@localhost liudaheng]# ./gai.sh
[root@localhost liudaheng]# ls
10.txt  14.txt  18.txt  20.txt  24.txt  28.txt  31.txt  35.txt  39.txt  5.txt  9.txt
11.txt  15.txt  19.txt  21.txt  25.txt  29.txt  32.txt  36.txt  3.txt   6.txt  gai.sh
12.txt  16.txt  1.txt   22.txt  26.txt  2.txt   33.txt  37.txt  40.txt  7.txt
13.txt  17.txt  2       23.txt  27.txt  30.txt  34.txt  38.txt  4.txt   8.txt
[root@localhost liudaheng]# cat gai.sh
for i in ls *.doc
do
 mv $i ${i%doc}txt
done
//替换改文件后缀名//
[root@localhost liudaheng]# cat gai.sh
for i in ls *.doc
do
 mv $i ${i/doc/txt}
done
 
 
 
 
shell数组
#定义数组方式一:数组名=(值1 值2 值3 …值n)
#定义数组方式二:数组名[下标]=值
//例如//
[root@localhost liudaheng]# x=(1 2  3 4 5 6 0)
[root@localhost liudaheng]# echo $x
1
//按照下标取值,下标从0开始的//
[root@localhost liudaheng]# echo ${x[0]}
1
[root@localhost liudaheng]# echo ${x[1]}
2
//取值所有//
[root@localhost liudaheng]# echo ${x[@]}
1 2 3 4 5 6 0
//例子2,赋值,然后输出//
[root@localhost liudaheng]# b[0]=aa
[root@localhost liudaheng]# b[1]=bb
[root@localhost liudaheng]# b[2]=cc 
[root@localhost liudaheng]# echo $b
aa
[root@localhost liudaheng]# echo ${b[@]}
aa bb cc
 
 
 
 
 
正则表达式   (可以连用)
正则表达式使用一串符号描述有共同属性的数据
 
基本正则符号       描述      
^                       匹配行首
KaTeX parse error: Undefined control sequence: \b at position 446: …           或者  \̲b̲               …/p’ /etc/passwd
//删除文件的2到4行//
[root@localhost liudaheng]# sed ‘2,4d’ test | wc -l
48
//直接用i修改文件的源,不带这个选项就是测试,并不能修改文件原内容//
[root@localhost liudaheng]# sed -i ‘2,4d’ test
//删除文件的10和12行//
[root@localhost liudaheng]# sed -i ‘10d;12d’ test
//删掉里面的空行//
[root@localhost liudaheng]# sed -i ‘/^$/d’ test
//替换文件匹配到第一个查到的字串替换//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/’ test
//替换文件匹配到的第二个字串//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/2’ test
//替换所有匹配的字符//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/g’ test
//替换成空//
[root@localhost liudaheng]# sed  ‘s/aaa//’ test
//任何符号都可以//
[root@localhost liudaheng]# sed  ‘s/2020/5555/’ 1.txt
5555  1111 2222
2021  2222 3333
2022  3333 4444
[root@localhost liudaheng]# sed  ‘s,2020,5555,’ 1.txt
5555  1111 2222
2021  2222 3333
2022  3333 4444
[root@localhost liudaheng]# sed  ‘s;2020;5555;’ 1.txt
5555  1111 2222
2021  2222 3333
2022  3333 4444
//导入文件内容到文件//
[root@localhost liudaheng]# sed ‘r/etc/passwd’ 1.txt
//导入文件内容第一行到文件//
[root@localhost liudaheng]# sed ‘1r/etc/passwd’ 1.txt
//导入文件内容第1到3行导入到文件//
[root@localhost liudaheng]# sed ‘1,3r/etc/passwd’ 1.txt
//导出文件内容//
[root@localhost liudaheng]# sed ‘1,3w/etc/passwd’ 1.txt
 
 
 
 
 
 
awk编程语言
awk编程语言/数据处理引擎
创造者:Aho Winberger Kernighan
基于模式匹配检查输入文本,逐行处理并输出,获取指定的数据
awk过滤数据时支持仅打印某一列,如:第2列、第4列…
awk命令格式1: awk[选项] '条件1{指令}条件2{指令}文件名
awk命令格式2:前置命令│ awk[选项]‘条件{指令}
常用指令: print是最常用的打印指令
常用选项:-F#指定分隔符,如不指定分隔符,默认以空格或tab键为默认分隔符,可通过[]集合匹配多种单个字符
awk内置变量:$1第一列,$2第二列,$3第三列,依次类推,NR文件当前行号,NF文件当前列数
awk使用数值/字符串比较设置条件
等于:==
不等于:!=
大于:>
大于等于:>=
小于:<
小于等于:<=
awk过滤时机,awk’BEGIN{指令}{指令}END{指令}’ 文件名
BEIN(指令)#读取文件内容之前执行指令,指令执行一次,行前处理
{指令}       #读取文件过程中执行,指令逐行执行
END{指令}      #读取文件内容结束后执行指令,执行指令一次
awk分支结构
if 单分支格式:if(条件){指令}
if双分支格式:if (条件){指令}else {指令}
awk数组
定义数组格式1:数组名[下标]=值
定义数组格式2:数组名[下标]
数组的用法:for(变量名in数组名){print 数组名[变量]}
awk循环结构
命令格式:fro(变量名in数组名) {print 数组名[变量]}
例如:
//打印文件的第一列//
[root@localhost liudaheng]# awk ‘{print $1}’ test.txt
hello
welcome
//查看第一列和第三列//
[root@localhost liudaheng]# awk ‘{print $1,$3}’ test.txt
hello jfdlf
welcome shandong
//打印第一列,指定分隔符,文件默认没有空格作为分隔符,因为/etc/passwd里面没有空格能做分隔符//
[root@localhost ~]# awk -F: ‘{print $1}’ /etc/passwd
//通过[]集合来打印文件第1列和第7列,用户名和解释器//
[root@localhost ~]# awk -F: ‘{print $1,$7}’ /etc/passwd
//以root开头的行直接打印//
[root@localhost ~]# awk -F:  ‘/^root/{print}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
//打印root开头的并且只打印第一行和第七行//
[root@localhost ~]# awk -F:  ‘/^root/{print $1,$7}’ /etc/passwd
root /bin/bash
//打印出行号//
[root@localhost ~]# awk -F:  ‘{print NR,NF}’ /etc/passwd
//例子//
[root@localhost ~]# awk -F: ‘{print $1,“用户的解释器为:” ,$7}’  /etc/passwd
root 用户的解释器为: /bin/bash
//排除第七行排除noloain然后再输出第1行和第7行//
[root@localhost ~]# awk -F: ‘$7!~/nologin/{print $1,$7}’  /etc/passwd
//利用扩展正则过滤,以root或者adm开头的行,打印第一列与第七列//
[root@localhost ~]# awk -F: ‘/^(root|adm)/{print $1,$7}’   /etc/passwd
root /bin/bash
adm /sbin/nologin
//打印行号为3的,就是打印第三行//
[root@localhost ~]# awk ‘NR==3{print}’ /etc/passwd
daemon❌2:2:daemon:/sbin:/sbin/nologin
//找出文件中第三列大于1000的,然后打印1,3,7,行//
[root@localhost ~]# awk -F: ‘$3>=1000{print $1,$3,KaTeX parse error: Expected 'EOF', got '}' at position 2: 7}̲' /etc/passwd /…/{x++}END{print x}’ /etc/passwd
2
//if语句实例//
[root@localhost ~]# awk -F: ‘{if($3>=1000){x++}}END{print x}’ /etc/passwd
2
//数组//
[root@localhost ~]# awk ‘BEGIN{x[0]=10;x[1]=20;print x[0],x[1]}’
10 20
//用awk打印最终的剩余的内存//
[root@localhost ~]# free -h | grep Mem | awk ‘{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲' 472M //脚本显示根分…’  | awk ‘{print “根分区剩余空间”,$4}’
free -h | grep Mem | awk ‘{print “物理内存剩余空间”,$4}’
//查看用户的登录次数//
[root@localhost ~]# who | awk ‘{ip[$1]++}END{for(i in ip)print i,ip[i]}’
root 1
roo 2
 
 
 
 
SElinux系统内核的安全机制
Security-Enhanced Linux美国NSA国家安全局主导开发,一套增强Linux系统安全的强制访问控制体系
集成到Linux内核(2.6及以上)针对用户、进程、目录和文件提供了预设的保护策略,以及管理工具
SElinux运行模式
enforcing      强制模式
permissive    宽松模式
disabled        禁用模式
SElinux运行模式切换
查看当前运行模式:getenforce
临时切换运行模式:setenforce  1 | 0   #1强制模式,0宽松模式
SElinux配置文件:/etc/selinux/config
//查看当前模式//
[root@localhost ~]# getenforce
Enforcing
//修改为宽松模式//
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
//永久修改就直接进配置文件//
vim /etc/selinux/config
[root@localhost ~]# cat /etc/selinux/config

This file controls the state of SELinux on the system.

SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled

SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
但是需要重启服务器,然后需要的话就直接修改临时和永久
 
 
 
 
 
 
安全防护firewalld防火墙
防火墙分为硬件防火墙和软件防火墙
系统服务:firewalld ,7版本默认使用的防火墙,6版本默认使用iptables,底层还是iptables
管理工具:firwalld-cmd
防火墙:匹配即停止
防火墙预设安全区域:
public    仅允许访问本机的sshd,DHCP,ping等少量服务
trusted     允许任何访问
block       阻塞任何来访请求
drop       丢弃任何来访的数据包
例如:
//开启防火墙//
[root@localhost ~]# systemctl start firewalld
//查看默认区域//
[root@localhost ~]# firewall-cmd --get-default-zone 
public
//修改默认区域//
[root@localhost ~]# firewall-cmd --set-default-zone=block
success
[root@localhost ~]# firewall-cmd --get-default-zone 
block
//添加服务到public//
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all    #查看命令#
public
  interfaces:
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
#封网段开服务#
若针对永久配置需添加 --permanent
使用  --add-source=网段地址
//永久设置http服务在public区域//
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public
  interfaces:
  sources:
  services: dhcpv6-client http ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
//把某ip给直接去掉//
[root@localhost ~]# firewall-cmd --zone=block --add-source=10.1.1.1
success
 
[root@localhost ~]# firewall-cmd --zone=block --list-all
block (default, active)
  interfaces: eno16777736
  sources: 10.1.1.1
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
//恢复ip的访问//
[root@localhost ~]# firewall-cmd --zone=block --remove-source=10.1.1.1
success
[root@localhost ~]# firewall-cmd --zone=block --list-all
block (default, active)
  interfaces: eno16777736
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
#防火墙端口映射#
#本地应用的端口重定向(端口1>端口2)从客户机访问端口1的请求,自动映射到本机端口2#
[root@localhost ~]# firewall-cmd --zone=public --add-forward-port=port=5432:proto=tcp:toport=80
success
–add-forward   添加转发端口
port=port=5432    指定转发的端口
proto=tcp            指定tcp协议
toport=80              指定目标端口
 
 
 
常用协议及端口
http:超文本传输协议(明文协议) 默认端口号是:80   httpd默认走的http协议
https:安全的超文本传输协议,默认端口号:443  加密网站
ftp:文件传输协议,视频音频等,默认端口是:20(数据端口),21(命令端口)
DNS:域名解析协议,默认的端口号是53
telnet:远程管理协议,默认的端口号是23
smtp:用户发邮件协议:端口号25
pop3:用户收邮件协议:端口号110
tftp:简单的文件传输协议:端口号69
ssh:远程连接协议      : 端口号22
0-65535这是端口的总数
//记录协议与端口信息//
[root@localhost ~]# vim /etc/services
 
 
 
 
 
 
 
 
cron周期性计划任务
cron周期性计划任务用来定期执行程序,目前最主要的用途是定期备份数据
软件包名: cronie、crontabs
服务名: crond,用来控制服务,启动服务,停止服务
日志文件: /var/log/cron
cron定义时间格式:
*   *   *   *  *     执行的命令
分 时 日 月 周
分钟: 从0到59之间的整数
小时:从2到23之间的整数
日期:从1到31之间的整数
月份:从1到12之间的整数
星期:0-6之间的整数,0代表周日
 
*    没分,每时,每天,每月,每周
,     分隔多个不连续的时间
-    指定连续时间范围
/    指定执行任务的时间间隔
 
crontab :  用于管理计划任务
crontab -e  -u    用户名     #编写计划任务
crontab -l  -u     用户名      #查看计划任务
crontab -r  -u    用户名     #清除计划任务
 
//例如//
[root@localhost ~]# crontab -e #进入之后和vim一样#
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l
/1 * * * * date >> /opt/date.txt
[root@localhost ~]# ls /opt/
date.txt 
[root@localhost ~]# cat /opt/date.txt
2022年 02月 13日 星期日 13:00:02 CST
2022年 02月 13日 星期日 13:01:01 CST
 
#每周5早上8点整执行一个任务#
00 8 * * 5    xx命令
#每天晚上23点30执行一个任务#
30 23 * * *   xx命令
#错误格式,日期和星期不能同时定义,会发生矛盾#
30 23 1 * 2  xx命令
#每月的1,3,5号23:30执行一个任务,用逗号,英文的逗号#
30 23 1,3,5 * *  xx命令
#每周的1,3,5晚上23:30 执行一个任务#
30 23 * * 1,3,5  xx命令
#每月的2-5号凌晨3:30分执行一个任务#
30 3 2-5 * *  xx命令
#每两个小时执行一个任务#
00 /2 * * *  xx命令
#每两分钟执行一个任务#
/2 * * * *  xx命令
//这样名字不会重复,时间作为名字//
[root@localhost ~]# tar -czf date +%F-log.tar.gz   /var/log/
.log 
系统默认自动安装的这个软件包,随机自启动
[root@localhost ~]# rpm -q cronie
cronie-1.4.11-11.el7.x86_64
 
 
 
iptables防火墙
nerfilter/liptables:工作在主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应的处理
 
 
 
 
iptables框架
iptables的4表
filter:数据过滤表   (常用的就是这个表和INPUT链)
—包含三个链:INPUT,UOTPUT,FORWARD
nat:地址转换表,不能过滤数据包,仅仅修改数据包中的IP和端口
—包含三个链:PREROUTING,POSTROUTING,OUTPUT
raw:状态跟踪表,决定是否跟踪数据包
—包含两个链:OUTPUT,PREROUTING
mangle:包标记表,不能过滤也不能修改数据包
—包含五个链:PREROUTING,FORWARD,POSTROUTING,INPUT,OUTPUT
iptables的5链
PREROUTING链:路由前规则,防火墙在刚刚接收到数据包,对数据包进行路径选择之前所需要的链
FORWARD链:转发规则,将数据包从一个网络转发到另外一个网络所需要的链
POSTROUTING链:路由后规则,对数据包进行路径选择后,并在防火墙即将把数据包转发出去之前,所要需要的链
INPUT链:入站规则,限制客户端数据包目地地址是防火墙主机的上层应用所需要的链
OUTPUT链:出站规则,限制防火墙主机上层应用产生的数据包是否可以出站需要的链
目标操作
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过
LOG:记录日志,然后传给下一条规则
iptables命令格式
命令格式: lptables [-t表名]选项[链名][条件][-j目标操作]
添加规则:
-A#追加一条防火墙规则至链的末尾
-l #插入一条防火墙规则至链的开头
查看规则:
-L#查看iptables所有规则
-n#以数字形式显示地址、端口等信息
–line-numbers#查看规则时,显示规则的行号
删除规则:
-D#册除链内指定的序号(或内容)的一条规则
-F#清空所有规则
默认规则:
-P #为指定的链设置默认规则
iptables防火墙规则的条件
通用匹配:
协议匹配: -p#协议名称
地址匹配:-s源地址、-d目标地址
接口匹配: -i 接受数据的网卡、-o发送数据的网卡
端口匹配: --sport源端口号、–dport目标端口号
ICMP类别匹配: --icmp-type ICMP类型
创建规则注意事项
1.可以不指定表,默认为filter表
2.如果没有找到匹配条件,执行防火墙默认规则
3.选项/链名/目标操作用大写字母,其余都小写
 
//主机型防火墙规则配置//
[root@liudaheng ~]# yum -y install iptablesles-services  (安装服务)
[root@liudaheng ~]# iptables -t filter -nL     (查看filter的表)
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  –  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp –  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  –  0.0.0.0/0            0.0.0.0/0          
ACCEPT     tcp  –  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  –  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
REJECT     all  –  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination       
[root@liudaheng ~]# iptables -t nat -nL    (查看nat的表)
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        
[root@liudaheng ~]# iptables -t filter -I INPUT -p icmp -j  REJECT   (不允许别人访问我的ICMP协议)
[root@liudaheng ~]# iptables -t filter -I INPUT -p icmp -j  ACCEPT  (允许别人访问我的ICMP协议)
[root@liudaheng ~]# iptables -t filter -D INPUT 8    (删除某一条的规则)
[root@liudaheng ~]# iptables -F   (清空防火墙规则)
[root@liudaheng ~]# iptables -nL --line-numbers   (查看表里的规则)
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT   (允许别人访问我的tcp)
[root@liudaheng ~]# iptables -t filter -nL INPUT   (查看指定链)
[root@liudaheng ~]# iptables -t filter -P INPUT DROP   (拒绝所有请求,包括ssh)
[root@liudaheng liudaheng]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT   (放行tcp22端口)
[root@liudaheng ~]# iptables -t filter -P INPUT ACCEPT    (设置防火墙默认规则)
[root@liudaheng ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     tcp  –  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT    (拒绝别人访问我的80端口,就是httpd)
[root@liudaheng ~]# iptables -t filter -I INPUT -s 1.1.1.1 -j REJECT    (拒绝某一个IP地址)
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp -i ens32 --dport 80 -j REJECT   (匹配某一块网卡拒绝80的请求)
[root@liudaheng ~]# iptables -I INPUT  -s 192.168.1.0/24 -j REJECT   (匹配某一个网段拒绝某一个网段)
 
 
网络型防火墙规则配置
通过路由转发配置网络型防火墙
下面是准备的条件//
主机名                       网卡、IP地址、网关设置
client24                    ens32,192.168.1.24,网关指向防火墙外网ip:192.168.1.100
porxy                       ens32内网ip:192.168.0.26,ens34外网ip:192.168.1.100
web27                     ens32:192.168.0.27,网关指向防火墙内网:192.168.0.26
 
 
防火墙主机添加网卡并设置ip,ip设置为192.168.0.100/24
[root@liudaheng ~]# nmtui (进界面调整IP)
[root@liudaheng ~]# ls /proc/sys/net/ipv4/ip_forward  (查看有没有开启路由转发功能)
如果是0,就是没开启
[root@liudaheng ~]# echo 1> /proc/sys/net/ipv4/ip_forward    (开启路由转发功能)
测试客户端和网站服务器的连通(能连通,公网ip)
[root@proxy ~]#sysctl -p //加载配置立即生效
 net.ipv4.ip_forward = 1
、、查看路由转发、、
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward
1
、、第二台服务器提供网站服务:web27将网关指向192.168.0.26
#安装httpd服务
[root@web1 ~]#yum -y insta17 httpd
#修改默认首页
[root@web1 ~]# echo web27 > /var/www/htm1/index. html
[root@web1 ~]# systemct1 start httpd
[root@web1 ~]# systemctl status httpd
、、 、、
第三台为客户端: client将IP修改为192.168.1.30网段,将网关指向防火墙主机的第二块网卡:192.168.0.100
访问测试: curl http://192.168.0.20
、、防火墙主机配置规则:拒绝192.168.1.30访问80端口,,
[root@proxy ~]# iptables -I FORWARD -s 192.168.1.30 -p tcp --dport 80 -j DROP
#客户端192.168.1.30访问测试:
curl http://192.168.0.20
[root@proxy ~]# iptables -F
 
 
防火墙扩展
命令格式:iptables  选项  链名 -m 扩展模块  --具体扩展条件 -j 动作
#根据MAC地址封锁主机,安装nmap扫描获取地方IP的MAC地址
[root@proxy ~]#yum -y insta17 nmap
 
#扫描对方主机IP
[root@proxy ~]#nmap -s 192.168.1.28
starting Nmap 6.40 ( http: / /nmap.org ) at 2020-09-25 17:12 CST
Nmap scan report for 192.168.0.111
Host is up (o.00044s latency).              、、当前主机状态、、
MAC Address: 00:0c:29:CA:87:81 (VMware)        、、mac地址、、
Nmap done: 1 IP address (1 host up) scanned in 4.05 seconds
 
#通过MAC地址限制对方访问
[root@proxy ~]# iptables -t fiter -I FORWARD -p tcp --dport 80 -m mac --mac-source00:0C:29:D5:29:OF -i REJECT
 
 
 
基于多端口设置过滤规则
[root@proxy ~]# iptables -t filter -I FORWARD -p tcp -m multiport --dports 20,21,80,443 -j  ACCEPT
#multiport :多端口模块
 
#根据IP范围设置封锁规则
[root@proxy ~]# iptables -t filter -I FORWARD -p tcp --dport 80 -m iprange --Src-range192.168.1.20-192.168.1.30 -j REJECT
#iprange模块:ip范围模块
#–src-range: 源工P
#–dst-range:目标IP
 
 
 
配置SNAT实现共享上网
通过防火墙规则,允许局域网中的主机访问外网
主机名                        网卡、IP地址、网关
内部主机:host24              ens32:192.168.1.28  网关: 192.168.1.100
内部防火墙:proxy              ens32外网ip:192.168.0.26    ens34内网ip:192.168.1.100
外部主机:web27                   ens32:192.168.0.27   网关:192.168.0.26
#实现192.168.1.28转换为192.168.0.26
[root@proxy ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j  SNAT --to-source 192.168.0.26
#POSTROUTING:路由后链
#-s:指定源地址为192.168.1.0网段的地址
#-p:想要通过tcp协议
#–dport:访问目标的80端口时
#-j:SNAT转换
#–to-source:转换源地址为192.168.0.26
 
#web1动态查看访问日志
[root@web1 ~]# tail -f /var/log/httpd/access_1og
 
client 192.168.1.30访问网站
curl  http://192.168.0.27
 
 #所有iptab1es规则都是临时规则,如果需要永久保留规则需要执行如下命令
[root@proxy ~]# service iptables save
 
 
 
 
 
 
sudo用户提权
管理员提前为用户设置执行权限许可
被授权用户有权执行授权命令
配置文件:/etc/sudoers
命令格式:sudo  特权命令
#修改/etc/sudoers文件,为lisi用户授予相关脚本的执行权限,允许通过systemct1工具来管理系统服务,修改/etc/sudoers配置文件可以用vim编辑文件,或者使用visudo命令修改
[root@liudaheng ~]# vim /etc/sudoers
[root@liudaheng ~]# visudo  (这个可以检测语法错误)
第100行的root开头
root    ALL=(ALL)       ALL
liudaheng      ALL=(root)    /bin/systemctl       、、修改即可、、
liudaheng      ALL=(root)    /bin/systemctl,/user/bin/yum   、、这个是可以执行systemctl和yum、、
liudaheng      ALL=(root)    /bin/systemctl,/user/bin/yum,!/bin/passwd    root    、、这个是可以执行systemctl和yum,叹号和root就表示你不能来修改root的东西、、
解释:授权liudaheng用户以root身份执行systemctl命令
 
[liudaheng@liudaheng root]$ sudo -l
#用户 liudaheng 可以在 liudaheng 上运行以下命令:#    、、主要是看这条、、
    (ALL) ALL      、、解释,这个就表示所有权限都可以、、
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
 
    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。
[sudo] liudaheng 的密码:        、、然后输入密码就可以了、、
然后就可以执行一些systemctl命令了
[liudaheng@liudaheng root]$ sudo systemctl start httpd
 
#为sudo机制启用日志记录,以便跟踪sudo执行操作,应该是在配置文件里,没有的话就直接手动添加
Defaults logfile=“/var/ log/sudo. log”
、、添加到提权的下面即可,然后当用户执行命令之后,创建的文件里就会显示他做了哪些操作,文件就是/var/log/sudo.log、、
 
 
 
 
 
 
OpenSSH
OpenSSH开源免费提供ssh远程安全登录的程序
ssh协议端口:22/tcp
服务名:sshd
ssh提供密钥认证登录方式,优先级高于密码
[root@liudaheng ~]# 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:dtoSjso2Oe1ODM92afpHWnZAy/BYrO1RwBw+Eg/Dk1E root@liudaheng
The key’s randomart image is:
±–[RSA 3072]----+
|       .=BEo     |
|        =
.    |
|        .@+o     |
|        o.B.     |
|    .   S…o     |
|     = + = .    |
|     oB B=…     |
|   .=+.+…      |
|   .o=+…       |
±—[SHA256]-----+
[root@liudaheng ~]# ls .ssh   (会成功创建私钥和公钥)
id_rsa  id_rsa.pub  known_hosts
[root@liudaheng ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.100       (将公钥给另一个主机)
然后下次登录就不需要用户名和密码了
 
 
 
 
 
scp远程复制工具
scp可以实现主机之间的文件拷贝
#将本地文件拷贝至远程主机
[root@localhost ~]# touch /opt/test.txt
[root@locaThost ~]# scp /opt/test.txt root@192.168.0.27:/opt
 
#将远程主机文件拉取到本地
[root@localhost ~]# scp root/test.txt  root@192.168.0.27:/opt    (可以指定存的地方)
[root@locaThost ~]# 1s /opt
fstab   test.txt
 [root@liudaheng ~]# ssh root@192.168.1.1  ls /opt  (直接查看,就不需要切换了)
[root@liudaheng ~]# scp root@192.168.1.1:/root/abc.txt /opt (拉取文件到本地)
 
 
 
 
提高ssh服务的安全性
配置文件: [root@liudaheng ~]# /etc/ssh/ssh_config.d/
#Port 22     #ssh默认监听端口
#PermitRootLogin yes     #是否允许root用户连接,yes允许,no不允许
#PermitEmptyPasswords no       #不允许空密码登录
#PasswordAuthentication yes       #允许用密码登录
、、下面两个直接写到配置文件里即可、、
#AllowUsers   用户1   用户2  用户3  root(必须的,要不然root也登录不了)     #定义账号白名单,配置完后需要重启服务,记得一定要把root也放进去
#Denyusers 用户1   用户2        #定义账号黑名单
 
 
 
 
 
 
 
文件共享服务FTP介绍
FTP:文件传输协议
FTP是一种在互联网中基于TCP协议端到端的数据传输协议
基于c/s架构,默认使用20,21号端口
端口20(数据端口)用于数据传输
端口21 (命令端口)用于接收客户端发出的相关FTP命令
 
 
FTP工作模式
主动模式:FTP客户端从本机的非特殊端口(>1023)连接FTP服务器的命令端口21,服务端通过本地的20号端口主动
向客户端的随机端口发起连接请求,开始传输数据
 
被动模式:FTP客户端通过向FTP服务器发送PASV命令进入被动模式,FTP服务器会另开一个随机端口,客户端主动连接到随机端口后,开始传输数据
!被动模式就是可以避免客户端起防火墙
 
 
可以实现ftp的软件、
WU-ftpd
proftpd:专业的FTP软件
pureftp:纯粹的FTP软件
vsftpd:非常安全的ftp服务器
ServU:windows里的一款FTP软件
客户端访问ftp服务器工具
ftp
lftp,lftpget
wget
curl
FileZilla:windows客户端工具,可从软件商店直接下载
 
Vsftpd介绍
Vsftpd:非常安全的FTP守护进程
是一款运行在linux操作系统上开源并且免费的FTP服务程序
不仅完全开源而且免费,还为我们提供了一个快速的,稳定并且安全的FTP服务
 
 
Vsftpd用户模式
本地用户
虚拟用户
匿名用户
 
Vsftpd服务相关参数
/var/ftp     #匿名用户共享目录
/etc/vsftpd   #配置文件所在目录
/etc/vsftpd/vsftpd.conf     #主配置文件
/usr/sbin/vsftpd     #主程序文件
etc/vsftpd/ftpusers    #黑名单
/etc/vsftpd/user_list   #控制名单(配置文件控制白名单与黑名单)
/var/log/xferlog    #日志目录
 
服务器:
1:关闭服务端防火墙
2:安装vsftpd
3:开启服务
4:查看运行状态
5:设置随机自启
客户端:
1:下载链接工具,ftp,lftp都可以,[root@c1ient ~]#yum -y install ftp lftp  (lftp用的多一些)
2:ftp  服务端的ip   ,然后输入用户名ftp和密码,密码为空
3:用lftp的话就是:lftp  服务端ip
 
#匿名用户权限介绍
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enab1e=YES        #是否允许匿名用户访问,yes允许
29#anon_upload_enab1e=YES    #是否允许匿名用户上传,yes允许,no不允许
33 #anon_mkdir_write_enab1e=YES    #是否允许匿名用户创建目录,yes允许,no不允许
anon_other_write_enable=yes        #是否允许匿名用户写权限,yes允许,no不允许(手动添加)
 
 
 
本地用户
创建本地用户
[root@localhost /]# useradd liu
[root@localhost /]# passwd liu
进入到ftp模式:lftp 服务器端的ip   -u   用户名  (指定本地用户)
上传文件:put  文件名
修改主配置文件(记得把前面的注释#删掉要是启用的话)
12 anonymous_enab1e=NO   #关闭匿名用户访问
16 local_enab1e=YES    #是否允许本地用户访问,yes允许,no不允许
19 write_enab1e=YES   #是否允许本地用户有写权限,yes允许,no不允许
23 local_umask=022   #本地用户上传文件默认权限为755
37 dirmessage_enab1e=YES   #当用户第一次进入新目录时显示消息(了解
40 xferlog_enable=YES   #启动xferlog日志记录,该文件记录传输数据
53 #xferlog_file=/var/log/xferlog  #日志文件位置,需删除注释
43 connect_from_port_20=YES   #启用数据传输端口
49 #chown_username=whoever     #改变上传文件的属主与属组
60 #idTe_session_timeout=600    #客户端连接超时时间
63 #data_connection_timeout=120 #数据连接超时时间
101 chroot_local_user=YES    #是否允许本地用户切换目录, yes不允许,no允许
115 listen=NO                 #是否开启监听IPV4的连接,默认没开启,改为yes
126 pam_service_name=vsftpd #启用pam认证的文件名称,路径为/etc/pam. d/vsftpd
127 userlist_enable=YES   #是否启用控制名单文件,yes启用,no不启用,文件为/etc/vsftpd/user_list,如果启用控制名单功能,需要指定该文件为黑名单|白名单(文件在上面)
128 userlist_deny=no    #yes拒绝user_list文件中用户登录ftp服务器(黑名单),no允许登录(白名单):
max_clients=         #限制最大并发连接数量
 
、、给用户做一个专门用来共享用的文件夹,赋予权限等、、
[root@192 liudaheng]# mkdir liudahengdemulu
[root@192 liudaheng]# chown liudaheng:liudaheng liudahengdemulu/
避免因为没有权限而导致无法使用,无法下载等问题
lftp liudaheng@192.168.59.128:~/liudahengdemulu> get 222
get: /root/222: 权限不够
lftp liudaheng@192.168.59.128:~/liudahengdemulu> put 3333
lftp liudaheng@192.168.59.128:~/liudahengdemulu> ls
-rw-r–r--    1 0        0               0 Feb 15 07:40 222
-rw-r–r--    1 1000     1000            0 Feb 15 07:58 3333
 
 
 
 
 
NFS网络文件系统(也是用来实现文件共享)NFSv2 NFSv3 NFSv4 就三个版本
NFS (Network File System)网络文件系统,是一种基于TCP/UDP传输协议的文件共享服务
NFS基于C/S架构,服务端启用协议将文件共享到网络上,然后允许本地NFS客户端通过网络挂载服务端共享的文件。
NFS基于RPC远程过程调用机制,支持在异构系统之间数据的传送,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作
NFS协议:端口号 2049
软件包:nfs-utils
服务名:nfs
配置文件:/etc/exports
PRC协议:端口号 111
软件包:rpcbind
服务名:rpcbind
 
、、NFS服务端、、
[root@192 /]# yum -y install nfs-utils
[root@192 /]# cat /etc/exports
/liudaheng 192.168.59.148(no_root_squash,rw)   #解释: no_root_squash坏挤压root用户身份(允许以root身份访问)#
/liudaheng 192.168.59.148(no_root_squash,rw)  192.168.59.111(ro)  #这个表示控制多个客户端的权限,每个客户端的权限不同#
解释:共享的文件   加客户端ip  括号里再加入需要给的权限
[root@192 /]# systemctl restart nfs    重启服务
 
、、客户端、、
[root@localhost /]# yum -y  install nfs-utils
[root@localhost /]# showmount -e 192.168.59.128
可以将共享的文件来挂载到自己的文件里
[root@localhost /]# mount 192.168.59.133:liudaheng /opt/liudaheng    (将共享的文件挂载到自己的文件下,想当于挂载了一个磁盘)
 
、、客户端实现开机挂载配置、、/etc/fstab
vim /etc/fstab
192.168.0.200:/xxx      /mnt/xxx              nfs        defaults,_netdev      0  0   (+netdev是因为如果挂载失败就跳过的这么一个作用)
服务器地址:文件夹路径          挂载点   文件系统    
解释:_netdev:指定nfs是网络设备
 
 
、、服务端主机如何给普通的客户端主机授权、、
[root@localhost /]# setfacl -m u:liudaheng:rwx /liudaheng
然后再设置一个t权限,要不然root的文件将会受到威胁
 
、、服务端、、
#创建共享目录
[root@localhost ~]# mkdir /upload
#修改nfs主配置文件: ./etc/exports
[root@localhost ~]# vim /etc/exports
/upload  192.168.0.27 (rw)  192.168.0.28(ro)
/test 192.168.0.0/24(rw)      #共享给指定网段
共享文件夹路径   客户机地址(权限) 客户机地址(权限)
#重启nfs服务
[root@1ocalhost ~]# systemctl restart nfs
 
、、客户端访问NFS、、
#列出有哪些NFS共享资源: showmount -e服务器地址,如果客户端没有该命令需安装nfs-uti1s
[root@client ~]# showmount -e 192.168.0.26
#手动挂载NFS共享:mount
[root@cient ~]# mkdir /opt/upload
[rootaclient ~]# mount 192.168.0.26 😕 upload /opt/upload
                                           服务器地址:文件夹路径     挂载点
[root@c1ient ~]# df -h
#客户端验证是否可以是否共享目录
[root@client ~]# cd /opt/upload/
[root@c1ient upload]#touch xx.txt
touch:无法创建"xx.txt":权限不够
#解释:默认客户端是以nfs用户身份访问远端的nfs服务器,如果nfs服务端共享的目录属主为root用户,那客户端默认是没有写权限
#服务端开放允许以root身份访问
[root@localhost ~]# vim /etc/exports
/upload 192.168.0.27(no_root_squash, rw) 192.168.0.28(ro)
解释:no_root_squash不挤压root用户身份(允许以root身份访问)
[root@localhost ~]# systemctl restart nfs
#客户端验证
[root@client upload]# touch xx.txt
[root@client upload]#ls
xx.txt
#为普通用户授权访问nfs共享目录(通过ACL实现,nfs通过用户UID辨别用户身份)
[root@locaThost ~]# setfacl -m u: lisi : rwx /upload
#设置SBIT权限
[root@localhost ~]# chmod o+t /upload/
#客户端lisi用户验证授权
[lisi@client up1oad]$ touch 1isi.txt
[lisi@c1ient upload]$ 1s
lisi.txtxx.txt
[lisi@client upload]$ rm -rf xx.txt
rm:无法删除"xx.txt":不允许的操作
#客户端实现开机挂载配置:/etc/fstab
[root@locaThost]# vim /etc/fstab
192.168.0.26: /xxx/mnt/xxx nfs  defaults,_netdev  0 0
#解释:_netdev:指定nfs是网络设备
 
 
NAS(网络附加存储)存储模式中的文件共享服务:也就是通过网络来进行
samba文件共享服务:支持跨平台,也是个文件共享
FTP文件共享服务 :支持跨平台
NFS文件共享服务:支持跨平台
 
DAS存储(直连存储): 直接附加在电脑主板上的硬盘
 
SAN存储(存储区域网络):快级别的存储,直接把自己电脑上的硬盘共享给其他主机
 
 
 
 
 
Apache httpd的web服务
适用于Unix/linux下的web服务器软件
Apache httpd(开源且免费),支持虚拟主机,支持https的协议,支持用户的认证,支持单个目录的访问控制,支持URL地址重写,支持路径别名,支持反向代理和负载均衡,高度模块化设计,支持并发访问量2万左右(这是一个大的缺陷,现在中国很少用)
Tomcat(开源且免费) #适合做jave语言开发的平台#
Websphere:商业软件,适合做jave语言开发的平台
Weblogic:商业软件,适合jave语言开发的平台
Jboss:红帽公司的,商业软件,适合做jave开发的平台
Tengine:开源软件,基于Nginx二次开发的,淘宝等在用,天猫
Nginx:开源软件免费的web服务器软件
 
httpd介绍
httpd是Apache基金会下一个开源且免费的web服务器软件,高度模块化设计
基于B/S (Browser/Server)模式:服务端提供页面,浏览器显示并下载页面
基于TCP/HTTP协议进行传输
 
安装httpd服务
软件包:httpd
系统服务:httpd
 
 
服务相关参数
主配置文件:/etc/httpd/conf/httpd.conf
默认网页根目录/var/www/html
默认网页文件名: index.html
 
提供的默认配置([root@192 ~]# vim /etc/httpd/conf/httpd.conf )(:set nu   vim显示行号      )
Listen:监听地址:端口(80)
ServerName:注册的DNS域名   (可以在万网域名购买)
DocumentRoot: 网页根目录(/var/www/html)(可以更改)
Directorylndex:默认首页文件名( index.heml)
 
 
 
httpd虚拟web主机
虚拟web主机的特点:由同一台主机提供多个web站点
虚拟web主机实现的三种方式:
基于域名的虚拟主机:www.ipip.com  www.baidu.com www.uu.com  (不适合高并发,访问量不大的前提下)
基于端口的虚拟主机
基于ip地址的虚拟主机
虚拟主机配置路径: /etc/httpd/conf.d/
.conf(比如写一个叫www.conf的)
虚拟主机配置:
<VirtualHost lP地址:端口>
ServerName              此站点的DNS名称
DocumentRoot         此站点的网页根目录
、、写文件,可以写很多多个域名网站、、
[root@192 ~]# cat /etc/httpd/conf.d/liu.conf
<Virtualhost *:80>
ServerName www.liu.com
DocumentRoot /var/www/liu

、、写网站、、
[root@192 ~]# vim /var/www/liu/index.html
[root@192 ~]# cat /var/www/liu/index.html
liu liu liu
 
 
安装 Apache httpd的web服务
[root@192 ~]# yum -y install httpd
开启服务
[root@192 ~]# systemctl start httpd
[root@192 ~]# systemctl status  httpd
文件
[root@192 ~]# rpm -ql httpd
网页根目录
、、重启服务、、
[root@192 ~]# systemctl restart httpd
、、配置解析文件在客户端配置即可、、
[root@192 ~]# vim /etc/hosts
[root@192 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.59.128 www.liu.com
、、检测网站、、
[root@localhost ~]# curl http://www.liu.com
liu liu liu
 
 
 
 
 
Ansible自动化运维 (批量运维的需求)(对远程主机进行批量执行命令的工具)
Ansible是2013年推出的一款IT自动化DevOps软件,基于Python语言开发,2015年被RedHat收购
Ansible特点:
Ansible基于Paramiko实现SSH协议链接通讯,默认只要被管理节点开启SSH服务,Ansible就可以管理远程主机
使用Ansible不需要在客户端主机(被管理主机)安装Agent
Ansible模块化设计,并且模块丰富,支持自定义模块,自定义模块可用任何语言编写
Ansible基于PyYAML模块支持Playbook,可以通过Playbook完成可重复的复杂工作
支持Jinjia2模块
官网:https://www.ansible.com/
 
批量管理工具:
Ansible :基于python语言开发,轻量级的批量管理工具
SaltStack:基于python语言开发,c/s架构
Puppet:基于Ruby语言开发,冷门语言
Chef:基于Ruby语言开发
 
实验环境准备
实验机3台,1台为ansible管理主机
管理主机名称为ip地址:
ansible-server,ip地址:192.168.0.26
被管理主机名称与ip地址:
web1,ip地址:192.168.0.27
web2,ip地址:192.168.0.28
 
 
、、关闭防火墙、、
命令省略
 
、、管理节点修改/etc/hosts文件实现本地解析、、
vim /etc/hosts
192.168.0.26 web1
192.168.0.27 web2
192.168.0.28 web3
 
、、管理节点与管理节点实现ssh密钥认证、、
ssh-keygen
 
、、传递公钥到被管理节点、、
for i in web1 web2 web3

do
ssh-copy-id $i
done
 
、、验证SSH免密登录、、
ssh web1
exit
ssh web2
exit
ssh web3
exit
 
 
安装Ansible软件包
安装ansible软件包,由于ansible需要epel源,本实验配置了阿里的epel源和阿里的Base源(Base源用于安装ansible所需依赖),本地的CentOS7镜像源
[root@ansible-server ~]#yum -y insta77 wget   #下载wget工具
[root@ansible-server ~]# wget -o /etc/yum.repos.d/centos-Base.repo
https: //mirrors. aliyun.com/repo/centos-7.repo   #下载阿里Base源
[root@ansible-server ~]# wget -o /etc/yum.repos.d/epe1.repo
http: //mirrors.aliyun.com/repo/epe1-7.repo    #下载阿里epel源
、、安装ansible软件包、、
[root@ansible-server ~]# yum -y install ansible
、、查看ansible版本信息、、
[root@ansible-server ~]# ansible --version
ansible 2.9.17
 
 
定义Ansible主机清单
ansible主配置文件:/etc/ansible/ansible.cfg
ansible默认清单文件: /etc/ansible/hosts
、、编辑清单文件定义主机组、、
[root@ansible-server ~]# vim /etc/ansib1e/hosts
[websrvs]
192.168.0.26
192.168.0.27
192.168.0.28
、、列出指定组内主机列表、、
[root@ansible-server ~]# ansible websrvs --list-host
hosts (4):
192.168.0.26
192.168.0.27
192.168.0.28
、、ansible-doc命令介绍、、
ansible-doc    #模块文档命令
常用选项:
-l   #列出所有模块列表
-s  #查看模块帮助信息
、、列出模块列表、、
[root@ansible-server ~]# ansible-doc -1
、、显示ping模块帮助信息、、
[root@ansible-server ~]# ansible-doc -s ping
、、使用ping模块测试websrvs组主机连通性、、
[root@ansible-server ~]# ansible websrvs -m ping
、、Ansible命令返回值的颜色表示:、、
绿色:代表对远程节点不进行相应修改,没有发生改变,命令执行成功了
黄色:代表对远程节点进行了相应的修改,命令执行成功了
红色:代表你的命令执行失败或者是有异常,反正就是错误了
粉色:代表命令执行后发出的警告信息,给我们一些建议(可以忽略)
 
 
Ansible执行命令的方式
ad-doc:在命令行执行的命令(临时命令)
Playbook:将命令写入到Playbook剧本中
 
 
 
 
Ansible命令格式
常用命令格式: ansible 组名/主机  [-m模块名]   [-a模块参数]
比如:ansible websrvs -m ping 直接调用ping模块
 
 
Ansible常用模块介绍
command模块
command模块为默认模块,用于远程执行命令(命令模块)
注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处理,在使用command模块时,如果需要执行的命令中含比如"<“,”>“,” |“””和“&”这些符号时,这些符号的功能也会失效
常用参数:
chdir:此参数表示执行命令之前,会先进入到指定的目录中
creates:此参数表示文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行
removes:此参数表示文件如果不存在于远程主机中,则不执行对应命令,如果存在,才执行
 
yum模
yum模块,用于在远程主机通过yum源管理软件包
常用参数:
name:必须参数,用于指定需要管理的软件包名字
state:用于指定软件包的状态
presentl: 比状态为默认值,表示安装软件包
installed: 此状态表示安装软件包,与present等效
latest:此状态表示安装yum中最新版本软件包
removed: 此状态表示删除对应软件包
absent: 此状态表示删除对应软件包,与removed等效
 
yum模块示例:
#使用yum模块安装vsftpd软件包(本地yum源默认已经禁用软件包检测)
[root@ansib1e-server ~]# ansible websrvs -m yum -a ‘name=vsftpd’
#卸载vsftpd软件包
[root@ansible-server ~]# ansible websrvs -m yum -a ‘name=vsftpd state=removed’
#ftp组内主机安装vsftpd服务
[root@ansible-server ~]# ansible websrvs -m yum -a ‘name=vsftpd’
 
 
service模块
service模块,用于管理远程主机的服务,如:启动或停止服务
常用参数:
name:此参数用于指定需要操作的服务名称,如vsftpd
state: 此参数用于指定服务的状态
started: 此状态用于启动服务
 
#启动vsftpd服务
[root@ansible-server ~]# ansible websrvs -m service -a ‘name=vsftpd state=started’
#查看服务状态
[root@ansible-server ~]# ansible websrvs -m she11 -a ‘systemct1 status vsftpd’
restarted:此状态用于重启服务
#重启服务
[root@ansible-server ~]# ansible ftp -m service -a ‘name=vsftpd state=restarted’
 
 
copy模块
copy模块,用于将文件复制到远程主机
常用参数:
src:此参数用于指定需要拷贝的文件或目录
dest:此参数用于指定文件将拷贝到远程主机的哪个目录中,dest为必须参数
#在ansible本地主机创建文件
[root@ansible-server ~]# touch /tmp/test.txt
 
#将本地/tmp/test.txt文件拷贝至ftp组内主机的/var/ftp目录下
[root@ansible-server ~]# ansible ftp -m copy -a ‘src=/tmp/test.txt dest=/var/ftp/’
[root@ansible-server ~]# ansible ftp -m she17 -a ‘ls /var/ftp
 
content:此参数当不使用src指定拷贝的文件时,可以使用content直接指定文件内容,src与content两个参数必有其一,否则会报错
#使用content参数在远程主机直接创建文件并写入内容
[root@ansible-server ~]# ansible ftp -m copy -a ‘content=“he11o” dest=/var/ftp/test1’
 
#查看远程主机文件内容
[root@ansible-server ~]# ansible ftp -a ‘cat /var/ftp/test1’
 
force:此参数当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,可选值有yes和no,默认值为yes,表示覆盖,如果设置为no
则不会执行覆盖拷贝操作,
远程主机中的文件保持不变
 
#本地创建test1文件,并写入abc
[root@ansible-server ~]#echo abc > test1
 
#使用force参数指定当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,不执行覆盖
[root@ansible-server ~]# ansible ftp -m copy -a ‘src=/tmp/test1 dest=/var/ftp/test1
force=no’
192.168.0.25 | SUCCESS => {
“changed” : false
 
 
 
 
 
 
 
Ansible剧本Playbook
Ansible playbook剧本介绍
在ansible中,类似"脚本"的文件被称作"剧本”,英文名称为playbook,用于配置,部署,和管理被控节点
我们只需要把模块按照顺序编排在playbook剧本中,ansible就会按照剧本一步一步的执行,最终达到我们的目的
playbook是由一个或多个"play"组成的列表,当我们在工作中往往需要不止做一件事情的时候,使用playbook会更加适合。
playbook 与ad-doc相比是一种完全不同的运用方式,剧本需要遵循YAML语法格式编写,文件名以".yam"或者".yml"作为文件名后缀
 
playbook核心元素
hosts:执行的远程主机列表’
tasks:任务集
variables:内置变量或自定义变量在playbook中调用
tempaltes模板,可替换文件中的变量并实现一些简单逻辑的文件
handles和notify结合使用,由特定条件触发的操作,满足条件方执行,否则不执行
tags标签,指定某条任务执行,用于选择运行playbook中的部分代码。
 
Ansible学习文档
https://www.zsythink.net/archives/tag/ansible/page/5
 
 
 
 
 
 
 
NTP网络时间协议
NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC(世界统一时间),再配合各个时区的偏移调整就能实现精准同步对时功能。
chrony是网络时间协议NTP的实现方式,Chrony是一个开源的自由软件,在RHEL7/CentOS7操作系统已经是默认安装服务,它能保持系统时间与NTP时间服务器的时间保持同步,让时间始终保持同步。
 
软件包: chrony
服务名: chronyd
命令程序: chronyc
配置文件:/etclchrony.conf
 
安装chrony程序:
#centos7/RHEL7以默认安装
[root@localhost ~]# rpm -q chrony
chrony-1.29.1-1.el7.x86_64
、、查看服务运行状态、、
、、启动服务设置服务随机自启、、

 
 
配置文件介绍
、、修改配置文件/etc/chrony.conf配置文件、、
[root@loca7host ~]# vim /etc/chrony.conf

Use public servers from the poo1.ntp.org project.

Please consider joining the poo1 (http: //www.poo1.ntp.org/join.htm7).

#配置NTP时间服务器
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
server 2.rhel.pool.ntp.org iburst
server 3.rhel.pool.ntp.org iburst

Record the rate at which the system clock gains/losses time.

#记录系统时钟获得/丢失时间的速率至drift文件中
driftfile /var/lib/chrony/drift
 
#Allow the system clock to be stepped in the first three updates
#if its offset is larger than 1 second.
#默认情况下,chronyd通过减慢或加快时钟速度来逐渐调整时钟。如果时钟与实际时间偏差太大,则需要很长时间才能纠正错误。这种方法叫做步进时钟(时间跳变)。
#此处表示如果调整值大于1000秒,则这将使系统时钟步进,但仅在前10个时钟更新中。
makestep 1000 10
 
#select which information is logged.
#将对系统增益或损耗率的估计值以及所做的任何转换记录的更改记录到名为的文件中tracking.log
#log measurements statistics tracking
 
常用命令:
#查看时间同步源
[root@localhost ~]# chronyc sources -n
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample

^+ 119.28.206.193                2   6   367    41  -3554us[-3554us] +/-   59ms
^- electrode.felixc.at           3   6   357    41  +1911us[+1911us] +/-  117ms
^* 119.28.183.184                2   6   357    42  +2165us[+4242us] +/-   55ms
^- server2.as2.ch                2   7   377   105    -26ms[  -24ms] +/-  135ms
 
、、立刻手动同步时间、、
[root@localhost ~]# chronyc -a maskstep
200 OK
、、检查时间是否同步、、
[root@localhost ~]# chronyc tracking
Reference ID    : 119.28.183.184 (119.28.183.184)      #同步到的服务器ID与IP地址
Stratum         : 3
Ref time (UTC)  : Thu Feb 17 03:33:14 2022
System time     : 0.000934037 seconds fast of NTP time
Last offset     : 0.000923727 seconds
RMS offset      : 0.244663954 seconds
Frequency       : 3.424 ppm fast
Residual freq   : 0.334 ppm
Skew            : 18.363 ppm
Root delay      : 0.067823 seconds
Root dispersion : 0.003700 seconds
Update interval : 64.4 seconds
Leap status     : Normal
、、查看时间、、
[root@localhost ~]# date
2022年 02月 17日 星期四 11:34:51 CST
 
案例:
配置为阿里云的服务器时间
、、配置服务端、、
[root@7ocaThost ~]#vim /etc/chrony.conf

use public servers from the poo1.ntp.org project.

Please consider joining the poo1 (http: //www.poo1.ntp.org/join.htm1).

注释其他server开头的配置.添加阿里云NTP公共时间同步服务器
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
#添加阿里NTP服务
server ntp. aliyun.com iburst
server ntp1.aliyun.com iburst
#允许所有网段客户端进行时间同步
allow 0.0.0.0/0
#NTP服务器不可用时,采用本地时间作为同步标准
local stratum 10
#重启chronyd服务
[rootalocaThost ~]# systemctl restart chronyd
#查看时间同步源
[root@localhost ~]# chronyc sources -n
、、配置客户端、、
#server 0.rhel.pool.ntp.org iburst
#server 1.rhel.pool.ntp.org iburst
#server 2.rhel.pool.ntp.org iburst
#server 3.rhel.pool.ntp.org iburst
server  刚才服务端的ip  iburst
重启一下服务即可
就是直接同步服务端的时间
 
 
 
 
 
raync远程同步(同步文件)
rsync(Remote Sync):是一款开源,快速,多功能的可实现本地或远程主机数据同步与增量备份的优秀工具。(数据同步与备份的工具)可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步,远程备份等功能。
在同步备份时,默认情况下,rsync通过其独特的“quick check"算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此更加灵活。
 
ranync特性
1)支持拷贝特殊文件如链接,设备文件等
2)可以有排除指定文件或目录同步的功能
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
 
 
rsync官方地址: http://rsync.samba.orgl
安装方式:源码安装、二进制RPM安装
#安装rsync
[root@master ~]# yum -y install rsync
 
 
本地同步语法
命令格式1: rsync选项…     本地目录A     本地目录B      #同步整个目录
命令格式2: rsync选项…      本地目录A/   本地目录B     #只同步目录下的数据
 
常用选项:
-n     测试同步过程,不做实际修改
–dalete     删除目标目录下多余的文档
-v     显示详细操作信息
-z     传输过程中启用压缩/解压缩(自动完成解压缩)
-a      递归同步,包含目录/字目录及所有文件、保留符号链接文件、保留文件权限、时间标记、保留文件的属主/属组标记、保留设备文件及其他特殊文件
 
 
本地同步:
#在本地创建2个目录使用rsync实现数据同步
[root@master ~]# mkdir /test1/opt/test2
 
#将/test1目录同步至/opt/test2目录下(同步整个目录)
[root@master ~]#rsync -avz /test1 /opt/test2
sending incremental file list     #发送增量文件列表
test1/
 
 
远程同步语法
命令格式1: rsync本地目录       用户名@对方IP地址:/目标目录        #同步源目录本身
命令格式2: rsync本地目录/      用户名@对方IP地址:/目标目录        #同步源目录下内容
 
 
远程同步:
#客户端主机安装rsync程序
[root@c1ient ~]#yum -y install rsync
#将本地主机/test1目录下内容同步到其他主机
[root@master ~]# rsync -avz /test1/ root@192.168.0.28:/opt
root@192.168.0.28’s password :
sending incremental file list
#查看主机查看是否同步成功#
ls /opt
abc.txt    xx.txt
 
 
 
 
rsync+inotify实时同步
inotify是Linux内核用于通知用户空间的程序文件系统变化的机制,如文件增加、删除等事件可以立刻让用户得知。
inotify官方地址: http://download.sf.net/inotify-tools/
 
环境前准备:
#配置同步主机之间ssh免密登录
[root@master ~]# ssh-keygen
[root@master ~]# ssh-copy-id root@192.168.0.28
[root@master ~]# ssh 192.168.0.28
[root@c1ient ~]# exit
 
源码安装inotify
#安装inotify依赖包(gcc)
[root@master ~]#yum -y install gcc
#解压源码包
 
 
 
inotify使用方式
命令格式:inotify  目标 目标文件
常用选项:
-m   持续监控,捕获一个事件后不退出
-r     递归监控,包括子目录
-q    减少屏幕输出信息
-e     指定监控的,modify(修改),move(移动、改名),create(创建),delete(删除), attrib(权限)
 
 
 
 
 
 
 
 
 
used:已经使用的内存
free:剩余的内存
shared:#共享内存总量
buff/cache:#块设备与普通文件占用的缓存数量
avai1able:#还可以被应用程序使用的物理内存大小
#解释:Swap 内存交换空间,当物理内存不足时,可以使用硬盘空间充当内存使用
total:#交换分区内存总量
used:#正在使用的交换分区内存
free:#空闲交换分区内存

查看网卡信息
网卡配置文件地址: /etc/sysconfig/network-scripts/网卡名
ifconfig 用于显示和设置网卡的参数
ip a 也可以查看网卡,显示所有网卡,没有启用的也显示
用法:ifconfig (网卡名)
//查看系统网卡信息//
ifconfig

查看主机名和修改主机名
/etc/hostname文件用于存放主机名
hostname命令用于显示和设置主机名
用法:hostname 新名字(不要用中文,不要加特殊符号,英文即可)
//临时修改将系统用户名修改为liu//
hostname liu
//永久修改系统用户名为liu方法一//
hostnamectl set-hostname liu
//永久修改系统用户名为liu方法二//
修改配置文件,直接vim修改配置文件
//查看系统主机名方法一//
hostname
//查看系统主机名方法二//
cat /etc/hostname

vi/vim文本编辑器
vim是从vi发展出来的一个文本编辑器,vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性
vi/vim共分为三种模式:命令模式,输入模式,底线模式(末行模式)
命令模式:刚刚启动vi/vim,便进入了命令模式
输入模式:在命令模式下按a/i/o 就进入了输入模式(就可以开始往里面写东西了)
ESC,退出输入模式,切换到命令模式
底线命令模式:在命令模式下按下:(英文冒号)就进入了底线命令模式

命令用法:vim 文件名
若目标文件不存在,则新创建文件并编辑
若目标文件已存在,则打开文件并编辑

命令模式:刚刚启动vi/vim,便进入了命令模式
i #切换到输入模式,在当前光标所在字符前插入(一般用这个模式,这个也相对好用一些)#
a #切换到输入模式,在当前光标所在字符后插入#
o #切换到输入模式,在当前光标所在行下插入新行#
:#切换到底线命令模式,以在最底一行输入命令#
x #在命令模式下册除当前光标所在的单字符#
dd #删除─整行内容,配合数字可删除指定范围内的行#
C #删除当前光标及光标后所有内容并进入输入模式#
u #恢复上一次修改内容,一次恢复一个操作,可多次恢复,直到恢复本次操作初始状态为止(在没有保存的情况下)#
$ #将光标移动至行尾#
0(数字0) #将光标移动至行首#
gg #跳转至文件第一行#
G #跳转至文件最后一行#
yy #复制当前行,配合数字可以同时复制多行#(复制五行:按 5 yy)
p #粘贴当前光标所在行下#
/(关键字) #搜索文件内关键字,n从上向下快速定位关键字,N从下向上快速定位关键字#

底线命令模式
可以输入单个或多个字符的命令,可用的命令非常多如下
:w 保存
:q 退出
:wq 保存并退出
:q!强制退出不保存 //普通用户无法使用!号强制的功能//
:wq!强制保存并退出 //普通用户无法使用!号强制的功能//
:set nu 以行号的形式显示文件内容
:set nonu 取消行号显示
:行号 快速跳转到指定行
:r 读入另一个文件的数据,文件内容添加到光标的下一行 //将根目录下的叫liu的文件的内容导入进来,命令是:r /liu //

例如:
//编辑名字为test.txt的文件,并在里面写入hello !!!//
1:vim test.txt
2:然后按i键进入插入模式
3:写入hello !!!
4: 按ESC键退出到命令模式
5:然后输入:wq

修改网卡IP地址
网卡配置文件地址: /etc/sysconfig/network-scripts/网卡名
步骤:
1:vim /etc/sysconfig/network-scripts/网卡名
2:IPADDR=“192.168.0.60”#修改IP地址(其他的自己觉得需要修改的就修改)
!:ifconfig#用于显示和设置网卡的参数
systemctl restart network #重启网络(修改完IP需要重新启动)
ifup 网卡名#启动该网卡设备(当服务器有多个网卡的时候,需要启动其他网卡,这个时候使用这个命令)
ifdown网卡名#禁用该网卡设备

使用命令修改IP地址
nmcli connection modify 网卡名 ipv4.method manual ipv4.addresses lp地址/掩码 connection.autoconnect yes
解释:
nmcli connection modify(修改)
网卡名ipv4.method(配置ipv4地址方法)
manual(手动配置)
ipv4.addresses ( ipv4地址)
lp地址/掩码connection.autoconnect yes(开机自动连接)
激活网卡: nmcli connection up 网卡名
关闭网卡: nmcli connection down 网卡名
重启网卡: nmcli connection reload 网卡名

host命令
host用于将一个域名解析到一个IP地址,或将一个IP地址解析到一个域名
例如:
//解析www.baidu.com//
host www.baidu.com

nslookup命令
nslookup用于查询域名解析是否正常,在网络故障时用来诊断网络问题
例如:
//查询百度的域名解析//
nslookup www.baidu.com

alias别名管理命令
alias命令用于设置命令别名,用户可以使用alias自定义命令别名来简化命令的复杂度
用户家目录下有一个 .bashrc 文件是用来存放命令别名的,永久修改别名就直接写入这个文件
用法:alias (别名)=(命令命令记得要用单引号或者双引号括住) !注意:=号前后不能有空格
unalias 别名 //取消别名//
alias //查看当前系统有哪些别名//
\ 别名 //本次取消别名功能(\)//
例如:
//将ls /etc/sysconfig/network别名修改为lsnet//
alias lsnet=‘ls /etc/sysconfig/network’
//永久修改别名//
vim .bashrc 写入即可
!注意:定义别名还是不要与系统自带的命令冲突

history管理历史命令
history命令用于显示历史记录和执行过的命令,登录shell时会读取~./bash_history历史文件中记录下的命令,当退出或登出shell时,会自动保存到历史命令文件,该命令单独使用时,仅显示历史命令
.bash_history //在家目录下,存放历史命令//
用法:history (-选项)(参数)
常用选项:
-a 追加本次新执行的命令至历史命令文件中
-d 删除历史命令中指定的命令
-c 清空历史命令列表(但是不彻底,最彻底的是删除存放文件)
快捷方式:
!(命令编号) 快速调用命令历史中第N条命令
!e 调用命令历史中以e开头的命令(只调用最新使用的以e开头的命令)
!! 重复执行上一条命令
例如:
//查看系统历史命令//
history
或者直接查看存放文件 .bash_history
cat .bash_history
//删除指定历史命令//
先history查看命令编号
然后 history -d 编号
!默认情况下历史命令能够存1000条, 要修改默认的保存命令的条数vim etc/profile,然后修改46 HISTSIZE=1000,
后面的1000就可以改成想默认保存命令条数的数字即可

date命令
date命令用于显示或设置系统日期与时间
用法:date (-选项)(+格式符)#查看系统日期时间#
date (-选项)[MMDDhhmm[[CC]YY][.ss]]
常用选项:
-s 设置日期时间
格式符:
+%Y 年份
+%B 月份
+%d 日
+%H 时
+%M 分
+%S 秒
+%F 年-月-日
+%X 时:分:秒
例如:
//查看当前系统的时间//
date
//只显示月份//
date +%B
//可以组合使用,中间可以加一些符号来区分,什么符号也行,空格不可以//
[root@localhost ~]# date +%X-%F
21时34分33秒-2022-01-19
//修改年月日时间//
[root@localhost ~]# date -s 2022-1-1
2022年 01月 01日 星期六 00:00:00 CST
//修改时分秒时间//
[root@localhost ~]# date -s 12:12:00
2022年 01月 01日 星期六 12:12:00 CST
//同时设置年月日和时分秒//#这里用单引号和双引号都可以#
[root@localhost ~]# date -s ‘2020-1-1 12:12:00’
2020年 01月 01日 星期三 12:12:00 CST
!注意:区别双引号和单引号:
‘’ 单引号,屏蔽特殊符号的功能,引用整体
“” 双引号,引用整体,不会屏蔽特殊符号的功能
linux两种时钟:
系统时钟:内核通过CPU的工作频率去计算的时间
//显示系统时间//
[root@localhost ~]# date
2020年 01月 01日 星期三 12:20:03 CST
硬件时钟:
//显示硬件时间//
[root@localhost ~]# clock
2020年01月01日 星期三 12时18分53秒 -0.615914 秒
//显示并设置系统与硬件时间//
[root@localhost ~]# hwclock
2020年01月01日 星期三 12时25分05秒 -0.926933 秒
hwclock (-选项)
选项:
-s :把系统时间设置成与硬件时间相同
-w:把硬件时间设置成与系统时间相同
例如:
//把硬件时间设置成与系统时间相同//
[root@localhost ~]# hwclock -w

cal命令
显示日历
//显示日历//
[root@localhost ~]# cal
//显示2020年的日历//
[root@localhost ~]# cal 2020

wc统计命令
wc 用于统计文件的字节数、行数,并将统计的结果输出到屏幕
用法:wc (-选项) 文件名
常用选项:
-c #统计字节数
-l #统计行数
[root@localhost ~]# wc /etc/passwd
38 66 1906 /etc/passwd
38:代表38行数
66:代表共多少单词
1906:代表文件的字节
/etc/passwd 文件名
例如:
//查看/etc/passwd文件有多少行//
[root@localhost ~]# wc -l /etc/passwd
38 /etc/passwd

管道符
管道符“|”:将命令的输出结果交给另外一条命令作为参数继续处理
例如:
//查看/etc/passwd文件的10行,然后输出的结果再查看末尾5行//
[root@localhost ~]# head -10 /etc/passwd | tail -5
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
//查看/etc/passwd文件的10行,然后输出的结果再查看末尾5行,再查看有几行//
[root@localhost ~]# head -10 /etc/passwd | tail -5 | wc -l
5

重定向操作
重定向操作:将前面命令的输出结果,写入到其他的文本文件中
重定向表示符号:

重定向输出 (覆盖原来的内容)

重定向输出 (追加到原来内容的下面)
< 输入重定向 (覆盖)
<< 输入重定向 (追加)
只收集正确的输出结果(报错的命令是不行的)
2> 只收集错误的输出结果 (还是覆盖的方式)
2>> 只收集错误的输出结果 (追加的方式)
&> 正确错误的都收集 (覆盖方式)
&>> 正确错误的都收集 (追加的方式)
//将查看的/etc/passwd文件内容里的前五行,输出的内容存到/下,并命名为test,如果文件test是已经存在的,则覆盖原来的内容//
[root@localhost ~]# head -5 /etc/passwd > /text
[root@localhost ~]# cat /text
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
//将错误的执行结果放到/test//
[root@localhost ~]# ls ahah 2> /test
[root@localhost mail]# cat /test
ls: 无法访问ahah: 没有那个文件或目录

echo命令与sleep命令
echo命令用于输出指定的字符串和变量
用法:echo (-选项)(参数)
例如:
//将1234567890这个内容追加到/testz中//
[root@localhost /]# echo 1234567890 >> /test
[root@localhost /]# cat /test
ls: 无法访问ahah: 没有那个文件或目录
1234567890
//echo $PATH这个环境变量//
[root@localhost /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

sleep命令
sleep命令可以用来将目前动作延迟一段时间
------命令格式:sleep 时间
------常用选项:s 秒 m 分钟 h 小时 d 日
//10秒后终端回来//
sleep 10
! 写脚本的时候有用,在命令行没啥用基本

用户账号管理
用户账号的作用:用户账号可用来登录系统,可以实现访问控制

useradd创建用户
useradd命令用于创建新的用户
用法:useradd (-选项)用户名
常用选项:
-u 指定用户的UID
-d 指定用户家目录
-c 用户描述信息
-g 指定用户基本组
-G 指定用户附加组
-s 指定用户的shell
//创建一个叫liu的用户//
[root@localhost /]# useradd liu

id命令
id命令用于查看系统用户所在组的信息
用法:id (-选项)(用户名)
//查看liu这个用户所在组的信息//
id liu

/etc/passwd 文件
用户的基本信息存放在/etc/passwd文件
//查看当前系统的用户基本信息//
root❌0:0:root:/root:/bin/bash
#每个字段含义解释,用户名:密码占位符:UID:基本组GID:用户描述信息:家目录:解释器程序组成#
UID:0 超级用户
UID:1-499 系统伪用户,不能登录系统并且没有家目录
UID:500-65535 普通用户
组:
基本组(初始组):一个用户只允许有一个基本组
附加组 (在基本组之外的):一个用户可以允许有多个附加组

用户–>shell程序–> 内核–>硬件

/etc/default/useradd文件
/etc/default/useradd存放用户默认值信息
//查看一下文件//
[root@localhost ~]# cat /etc/default/useradd

useradd defaults file

GROUP=100 #用户默认组#
HOME=/home #用户家目录#
INACTIVE=-1 #密码过期宽限天数(/etc/shadow文件的第7个字段)#
EXPIRE= #密码失效时间(/etc/shadow文件第8个字段)#
SHELL=/bin/bash #默认使用的shell#
SKEL=/etc/skel #模板目录#
CREATE_MAIL_SPOOL=yes #是否建立邮箱#

/var/spool/mail用户邮件文件
//查看邮箱目录//
[root@localhost ~]# ls /var/spool/mail/
liu roo root rpc

passwd命令设置用户密码
passwd命令用于设置用户密码
密码规范:长度不能少于8个字符,复杂度(数字,字母区分大小写,特殊字符),这个规范是给普通用户规范的,root用户设置什么都可以
密码规范:本次修改的密码不能和上次的密码太相近了,对普通用户而言
用法:passwd (-选项)(用户名)
常用选项:
-S 查看密码信息
-l 锁定用户密码
-u 解锁用户密码
-d 删除密码
–stdin 通过管道方式设置用户密码
非交互设置用户密码:
命令格式:echo ‘密码’ | passwd --stdin 用户名
//查看用户的密码信息//
passwd -S 用户名
//锁定用户的密码(只有管理员才能执行,就是密码就算是对的,这个用户也登录不上)//
passwd -l 用户名
//解锁用户密码//
passwd -u 用户名
//删除用户密码//
passwd -d 用户名

/etc/shadow用户密码文件
用户的密码信息存放在/etc/shadow文件中,该文件默认任何人都没有任何权限(不包括root)
root: 6 6 6aY/MUvVbyEsZ8iWB$wRLwIRRZ5kyA78KVEHx4wlraTpr5Q94WZljUPS73nUt04Mj/imtaw8.TNl.mKvX83yvHmxJG6NvGs2evfNCI0:18971:0:99999:7:::
第一字段:用户名
第二字段:密码加密字符串,加密算法为SHA512散列加密算法,如果密码位是“*"或者“! !"表示密码已过期
第三个字段:密码最后一次修改日期,日期从1970年1月1日起,每过一天时间戳加1
第四个字段:密码修改的期限,如果该字段为0表示随时可以修改密码,例如:该字段为10,代表10天之内不可以修改密码
第五个字段:密码有效期
第六个字段:密码到期前警告时间(和第五个字段相比)
第七个字段:密码过期后的宽限天数(和第五个字段相比)
第八个字段:账号失效时间,日期从1970年1月1日起
第九个字段:保留
//chage命令用于修改/etc/shadow文件信息,修改文件内容第三个字段(密码最后一次修改时间为0)//
[root@localhost /]# chage -d 0 用户名

usermod修改用户属性
usermod命令用于修改已存在用户的基本信息
用法:usermod (-选项)用户名
常用选项:
-u 修改用户UID
-c 修改用户描述信息
-d 修改用户家目录
-g 修改用户基本组
-G 添加用户附加组
-s 修改用户shell
//修改用户的UID//
usermod -u 1111 用户名
//修改用户的描述信息//
usermod -c www.liudaheng.com 用户名

userdel删除用户
userdel用于删除给定的用户以及与用户相关的文件,该命令若不加选项仅删除用户账号,不删除用户相关文件
用法:userdel (-选项)用户名
常用选项:
-r 删除用户同时,删除与用户相关的所有文件
//仅删除账号,不删除家目录//
userdel 用户名
//删除账号,然后删除账号的家目录的文件//
userdel -r 用户名

groupadd添加组
groupadd 用于创建一个新的工作组,新组的信息将被添加到/etc/group文件中
用法:groupadd (-选项)组名
常用选项:
-g GID //指定组的GID//

/etc/group组信息文件
组信息存放在/etc/group文件中
//查看组文件信息//
[root@localhost /]# cat /etc/group
root❌0:
#每个字符解释:组名:组密码占位符:GID:组中附加用户#

/etc/gshadow组密码文件
组密码信息存放在/etc/gshadow文件中
//查看组密码文件//
[root@localhost /]# cat /etc/gshadow
root:::
#每个字段含义:组名:组密码:组内管理员:组中附加用户#

groupmod修改组属性
groupmod 用于修改指定工作组属性
用法:groupmod (-选项)组名
常用选项:
-g GID #修改组的GID#
-n 新组名 原组名#修改组名#
//修改组名//
[root@localhost /]# groupmod -n liudaheng2022 da
//修改组GID//
[root@localhost /]# groupmod -g 1111 liu

gpasswd组管理命令
gpasswd是Linux工作组文件/etc/group和/etc/gshadow管理工具,用于将用户添加到组或从组中删除
用法:gpasswd (-选项)用户名 组名
常用选项:
-a //将用户添加到工作组//
-d //将用户从工作组中删除//
//将用户da添加到组liu//
gpasswd -a da liu
//将用户从工作组里删除//
gpasswd -d da liu

groupdel删除组
groupdel用于删除指定工作组
用法:groupdel 组名

chmod权限管理
chmod (英文全拼: change mode)设置用户对文件的权限
用法:chmod (-选项)归属关系±=权限类别 文件
root用户可以修改任何文件和目录的权限
文件所有者
常用选项:
-R 递归修改,包含目录下所有的子文件和子目录
归属关系:u所有者 g所属组 o其他人
权限类别:r读取 w写入 ,×执行, -没有权限
操作:+添加权限–去除权限=重新定义权限
权限修改可以使用数字的方式进行更改:r=4,w=2 ,x=1 ,0=没有权限 需要文件拥有哪个权限,加数字即可(3一般没啥用,所以注意组合,没有读写权限,写入和执行没啥用了就)
比如:需要文件的所有者的权限是读写权限,所属组是读权限,其他人是没有权限
则命令就是:chmod 640 文件名
例如:
//给hello文件所属组添加执行权限,给其他人也添加执行权限,使用逗号隔开,英文//
chmod g+x,o+x hello
//给hello文件其他人添加上阅读权限//
chmod o+r hello
//给hello文件所属组删除执行权限,给其他人也删除执行权限,使用逗号隔开//
chmod g-x,o-x hello
//重新定义hello文件的所有者的权限是rwx//
chmod u=rwx hello
//用数字的方法设置hello文件的权限是rwx//
chmod 777 hello
//文件的其他人没有任何权限//
chmod o=— hello
//修改文件拥有所有权限//
chmod ugo=rwx hello
//目录和目录下的文件权限都是一样的//
chmod -R 777 hello

umask预设权限(一般用不到,了解即可)
umask用于显示或设置创建文件的权限掩码,当我们想改变创建文件和目录时的默认访问权限,则可以通过umask命令来实现。
在linux系统中,我们创建一个新的文件或者目录的时候,这些新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关。
若用户创建一个文件,则文件的默认访问权限为 -rw-rw-rw- ,创建目录的默认权限drwxrwxrwx
,而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。

可以看到umask值为0002,其中第一个0与特殊权限有关,可以暂时不用理会,
后三位002则与普通权限(rwx)有关,其中002中第一个0与用户(user)权限有关,
表示从用户权限减0,也就是权限不变,所以文件的创建者的权限是默认权限(rw),
第二个0与组权限(group)有关,表示从组的权限减0,所以群组的权限也保持默认权限(rw),
最后一位2则与系统中其他用户(others)的权限有关,由于w=2,
所以需要从其他用户默认权限(rw)减去2,也就是去掉写(w)权限,
则其他人的权限为rw - w = r,则创建文件的最终默认权限为 -rw-rw-r-- 。
用法:umask (-p)(-s)(mode)
-p 显示数字的方式
-S 显示字母的方式
例如:
//设置默认的权限为rx,rx,rx//
umask 0222

chown归属关系管理
chown(英文全拼: change owner)用于设置文件的所有者和所属组关系
用法:
chown [-选项] 所有者:所属组 文档 #同时修改所有者和所属组身份
chown [-选项] 所有者 文档 #只修改所有者身份
chown [-选项] :所属组 文档 #只修改所属组身份
常用选项:
-R 递归,目录下创建的东西所有者和所属组都和目录一样了

SetUID特殊权限(谨慎使用)
SetUID (SUID):对于一个可执行的文件用了SUID权限后,
普通用户在执行该文件后,临时拥有文件所有者的身份,
该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有身份
SetUID权限会附加在所有者的×权限位上,所有者的×权限标识会变成s(!注意:创建的文件的执行权限位为S时,表示原来文件没有执行权限,如果有执行权限的是小s)
设置SetUID命令格式: chmod u+s 文件名
//可以理解为普通用户可以修改自己的密码,这是因为passwd这个命令暂时成为了root用户权限,
相当于圣旨一样。//
//将cat设置SetUID//
which cat 找出文件路径
chmod u+s 路径文件
这样普通用户当使用cat时可以暂时使用root
!注意:创建的文件的执行权限位为S时,表示原来文件没有执行权限,如果有执行权限的是小s

SetGID特殊权限
SetGID (SGID)︰当对一个可执行的二进制文件设置了SGID后,
普通用户在执行该文件时临时拥有其所属组的权限,
该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有组身份
当对一个目录作设置了SGID权限后,普通用户在该目录下创建的文件的所属组,均与该目录的所属组相同
SetGID权限会附加在所属组的×权限位上,所属组的×权限标识会变成s
设置SetGID命令格式: chmod g+s文件名

SticKY BIT特殊权限
Sticky BIT (SBIT):该权限只针对于目录有效,当普通用户对一个目录拥有w和x权限时,普通用户可以在此目录下拥有增删改的权限,因为普通用户对目录拥有w权限时,是可以删除此目录下的所有文件
如果对一个目录设置了SBIT权限,除了root可以删除所有文件以外,普通用户就算对该目录拥有w权限,也只能删除自己建立的文件,不能删除其他用户建立的文件
SBIT权限会附加在其他人的×权限位上,其他人的×权限标识会变成t
SBIT用法:chmod o+t 目录名
//例如,我想让hello目录下的文件加上SBIT权限,不能让普通用户互相删除文件//
chmod o+t hello
[root@localhost liudaheng]# ll -d hello/
drwxrwxrwt. 2 root root 6 1月 25 20:58 hello/
然后用多个用户创建文件然后测试一下

FACL访问控制列表(简称ACL)
FACL (Filesystenmctl Access Control List)文件系统访问控制列表:利用文件扩展属性保存额外的访问控制权限,单独的为某一个用户量身定制一个权限
命令格式: setfacl 选项 归属关系:权限 文档
常用选项:
-m 设置权限
-x 删除指定用户权限
-b 删除所有用户权限
例如:
//给用户liudaheng设置一个拥有rx权限的ACL,文件名是hello//
setacl -m u:liudaheng:rx hello
//查看目录的ACL权限//
getfacl 目录名
用户测试权限就行啦
//删除liudaheng的ACL权限//
setfacl -x u:liudaheng hello
//删除所有用户的特殊权限//
setfacl -b hello
//用户liudaheng设置为没有任何权限//
setfacl -u:liudaheng:— hello

常用特殊符号的使用
Linux系统下通配符起到了很大的作用,对于不确定的文档名称可以使用以下特殊字符表示
*常用的特殊符号,在文件名上,用来代表任何多个任意字符
?常用的特殊符号,在文件名上,用来代表任意单个任意字符
[0-9] #在文件名上,用来代表多个字符或连续范围中的一个,若无则忽略
{a,b,cd,abcd} #在文件名上,用来代表多组不同的字符串,全匹配(大括号的功能全一些)
例如:
查看etc下以tab结尾的文件
[root@localhost /]# ls /etc/*tab
/etc/anacrontab /etc/crypttab /etc/inittab /etc/rwtab
/etc/crontab /etc/fstab /etc/mtab /etc/statetab
//查看etc下以pass什么d的目录//
[root@localhost /]# ls /etc/pass?d
/etc/passwd
//查看dev下//
[root@localhost /]# ls /dev/tty[1-5]
/dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4 /dev/tty5
[root@localhost /]# ls /dev/tty[3,4,6,7]
/dev/tty3 /dev/tty4 /dev/tty6 /dev/tty7
//查看dev下全匹配//
[root@localhost /]# ls /dev/tty{1,3,5,7,9}
/dev/tty1 /dev/tty3 /dev/tty5 /dev/tty7 /dev/tty9
//匹配1-10//
[root@localhost /]# ls /dev/tty{1…10}
/dev/tty1 /dev/tty2 /dev/tty4 /dev/tty6 /dev/tty8
/dev/tty10 /dev/tty3 /dev/tty5 /dev/tty7 /dev/tty9
[root@localhost /]# ls /dev/tty[1-9]
/dev/tty1 /dev/tty3 /dev/tty5 /dev/tty7 /dev/tty9
/dev/tty2 /dev/tty4 /dev/tty6 /dev/tty8

grep文件内容过滤
grep用于查找文件中符合条件的字符串,它能利用正则表达式搜索文件中的字符串,并把匹配到的字符串的行打印出来
用法:grep (-选项)“查找条件” 目标文件
常用选项:
-n 以行号的形式输出
-i 忽略字符串大小写
-v 显示不包含匹配的行(排除)
常用正则表达式符号:
^字符串 //显示以该字符串开头的行//
KaTeX parse error: Expected group after '^' at position 23: …/显示以该字符串结尾的行// ^̲ //显示空行//
//查找/etc下passwd文件的带root关键字的//
[root@localhost liudaheng]# grep root /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
roo❌1000:1000:root:/home/roo:/bin/bash
//查找/etc下passwd文件的带root关键字的,带行号//
[root@localhost liudaheng]# grep -n root /etc/passwd
1:root❌0:0:root:/root:/bin/bash
10:operator❌11:0:operator:/root:/sbin/nologin
38:roo❌1000:1000:root:/home/roo:/bin/bash
//排除#的内容//
[root@localhost /]# grep -v ‘#’ /etc/fstab

/dev/mapper/rhel-root / xfs defaults 1 1
UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
//显示以#开头的内容//
[root@localhost /]# grep ‘^#’ /etc/fstab

/etc/fstab

Created by anaconda on Fri Dec 10 16:03:20 2021

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

//将#开头的取反,再将空行取反,然后以行号的显示(用的管道)//
[root@localhost /]# grep -v ‘^#’ /etc/fstab | grep -v ^$ -n
2:/dev/mapper/rhel-root / xfs defaults 1 1
3:UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot xfs defaults 1 2
4:/dev/mapper/rhel-swap swap swap defaults 0 0

find文件/目录查找命令(这个命令很消耗服务器的cpu,避免高峰期使用)
find命令根据预设的条件递归查找文件或目录所在位置
用法:find 查找路径 查找条件1 查找条件2 …[-exec 处理命令 {} \ ;]
-exec 可接额外的命令来处理查找到结果
{} 代表find查找到的内容放置{}中
; 代表额外处理命令结束
常用查找条件:
-type 类型 (f文件 d目录 l链接文件)
-name “文件名”
-iname 按文件名查找忽略大小写
-size 文件大小 (k,M,G + 大于 - 小于)
-a 两个条件同时满足
-o 两个条件满足任意一个即可
-user 用户名
-mtime 按日期查找 (+代表多少天之前 ,-代表多少天之内,0代表24小时之内)
例如:
//查找类型为目录的在dev下//
[root@localhost /]# find /dev/ -type d
//查看根下的文件,有passwd//
[root@localhost /]# find / -name passwd
find: ‘/run/user/1000/gvfs’: 权限不够
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/passwd
/etc/pam.d/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
//选项组合使用//
[root@localhost ~]# find /etc/ -name passwd -type f
/etc/passwd
/etc/pam.d/passwd
//ls和find查找的区别//
查找/etc/目录下以.conf结尾的文件(只能在/etc这一层路去查找)
[root@localhost ~]# ls /etc/*conf
查找/etc/目录下以.conf结尾的文件(包含所有的子目录)
[root@localhost ~]# find /etc/ -name ‘*conf’ -type f
//查找大于1M的并且是文件的文件//
[root@localhost ~]# find /etc/ -size +1M -type f
/etc/udev/hwdb.bin
/etc/selinux/targeted/policy/policy.29
/etc/brltty/zh-tw.ctb
//查找文件大小为大于10M,并且小于20M的文件//
[root@localhost ~]# find /home -size +10M -a -size -20M -type f
可以查看一下大小,du -h 文件名
//查找两个要求满足其中一个即可//
[root@localhost ~]# find /home -size +10M -o -size -20M -type f
//查找用户的//
[root@localhost ~]# find /home -user liudaheng
//时间查找//
[root@localhost ~]# find /home -mtime +30
//输出的内容存放到指定地方(这里管道不能用)//
[root@localhost /]# find /var/log -mtime -30 -type f -exec cp {} /opt ;
{} 这个括号就代表打印的内容

压缩与解压缩(源文件消失)
Linux独有压缩格式及命令工具:
gzip–> .gz (速度快,压缩比例差,最常用的)
bzip2 --> .bz2 (速快慢一些,压缩比例中等)
xz–> .xz (速度最慢,压缩比例最好)
压缩命令格式:
gzip (-选项)文件名
常用选项:-d 解压缩
bzip2 (-选项)文件名
常用选项:-d 解压缩
xz (-选项)文件名
常用选项:
-d 解压缩
bzcat 压缩的文件名 //查看压缩文件//
压缩比例:gzip<bzip2<xz

tar打包工具(源文件不消失)
tar命令用在linux下用于对文件/目录打包,使用tar程序打出来的包常称为tar包, tar包文件通常都是以.tal结尾
tar命令格式: tar 选项 /路径/压缩包名字 被压缩文件
常用选项:
-c 创建打包文件
-f 指定打包后的文件名称 (这个选项必须在所有选项最后面)
-z 调用gzip压缩工具 -J 调用xz压缩工具 -j 调用bzip2压缩工具
-t 列出打包文档内容
-x 释放打包文件
-C 指定解压路径
-v 显示详细信息
例如:
//压缩文件//
[root@localhost /]# tar -czf hello.tar.zip /liudaheng/passwd /etc/passwd
//查看压缩的文件//
[root@localhost liudaheng]# tar -tf 111.tar.zip
passwd
//解压文件,解压到当前目录//
[root@localhost liudaheng]# tar -xf 111.tar.zip -C .

分区过程:
添加新硬盘–分区–格式化文件系统–挂载使用
扇区是磁盘存储数据的最小单元,默认一个扇区可以存储512字节的数据

硬盘类型介绍
IDE接口类型:主要用于个人家用计算机领域 (价格便宜,数据传输的速度慢)
SCSI接口类型:主要用于服务器理念关于,数据传输速度快,支持热插拔,主要应用在服务器领域
STAT接口类型:主要用于个人加用计算机领域
NVMe接口类型:固态硬盘接口
光纤通道接口:是一种用于高速存储设备以及存储网络的连接协议,在光纤通道网络上传输小型计算机系统接口命令的高速串行接口

Linux常用分区格式
MBR分区格式:比较古老的分区格式,分为,只能划分四个主分区,与扩展分区(容器)逻辑分区
最大支持2.2T以内磁盘容量
IDE接口硬盘逻辑分区最多可以划分59个
SCSI接口硬盘逻辑分区最多可以划分11个
GPT分区格式:可划分128个主分区,最大支持18EB磁盘容量(1EB=1024PB,1PB=1024TB,1TB=1024GB)

文件系统类型详解
文件管理系统,赋予分区文件系统分区才可以正常使用,根文件系统,多少个多少个文件系统
centos5:分区默认使用的文件系统是ext3
centos6:分区默认使用的文件系统是ext4
ext4:有日志记录的功能,如果系统意外的宕机了,通过日志记录把没有保存的数据,在系统再次重启时快速的恢复回来
ext4:单个文件系统最大支持1EB的分区容量,单个文件最大可以存储16TB的数据
centos7:分区默认使用的文件系统是xfs
xfs:开启了日志记录的功能,数据恢复的时候要比ext4的要快
xfs:单个文件系统最大支持8EB的分区容量,单个文件最大可以存储500TB的数据
xfs:单个文件每秒读写数据的速度可以达到4G
swap文件系统:交换分区,硬盘空间去充当内存去使用

分区挂载
在linux系统中用户是无法直接使用硬件设备的,硬件设备都是系统以只读的方式存在的,必须挂载
挂载就是给我们用户提供一个可以使用设备的一个接口
挂载的注意事项:
挂载点必须是一个目录,理论上来讲,还得是一个空目录
一个文件系统不允许重复挂载到多个目录下的
一个目录不允许重复挂载多个文件系统

lsblk查看系统所有磁盘信息
lsblk (英文全拼: list block) 用于列出当前系统所有磁盘与磁盘内的分区信息
用法:lsblk (-选项)(设备名)
常用选项:
-d //仅显示磁盘本身,不会列出磁盘的分区数据//
-f //列出磁盘分区使用的文件系统类型//
-l //使用列表格式显示//
lsblk命令示例:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part
├─rhel-root 253:0 0 17.5G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sr0 11:0 1 4G 0 rom /run/media/roo/RHEL-7.0 Server.x86_64
解释:
NAME #设各名称#
MAJ : MIN #主设备号:次设备号,内核通过主次设备号识别磁盘#
RM #是否为可卸载设备,1可卸载,0不可卸载#
SIZE #设备的容量大小#
RO #表示设备是否为只读,0非只读设备,1只读设备#
TYPE #表示设备类型(disk为磁盘,part为分区,lvm逻辑卷,rom只读)#
MOUNTPOINT #设备挂载点 ( SWAP没有挂载点)#
sda1:sd: SCSI 磁盘接口类型,sda:a代表第一块磁盘,1:代表第一个分区
sdb2:sd: SCSI 磁盘接口类型,sdb:b代表第一块磁盘,2:代表第二个分区
例如:
[root@localhost ~]# lsblk -d /dev/sda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk

df命令查看分区使用情况
df命令用于查看文件系统使用情况
用法:df (-选项)(参数)
常用选项:
-h 以人类易读方式显示文件系统容量
-T 显示文件系统类型
例如:
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 18348032 3120248 15227784 18% /
devtmpfs 926076 0 926076 0% /dev
tmpfs 935356 148 935208 1% /dev/shm
tmpfs 935356 17300 918056 2% /run
tmpfs 935356 0 935356 0% /sys/fs/cgroup
/dev/sda1 508588 121284 387304 24% /boot
/dev/sr0 4138442 4138442 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 18G 3.0G 15G 18% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 148K 914M 1% /dev/shm
tmpfs 914M 17M 897M 2% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
[root@localhost ~]# df -h /
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 18G 3.0G 15G 18% /
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 3.0G 15G 18% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 148K 914M 1% /dev/shm
tmpfs tmpfs 914M 17M 897M 2% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 119M 379M 24% /boot
/dev/sr0 iso9660 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64

du命令统计文件/目录大小
du命令用于统计磁盘下目录或文件大小
用法:du (-选项)(参数)
常用选项:
-h 以人类易读方式(KB,MB,GB)
-s 只统计每个参数的总数
例如:
[root@localhost ~]# du -h /liudaheng/
20K /liudaheng/

blkid查看设备属性
blkid命令显示块设备属性信息(设备名称,设备UUID,文件系统类型)
用法:blkid (-选项)(参数)
例如:
//查看所有的设备属性信息//
[root@localhost ~]# blkid
/dev/sda1: UUID=“e7023a32-d275-4a37-b26d-47808f21f871” TYPE=“xfs”
/dev/sda2: UUID=“CqIToj-MKY1-hPz7-hPst-GwPI-fUfv-fjTXyc” TYPE=“LVM2_member”
/dev/sr0: UUID=“2014-04-09-14-14-56-00” LABEL=“RHEL-7.0 Server.x86_64” TYPE=“iso9660” PTTYPE=“dos”
/dev/mapper/rhel-root: UUID=“9dd77a08-0006-4456-93b1-bb853c6609ae” TYPE=“xfs”
/dev/mapper/rhel-swap: UUID=“9aee733d-8ea0-44b9-8796-9538cf365ef2” TYPE=“swap”
//查看sda1设备属性信息//
[root@localhost ~]# blkid /dev/sda1
/dev/sda1: UUID=“e7023a32-d275-4a37-b26d-47808f21f871” TYPE=“xfs”

/dev/目录下的文件详解
hd[a-t]: IDE设备
sd[a-z]: SCSI设备
fd[o-7]:软盘驱动设备
md[0-32]:软RAID设备
loop[0-7]:本地回环设设备
lp[0-3]:打印机设备
mem:内存设备
null:空设备,也称为黑洞,任何写入的数据都将被丢弃
zero:零资源设备,任何写入的数据都将被丢弃
full:满设备,任何写入的数据都将失败
tty[0-63]:虚拟终端设备
random:随机数设备
urandom:随机数设备
port:存取I/O端口

MBR分区格式
fdisk命令用于查看磁盘使用情况和磁盘分区(MBR分区格式)
用法:fdisk (-选项)(设备路径)
常用选项:-l 列出磁盘分区表类型与分区信息
分区
[root@localhost ~]# fdisk /dev/sdb
m 获取命令帮助
p 显示磁盘分区表
n 新增加一个分区
q 不保存分区退出
d 删除一个分区
w 保存分区退出
a 设置可引导标记
b 编辑bsd磁盘标签
c 设置DOS操作系统兼容标记
l 显示已知的文件系统类型,82为swap交换系统,83为linux分区
o 建立空白DOS分区表
s 新建空白SUM磁盘标签
t 改变分区的系统ID
u 改变显示记录单位
v 验证分区表
x 附加功能
例如:
[root@localhost /]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xe9659bd7 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-20971519,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):+1G
分区 1 已设置为 Linux 类型,大小设为 1 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:10.7 GB, 10737418240 字节,20971520 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xe9659bd7

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux

//创建扩展分区//
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
分区号 (2-4,默认 2):2
起始 扇区 (2099200-20971519,默认为 2099200):
将使用默认值 2099200
Last 扇区, +扇区 or +size{K,M,G} (2099200-20971519,默认为 20971519):
将使用默认值 20971519
分区 2 已设置为 Extended 类型,大小设为 9 GiB

//删除分区//
命令(输入 m 获取帮助):d
分区号 (1,2,默认 2):2
分区 2 已删除

//保存//
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘

格式化文件系统
mkfs命令用于在分区上建立文件系统
常用文件系统类型:
ext4 ,xfs
命令格式:
mkfs.xfs 分区设备路径 //格式化为xfs类型文件//
mkfs.ext4 分区设备路径 //格式化为ext4类型文件//
例如:
[root@localhost /]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

mount挂载 (不是永久的)
mount文件系统挂载命令
用法:mount 设备路径 挂载点目录
常用选项:
-a 依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-o 该选项后边可跟挂载时额外参数
remount命令:重新挂载文件系统,在文件系统出错时或重新挂载文件系统时非常重要,
例如:
[root@localhost /]# mount /dev/sdb1 /guazaidian/

分区总步骤总结:
添加硬盘–查看系统是否识别新硬盘 lsblk
划分分区–fdisk 设备路径
格式化文件系统–mkfs.xfs
挂载–创建挂载点目录–挂载 mount 设备路径 挂载点目录
查看分区使用情况:df -hT

umount卸载文件系统
umount命令用于卸载文件系统
用法:umount 挂载点目录
例如:
[root@localhost /]# mount /dev/sdb1 /guazaidian/
[root@localhost /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 18G 3.0G 15G 18% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 148K 914M 1% /dev/shm
tmpfs 914M 9.0M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/sdb1 976M 2.6M 907M 1% /guazaidian
[root@localhost /]# umount /guazaidian/
[root@localhost /]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 18G 3.0G 15G 18% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 148K 914M 1% /dev/shm
tmpfs 914M 9.0M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64

永久挂载文件系统,开机自动挂载(直接去修改配置文件)
/etc/fstab用于存放文件系统信息,当系统启动时,系统会自动读取文件内容将指定的文件系统挂载到指定的目录
[root@localhost /]# vim /etc/fstab

/etc/fstab

Created by anaconda on Fri Dec 10 16:03:20 2021

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

/dev/mapper/rhel-root / xfs defaults 1 1
UUID=e7023a32-d275-4a37-b26d-47808f21f871 /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/sdb1 /guazaidian ext4 defaults 0 0
#解释:该文件内容为6个字段,每个字段详解如下
第一个字段:要挂载的设备路径
第二个字段:挂载点目录
第三个字段:设备文件系统类型
第四个字段:挂载参数,参数如下l
sync,async:此文件系统是否使用同步写入(sync)或异步(async)的内存机制,默认为异步(async)
atime,noatime:更新访问时间/不更新访问时间,访问分区时,是否更新文件的访问时间,默认为更新
ro,rw:挂载文件为只读(ro)或读写(rw),默认为rw
auto,noauto:自动挂载/手动挂载,执行mount -a时,是否自动挂载/etc/fstab文件内容,默认为自动(auto)
dev,nodev:是否允许此文件系统上,可建立装置文件,默认为允许(dev)
suid,nosuid:是否允许文件系统上含有sUID与SGID特殊权限,默认为允许(SUID)
exec,noexec:是否允许文件系统上拥有可执行文件,默认为允许(exec)
user,nouser:是否允许普通用户执行挂载操作,默认为不允许(nouser) ,只有root用户可以挂载分区
defaults默认值:代表async,rw, auto,dev,suid,exec,nouser七个选项
第五个字段:是否对文件系统进行备份,0不备份,1为备份
第六个字段:是否检查文件系统顺序,允许的数字是0,1,2,0表示不检查,1的优先权最高
完成后需要重新重启配置文件才生效,不想重启看下面的命令:
mount 常用选项:
-a 依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-o 该选项后边可跟挂载时额外参数
remount命令:重新挂载文件系统,在文件系统出错时或重新挂载文件系统时非常重要,
挂载完了,使用mount -a 就不需要重启了

GPT分区格式
gdisk命令用于查看磁盘使用情况和磁盘分区(GPT分区格式)
用法:gdisk (-选项) (设备路径)
常用选项:-l 列出磁盘分区表类型与分区信息
例如:
[root@localhost /]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present


Found invalid GPT and valid MBR; converting MBR to GPT format.
THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing ‘q’ if
you don’t want to convert your MBR partitions to GPT format!


Command (? for help): ?
b back up GPT data to a file
c change a partition’s name
d delete a partition //删除一个分区//
i show detailed information on a partition
l list known partition types
n add a new partition //新增加一个分区//
o create a new empty GUID partition table (GPT)
p print the partition table //常用的,显示磁盘分区表//
q quit without saving changes //不保存分区退出//
r recovery and transformation options (experts only)
s sort partitions
t change a partition’s type code
v verify disk
w write table to disk and exit //保存分区退出//
x extra functionality (experts only)
? print this menu
//增加分区,可以看到能添加128块分区,这个分区还是非常强大的//
Command (? for help): n
Partition number (2-128, default 2):
//整体来看一下//
Command (? for help): n (创建分区)
Partition number (1-128, default 1): (这里选择分区号,回车即可)
First sector (34-20971486, default = 2048) or {±}size{KMGTP}: (输入起始扇区,默认2048开始)
Last sector (2048-20971486, default = 20971486) or {±}size{KMGTP}: +1G (#输入新增分区的大小,可以通过扇区数来增加,也可以通过+size{KMGTP}方式来增加)
Current type is ‘Linux filesystem’
Hex code or GUID (L to show codes, Enter = 8300): (这里要求输入分区的类型,直接回车就行)
Changed type of partition to ‘Linux filesystem’

Command (? for help): p (显示分区)
Disk /dev/sdb: 20971520 sectors, 10.0 GiB (磁盘总容量)
Logical sector size: 512 bytes
Disk identifier (GUID): AE3CC833-A089-43C9-9C07-412211F8BFBC
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 18874301 sectors (9.0 GiB) (磁盘的剩余容量)

Number Start (sector) End (sector) Size Code Name
1 2048 2099199 1024.0 MiB 8300 Linux filesystem
Command (? for help): w (保存退出,不想保存输入q退出)

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y (这里选择yes即可,允许继续的意思)
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully. (写入成功)
//格式化文件系统//
mkfs.xfs /dev/sdb1
//查看文件系统类型//
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID=“58c8eb49-9d66-4d05-b701-f78a0b432991” TYPE=“ext4” PARTLABEL=“Linux filesystem” PARTUUID=“10ccb34c-d2d7-4529-a74c-14eab9b4f55d”
//创建挂载的文件,并挂载//
[root@localhost ~]# mkdir /web
[root@localhost ~]# mount /dev/sdb1 /web
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 3.0G 15G 18% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 148K 914M 1% /dev/shm
tmpfs tmpfs 914M 9.0M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 xfs 497M 119M 379M 24% /boot
/dev/sr0 iso9660 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/sdb1 xfs 976M 2.6M 907M 1% /web
//永久挂载呢,就直接去修改配置文件//
[root@localhost ~]# vim /etc/fstab

LVM逻辑卷(缺点是数据损坏不容易恢复)
逻辑卷:IVM (Logical Volume Manager)逻辑卷管理系统
逻辑卷可以实现将底层的物理分区整合成一个大的虚拟硬盘
逻辑卷的技术是通过linux系统内核dm(device mapper)设备映射组件
创建逻辑卷命令:
功能 物理卷管理 卷组管理 逻辑卷管理
scan 扫描 pvscan vgscan lvscan
create 创建 pvcreate vgcreate lvcreate
display 显示 pvdisplay vgremove lvdisplay
remove 删除 pvremove vgextend lvremove
extend 扩展 lvextend
!注意:物理卷:centos6的时候创建需要创建物理卷,centos7不需要了
例如:
[root@localhost ~]# vgcreate liudahengdejuan /dev/sdb1 /dev/sdb2 /dev/sdb3
[root@localhost ~]# vgdisplay liudahengdejuan
— Volume group —
VG Name liudahengdejuan //卷的名字//
System ID
Format lvm2 //卷的格式//
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 2.99 GiB //卷的大小//
PE Size 4.00 MiB
Total PE 765
Alloc PE / Size 0 / 0
Free PE / Size 765 / 2.99 GiB
VG UUID kz1G51-8dzB-d6q7-0QwE-jtv5-TixH-2Q70aZ //卷的UUID,系统识别的一个编号//
//简要的显示卷组的信息查看//
[root@localhost ~]# vgs liudahengdejuan
VG #PV #LV #SN Attr VSize VFree
liudahengdejuan 3 0 0 wz–n- 2.99g 2.99g
//创建lv逻辑卷//
[root@localhost ~]# lvcreate -L 1G -n liudahengdelv liudahengdejuan
Logical volume “liudahengdelv” created
-L:指定大小
-n:lv逻辑卷的名字
查看一下:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
liudahengdelv liudahengdejuan -wi-a----- 1.00g
root rhel -wi-ao---- 17.51g
swap rhel -wi-ao---- 2.00g
也可以这么查看:
[root@localhost ~]# lvs /dev/liudahengdejuan/liudahengdelv
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
liudahengdelv liudahengdejuan -wi-a----- 1.00g
//然后再格式化//
[root@localhost ~]# mkfs.xfs /dev/liudahengdejuan/liudahengdelv
//查看系统文件类型//
[root@localhost ~]# blkid /dev/liudahengdejuan/liudahengdelv
/dev/liudahengdejuan/liudahengdelv: UUID=“86717dc5-0e68-4e02-9e7e-7716e5b5d381” TYPE=“xfs”
//创建挂载点,挂载,使用//
[root@localhost ~]# mkdir /liudaheng
[root@localhost ~]# mount /dev/liudahengdejuan/liudahengdelv /liudaheng
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 3.0G 15G 18% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 92K 914M 1% /dev/shm
tmpfs tmpfs 914M 9.0M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/mapper/liudahengdejuan-liudahengdelv xfs 1014M 33M 982M 4% /liudaheng
//扩容lv逻辑卷,支持线上扩容,就是使用的时候可以直接扩容//
[root@localhost ~]# lvextend -L +100MB /dev/liudahengdejuan/liudahengdelv
Extending logical volume liudahengdelv to 1.10 GiB
Logical volume liudahengdelv successfully resized
//查看扩容的情况//
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
liudahengdelv liudahengdejuan -wi-ao---- 1.10g
root rhel -wi-ao---- 17.51g
swap rhel -wi-ao---- 2.00g
//扩容了还要扩展文件系统,要不然无法使用//
当逻辑卷扩大以后,也需要多逻辑卷的文件系统进行扩展
刷新文件系统容量:
xfs_growfs //用于刷新XFS设备//
resize2fs //用于刷新EXT3,EXT4设备//
–命令格式:xfs_growfs 挂载点目录
[root@localhost ~]# xfs_growfs /dev/liudahengdejuan/liudahengdelv
meta-data=/dev/mapper/liudahengdejuan-liudahengdelv isize=256 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 287744

扩展文件系统
当逻辑卷扩大以后,也需要多逻辑卷的文件系统进行扩展
刷新文件系统容量:
xfs_growfs //用于刷新XFS设备//
resize2fs //用于刷新EXT3,EXT4设备//
–命令格式:xfs_growfs 挂载点目录
[root@localhost ~]# xfs_growfs /liudaheng
meta-data=/dev/mapper/liudahengdejuan-liudahengdelv isize=256 agcount=5, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=287744, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
//再查看一下//
[root@localhost ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 3.0G 15G 18% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 92K 914M 1% /dev/shm
tmpfs tmpfs 914M 9.0M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.0G 4.0G 0 100% /run/media/roo/RHEL-7.0 Server.x86_64
/dev/mapper/liudahengdejuan-liudahengdelv xfs 1.1G 33M 1.1G 3% /liudaheng //这里就显示成1.1G了,原来是1G//

//扩容卷组//
vgextend 组名 /dev/磁盘

删除逻辑卷
逻辑卷的删除不允许联机操作,需要先卸载,在执行删除
在执行删除操作时,首先删除LV逻辑卷,再删除VG卷组,最后删除PV物理卷
删除命令:lvremove 逻辑卷路径
步骤:
1:umount 卸载挂载
2:lvremove 逻辑卷路径
删除卷组:
1:vgremove 卷组名字

逻辑卷的缩减
命令:lvreduce
不允许联机缩减
先缩减文件系统的空间,然后再缩减逻辑卷的空间

RAID磁盘阵列
RAID中文全称:独立磁盘冗余阵列,简称磁盘阵列
RAID可通过技术(软件/硬件)将多个独立的磁盘整合成一个巨大容量大逻辑磁盘使用
RAID可以提高数据I/O(读写)速度,和冗余数据的功能

RAID级别
RAIDO:等量存储,至少由2块磁盘组成,同一个文档等量存放在不同的磁盘并行写入数据来提高效率,但只是单纯的提高效率,并没有冗余功能,如果其中一块盘故障,数据会丢失,不适合存放重要数据
RAID1:完整备份,至少由两块磁组成,同一个文档复制成多份存储到不同磁盘提高可靠性,读写速度没有提升,适合存储重要的数据(以磁盘容量最小的为准,就是100G的磁盘和200G的磁盘,实际上还是100G)
RAID2:至少由3块磁盘组成,数据分散存储在不同磁盘,在读写数据时需要对数据时时校验,由于采用的校验算法复杂,数据量比原有数据增大,而且导致硬件开销较大
RAID3:至少由三块磁盘组成,同一份文档分散写入不同的磁盘,校验数据单独存放在另外一块磁盘,由于每次读写操作都会访问校验盘,容易导致校验盘长时间高负荷工作而挂掉,如果校验盘损坏数据将无法恢复
RAID4:与RAID3类似,至少由3块磁盘组成,同一份文档分散存写入不同磁盘,校验数据单独存放在另外一块磁盘,由于每次读写操作都会访问校验盘,容易导致校验盘长时间高负荷工作而挂掉,如果校验盘损坏数据将无法恢复,与RAID3的区别是数据分割方式不一样
RAID5:至少由3块磁盘组成,同一份文档分散写入不同磁盘,每个硬盘都有校验数据,其中校验数据会占用磁盘三分之一的空间,三分之二的空间存放原始数据,允许同时坏一块磁盘当一块磁盘损坏,其他磁盘里的数据配合校验信息可将数据恢复回来
磁盘空间最好一致,因为他们会以最小的磁盘空间来作为准空间,比如2T,4T,4T的磁盘,那这么使用的话就成了2T,2T,2T
RAID6:至少由4块磁盘组成,同一份文档分散写入不同磁盘,每个磁盘都有校验数据,由于采用双校验算法,所以校验数据量是RAID5的两倍,需要占用2块磁盘空间存放校验数据,两块盘存放原始数据,由于数据校验的算法计算量偏大,所以在速写速度上没有RAID5快,允许同时坏2块磁盘
RAID7︰美国SCC公司专利 ,花钱
RAID10:RAID10=RAID1+RAIDO合二为一,最少需要4块磁盘,先将4块硬盘组成两组RAID1,在将两组RAID1组成一个RAIDO,既提高数据读写速度,又能保障数据安全性,缺点是可用容量是总容量的一半

实现RAID方式
实现RAID通常有三种方式,通过软件技术实现RAID功能(软RAID)
RAID功能外接式磁盘阵列柜,被常用在大型服务器上,不过这类产品价格昂贵
RAID磁盘阵列卡,分为服务器自带和额外安装,硬RAID比软RAID更安全稳定,RAID卡带有缓存功可实现数据自动恢复,RAID卡带有电池

进程管理
什么是程序:用计算机语言编写的命令序列集合,用来实现特定的目标或者解决特定的问题,程序占用的是磁盘的空间,程序是静态的并且是永久的
什么是进程:正在运行中的程序叫做进程,进程有自己的独立内存空间,每启动一个进程,系统就会为它分配
空间并分配一个PID号,每个进程都会对应一个父进程,而父进程可以复制多个子进程,每种进程都有两种
方式存在,前台与后台,一般进程都是以后台的方式运行,内存占用的是内存空间,进程是动态的,进程是有生命周期的
什么是线程:线程也被称为轻量级进程,被包含在进程中,是进程的一个子集,是进程中的实际运作单位,
一个进程中可以并发多个线程,每条线程并行执行不同的任务,每个线程都是独立的,
线程之间共享进程的内存空间,在多线程的程序中,由于线程很“轻",
故线程的切换非常迅速且开销小(在同一进程中)

pstree命令查看进程树
pstree以树状结构显示进程信息,包括进程之间的关系
常用格式:pstree (-选项) (参数)
常用选项:
-p 显示进程PID
-a 显示完整的命令行
-u 列出每个进程所属账号名称
//显示进程信息//
[root@localhost ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
centos7版本:天父进程是systemd ,就是根
centos6版本:天父进程是init , Apstart
centos5版本:天父进程init
//以PID的形式显示进程信息//
[root@localhost ~]# pstree -p
//组合使用//
[root@localhost ~]# pstree -pu
//查看指定用户的进程//
[root@localhost ~]# pstree -pu liudaheng

ps aux:unix格式静态查看系统进程,查看系统所有进程信息
常用选项:(没有横杠是因为是unix系统)
a 显示当前终端所有进程
u 以用户格式输出
x 当前用户在所在终端下的进程
ps -ef :linux格式静态查看系统进程,查看系统所有进程信息
-e 显示系统所有进程
-l 以长格式输出信息
-f 显示最完整的进程信息
//显示系统进程//
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
字段介绍:
USER 进程属于哪个用户
PID 进程PID号
%cpu 进程占用cpu资源百分比
%MEM 进程占用物理内存百分比
VSZ 进程使用掉的虚拟内存量(单位:kb)
RSS 进程占用固定内存量 (单位:kb)
TTY 进程在哪个终端运行,如果内核直接调用则显示”?“,tty1-tty6表示本机终端登录的用户进程,pts/0-255则表示远程终端登录用户的进程
STAT:进程状态:R (运行),S (休眠), s 包含子进程, T (停止), Z (僵尸) , + (后台进程)
START:进程启动时间
TIME:占用cpu运算时间
COMMAND:产生进程的命令
//查看系统所有进程用ps -ef//
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
PPID:该进程的父进程的ID号

top查看系统健康状态
top命令动态来查看系统运行性能及状态信息
命令格式:top (-选项)
常用选项 :-d 指定刷新秒数,默认为3秒刷新一次
交互界面显示指令:
键盘上下键翻行
h 获取交互模式帮助
P(大写) 按照CPU使用资源排序
M 按照内存使用资源排序
q 退出
//显示系统,3秒更新//
[root@localhost ~]# top -d 3
top - 22:10:37 up 10 days, 4:19, 4 users, load average: 0.03, 0.05, 0.05
Tasks: 504 total, 1 running, 503 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.7 us, 6.7 sy, 0.0 ni, 86.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1870716 total, 1394608 used, 476108 free, 1128 buffers
KiB Swap: 2097148 total, 0 used, 2097148 free. 365216 cached Mem
#第一行top每个字段含义#
22:10:37:当前系统时间
up 10 days 4:19 :系统运行时间,运行了10天4小时19分钟了
4 users:当前系统登录用户数量
load average: 0.03, 0.05, 0.05:cpu1分钟,5分钟,15分钟之前平均负载量,根据cpu核数判断系统cpu负载量,1核cpu若高于1代表负载过高,2核cpu若高于2代表负载过高,以此类推。。
#第二行Tasks每个字段含义如下#
504 total:当前系统中进程的总数量
1 running:正在运行的进程数量
503 sleeping:正在睡眠的进程数量
0 stopped:正在停止的进程数量
0 zombie:僵尸进程数量,僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。

//查找僵尸进程与父进程//
ps -A -o stat,ppid,pid,cmd | grep “^Zz”
命令解释:
-A 参数列出所有进程
-o 自定义输出字段,我们设定显示字段为 stat (状态),ppid(父进程id),pid (进程id),cmd (命令)这四个参数,因为状态为Z或者z的进程
为僵尸进程,所以我们使用grep和stat状态为zZ进程
//杀死进程//
kill -9 +父进程号
//第三行%cpu(s)每个字段含义如下://
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
o.o us:用户占用的CPU百分比
o.o sy:系统占用的CPU百分比
0.0 ni:改变过优先级的用户进程占用的CPU百分比
99.8 id:空闲的CPU百分比(重点关注,大了就空闲,如果小那就比较忙了,比如10,表示非常忙)
0.0 wa:等待输入/输出的进程的占用CPU百分比
0.0 hi:硬中断请求服务占用的CPU百分比
0.0 si:软中断请求服务占用的CPU百分比
0.0 st:虚拟时间百分比,当有虚拟机时,虚拟cpu等待实际cpu的时间百分比
//第四行的字段含义//
KiB Mem: 1870716 total, 945040 used, 925676 free, 928 buffers
total:物理内存总量,单位KB
free : 空闲内存总量,单位KB
used : 已使用的内存总量,单位KB
buffers : 块设备与普通文件占用的缓存数量
//第五行的字段含义//
KiB Swap: 2097148 total, 0 used, 2097148 free. 342576 cached Mem
total:交换空间总量,单位KB
free :空闲交换空间总量,单位KB
used :已经使用的交换空间总量,单位KB
Mem:可用于进程下一次分配的物理内存数量
//第六行每个字段含义如下//
PID : 进程PID号
USER :进程所有者的用户名
PR : 进程优先级执行顺序,越小越优先被执行
NI :负值表示高优先级,正值表示低优先级,越小越优先被执行(比如0是最大的)
VIPT :进程使用的虚拟内存总量,单位kb
RES : 进程使用的,未被换出的物理内存大小,单位kb
SHR : 共享内存大小,单位kb
S:进程状态。D=不可中端的睡眠状态,R=运行 ,S=睡眠,T=跟踪/停止,Z=僵尸进程
%CPU:进程使用的CPU百分比
%MEM:进程使用的物理内存百分比
TIME+ : 进程使用的CPU时间总计,单位1/100秒
COMMAND:命令名/命令行

检索进程
pgrep 通过匹配其程序名,找到匹配的进程
命令格式:pgrep (-选项) (参数)
常用选项:
-l 输出进程名与PID
-U 检索指定用户进程
-t 检索指定终端进程
-x 精确匹配完整进程名
//过滤sshd进程//
[root@localhost ~]# pgrep sshd
1620
3923
[root@localhost ~]# pgrep -l sshd
1620 sshd
3923 sshd
这里是加l的区别,就是显示名字
//检索liudaheng用户的进程//
[root@localhost ~]# pgrep -lU liudaheng
4525 sshd
4527 bash
//查看终端所有终端用户//
[root@localhost ~]# who
roo :0 2022-02-02 15:05 (:0)
roo pts/0 2022-02-02 15:05 (:0)
root pts/1 2022-02-02 15:06 (192.168.59.1)
liudaheng pts/2 2022-02-02 15:45 (192.168.59.1)
//检索用户的指定终端的进程//
[root@localhost ~]# pgrep -lU liudaheng -t pts/2
4527 bash
//精确匹配//
[root@localhost ~]# pgrep -x ssh

进程的前后台调度(jobs,bg,fg)
& 将进程放入后台运行
jobs -l 查看后台进程列表
fg 进程编号 将后台进程恢复至前台运行
ctrl+z 组合键 挂起当前进程并放入后台
bg 进程编号 激活后台被挂起进程
//将命令放入后台运行//
[root@localhost ~]# sleep 10 &
[1] 4779
//查看所有后台运行//
[root@localhost ~]# jobs -l
[1]+ 4779 运行中 sleep 10 &
//恢复到前台//
[root@localhost ~]# fg 1
-bash: fg: 任务已经终止
[1]+ 完成 sleep 10

杀死进程kill命令(系统的进程尽量不要动)
杀死进程的方式
ctrl +c 组合键结束当前命令程序
kill (-选项) PID
常用选项:
-l #列出可用进程信号#
常用信号:
-1 #重启进程#
-9 #强制杀死进程#
-15 #正常杀死进程(默认信号无需指定)#
killall -9 进程号 #强制杀死进程#
killall -9 -u 用户名 #强制杀死该用户所有用户#
pkill -9 进程名 #强制杀死进程#(who查看终端号,配合-t选项使用)
常用选项:-t 终端号 #踢出终端用户#
//将liudaheng用户提出进程//
[root@localhost ~]# killall -9 -u liudaheng
//杀死终端// (who查看终端)
[root@localhost ~]# pkill -9 -t pts/2

用户登录分析
users 和 who 和 w#查看已登录的用户信息#(详细度不同)
last #显示登录成功的用户信息#
lastb #显示登录失败的用户信息#
//以下是各个命令的详细程度//
[root@localhost /]# users
roo roo root
[root@localhost /]# who
roo :0 2022-02-04 11:39 (:0)
roo pts/0 2022-02-04 11:39 (:0)
root pts/1 2022-02-04 11:39 (192.168.59.1)
第一列:已经登录系统的用户名
第二列:用户登录的终端编号
第三列:登录时间
第四列:远程登录地址
[root@localhost /]# w
11:56:28 up 41 min, 3 users, load average: 0.00, 0.01, 0.05
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
roo :0 11:39 ?xdm? 1:26 0.13s gdm-session-worker [pam/gdm-password]
roo pts/0 11:39 17:00 0.06s 0.06s /bin/bash
root pts/1 11:39 4.00s 0.10s 0.00s w
第一行:为top命令显示的第一行数据
第二行:
USER:已经登录的用户名
TTY:用户登录的终端编号
FROM:登录地址
LOGIN@:登录时间
IDLE:用户空闲时间,这是个计数器,一旦用户执行任何操作,该计时器便会被重置
JCPU:该终端所有进程占用CPU处理时间,包括正在运行和后台作业占用时间
PCPU:进程执行以后消耗的CPU时间
WHAT:当前正在执行的任务
//last命令注释,显示登录成功的用户//
[root@localhost /]# last
liudahen pts/2 192.168.59.1 Fri Feb 4 12:05 still logged in
root pts/1 192.168.59.1 Fri Feb 4 11:39 still logged in
roo pts/0 :0 Fri Feb 4 11:39 still logged in
roo :0 :0 Fri Feb 4 11:39 still logged in
(unknown :0 :0 Fri Feb 4 11:14 - 11:39 (00:24)
reboot system boot 3.10.0-121.el7.x Fri Feb 4 11:14 - 12:05 (00:50)
liudahen pts/2 192.168.59.1 Wed Feb 2 16:34 - crash (1+18:40)
第一列:用户名
第二列:用户登录终端编号
第三列:登录地址
第四列:登录起始时间
第五列:登录结束时间
第六列:登录持续时间
//查看最近两次登录系统的用户//
[root@localhost /]# last -2
liudahen pts/2 192.168.59.1 Fri Feb 4 12:05 still logged in
root pts/1 192.168.59.1 Fri Feb 4 11:39 still logged in

wtmp begins Sat Dec 11 00:19:31 2021
//查看登录失败的用户//
[root@localhost /]# lastb
liudahen ssh:notty 192.168.59.1 Fri Feb 4 12:10 - 12:10 (00:00)
liudahen ssh:notty 192.168.59.1 Fri Feb 4 12:10 - 12:10 (00:00)

btmp begins Fri Feb 4 12:10:07 2022

Linux软件包的分类
源码包
二进制包(RPM包)
源码包特点:
源码包的缺点:安装过程麻烦,需要用户手动编译,需要手动解决软件包的依赖关系
源码包的优点:软件源代码开放,允许用户二次开发,安装灵活,可以自定义安装路径与安装功能,卸载方便
RPM包特点:
RPM包缺点:所有功能用户无法自定义,安装没有源码包灵活,不可以看到软件源代码
RPM包优点:由于已经提前被编译过,所以安装简单,安装速度快
RPM包命名规则,如: vsftpd-3.0.2-25.el7.x86_64.rpm
vsftpd #软件包名称#
3.0.2 #软件包版本,主版本.次版本.修改版本#
25 #补丁次数#
el7 #适合的系统(el7表示RHEL7)#
x86_64 #适合的CPU架构#
rpm #rpm包扩展名#

RPM管理软件包(古老的安装方式,现在最大的作用是查询和卸载,一般很少使用这个安装软件了)
RPM命令管理软件包需要手动解决软件之间依赖关系,这里有时一些软件包很麻烦
树形依赖:a—b–c–d
环形依赖:a–b–c—a
模块依赖:需要模块支持,模块查询地址:www.rpmfind.net (有些软件包需要支持模块依赖,进入官网查看一下,然后知道软件包名字回系统里再安装即可)
命令用法:rpm 选项… 软件包全名
常用选项:
-q 仅查询软件是否安装
-qa 列出所有已经安装在系统的所有软件,可配合grep过滤指定的软件包
-qi 列出软件包详细信息,包含版本与官网地址
-qf 后边接文件名,查询配置文件由哪个软件包产生
-ql 列出与该软件包相关所有文件与目录的存放位置
-ivh i安装,v显示详细信息,h显示软件安装进度
-Uvh 升级安装软件包
-e 卸载软件包
–import 导入红帽签名(解决提示警告的,用处不大)

//挂载镜像文件,永久挂载就进入配置文件修改//
[root@localhost /]# mkdir ruanjinbao
[root@localhost /]# mount /dev/cdrom /ruanjinbao
mount: /dev/sr0 写保护,将以只读方式挂载
//修改为永久挂载//
[root@localhost /]# vim /etc/fstab
/dev/cdrom /ruanjianbao iso9660 defaults 0 0
[root@localhost /]# mount -a
//查询软件包安装没有//
[root@localhost ruanjinbao]# rpm -q vsftpd
未安装软件包 vstap
//安装vsftpd//
[root@localhost ruanjinbao]# rpm -i Packages/vsftpd-3.0.2-9.el7.x86_64.rpm
警告:Packages/vsftpd-3.0.2-9.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
安装成功
[root@localhost ruanjinbao]# rpm -q vsftpd
vsftpd-3.0.2-9.el7.x86_64
//过滤查询//
[root@localhost /]# rpm -qa | grep vsftpd
vsftpd-3.0.2-9.el7.x86_64
//查看qi//
[root@localhost /]# rpm -qi vsftpd
Name : vsftpd #软件包名#
Version : 3.0.2 #版本#
Release : 9.el7 #最终稳定版本#
Architecture: x86_64 #适合安装的cpu架构#
Install Date: 2022年02月04日 星期五 13时02分33秒 #安装时间#
Group : System Environment/Daemons #属于哪个群组#
Size : 351462 #软件包大小#
License : GPLv2 with exceptions
Signature : RSA/SHA256, 2014年04月03日 星期四 05时54分58秒, Key ID 199e2f91fd431d51
Source RPM : vsftpd-3.0.2-9.el7.src.rpm
Build Date : 2014年03月07日 星期五 17时58分22秒
Build Host : x86-025.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc. http://bugzilla.redhat.com/bugzilla
Vendor : Red Hat, Inc.
URL : https://security.appspot.com/vsftpd.html #软件包官网#
Summary : Very Secure Ftp Daemon
Description : #描述信息#
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.
//查看文件是由哪个软件包产生的//
[root@localhost /]# rpm -qf /usr/bin/ls
coreutils-8.22-11.el7.x86_64
//查看ql//
[root@localhost /]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf (主配置文件)
//安装软件包,体验感好一点,不影响体验感//
[root@localhost /]# rpm -ivh vsftpd
错误:打开 vsftpd 失败: 没有那个文件或目录
[root@localhost /]# rpm -ivh /ruanjinbao/Packages/vsftpd-3.0.2-9.el7.x86_64.rpm
警告:/ruanjinbao/Packages/vsftpd-3.0.2-9.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
准备中… ################################# [100%]
正在升级/安装…
1:vsftpd-3.0.2-9.el7 ################################# [100%]
PRM安装有些软件包依赖特别多

yum软件包管理(红帽8与红帽7不一样的配置,这里是红帽7的配置)
yum(软件仓库):提供众多软件包的仓库,并自动解决软件包之间复杂依赖关系
yum常用命令:
yum repolist #列出仓库可用的软件包#
yum list 软件包名 #查看系统中提供的软件包(包含未安装的软件包)#
yum list updates #查看系统中可供本机升级的软件包#
yum install 软件包名 #安装软件包,-y 自动回答yes#
yum update 软件包名 #升级软件包版本# (光打yum update会升级所有的,谨慎使用,最好不要这么用)
yum remove 软件包名 #卸载软件包# (最好别用)
yum clean all #清除仓库缓存#
yum provides 文件名(命令) # 查看文件由哪个软件包产生(主要用于查看程序文件)#
//编写本地yum仓库//
[root@localhost /]# vim /etc/yum.repos.d/local.repo
[liudaheng] //仓库名称,名字自定义,但具有唯一性//
name=liudahengdeyum //仓库描述,(类似于仓库解释),描述信息自定义,不具有唯一性//
baseurl=file:///mnt/liudahengdeyum //指定软件仓库地址,file:///用于本地软件包存放位置//
enable=1 //软件仓库是否启动,1启动,0不启动 //
gpgcheck=0 //是否检测软件包签名,0不检测,1检测(签名是表示这是官方的软件包,没大有必要)//
//检测仓库可用性//
[root@localhost /]# yum repolist
//所有步骤//
mkdir /mnt/liudahengdeyum
mount -t iso9660 /dev/sr0 /mnt/liudahengdeyum 挂载镜像
cd /etc/yum.repos.d 切换到yum文件位置
vim 名称.repo 建立一个repo为后缀的文件

编辑内容如下 完成后保存退出
[liu]
name=liu
baseurl=file:///mnt/liu
enable=1
gpgcheck=0

yum list 查看yum源是否配置完成

yum install httpd* #安装http服务#
systemctl start httpd #开启http服务#
systemctl enable httpd #将模式设计为开机自启#
systemctl status https #查看http状态#
//注意//
Is this ok [y/d/N]: y //y:确定安装,d:只下载不安装,N:不安装//
//查询安装包//
[root@localhost /]# rpm -q httpd
httpd-2.4.6-17.el7.x86_64
//自动回答yes//
[root@localhost /]# yum -y install httpd
//卸掉挂载点后,软件包不能用了,就得用清理yum源缓存的命令了//
[root@localhost /]# yum clean all
网络yum源配置:
https://developer.aliyun.com/mirror/ 阿里云官方镜像站
[liu]
name=liu
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ //这里用的是清华大学的镜像站//
enable=1
gpgcheck=0
//配置阿里云的yum源//
配置阿里Base源(基于软件仓库,解决rpm软件的依赖关系)
wget -o /etc/yum.repos.d/centos-Base.repo
配置阿里epel源(额外软件仓库,包含许多基本软件没有的软件包)
wget -o /etc/yum.repos.d/epe1.repo
vim /etc/yum.repos.d/centos-Base.repo
//生成yum仓库缓存,可以提高软件包的下载速度,但是消耗一定的内存//
yum makecache
!注意:当配置了本地源和网络源,默认优先下载网络源的软件包,这样一些软件包不如本地源下载的快,解决方法如下,配置yum源优先级

配置yum源优先级
[liu]
name=liu
baseurl=file:///mnt/liu
enable=1
gpgcheck=0
priority=1 //优先级为1-99之间,数字越小越优先//

源码包安装方式
//从官网下载源码包//
http: //nginx. org/
//安装源码包依赖包//
yum -y install gcc pcre-deve1 openss7-deve1 z1ib
//解压源码包并进入源码包路径//
tar -xf nginx-1.20.0.tar.gz
cd nginx-1.20.0/
ls
//使用configure程序检查环境并指定安装参数//
./configure --with-http_ss1_module --with-file-aio --with-http_realip_module
//make将源码包转换成二进制//
make
//make install安装源码包//
make install
cd /usr/local/nginx/
ls
conf html logs sbin

源码包的管理方式
//启动nginx服务//
sbin/nginx
//netstat 和 ss 命令用于查看系统中启动的端口信息//
-a 显示所有端口信息
-n 以数字格式显示端口号
-t 显示TCP连接的端口
-u 显示UDP连接的端口
-l 显示服务正在监听的端口信息
-p 显示监听端口的服务名称是什么 (也就是程序名)
例如:ss -anptul | grep nginx (配合管道使用)
//查看nginx服务端口信息//
ss -anptul | grep nginx
tcp LISTEN 0 128 *:80 //Nginx服务默认通过TCP 80 端口监听客户端请求
//查看系统所有服务查看的端口信息//
LISTEN 0 128 *:22 : users:((“sshd”,1620,3))

systemd管理服务(管理rpm包,不能管理源码包)
systemd是内核加载的第一个进程(PID=1),systemd负责整个Linux系统的运行与服务控制,systemd为用户提供systemctl命令来管理RPM包安装的服务,如:启动服务、重启服务、关闭服务、查看服务状态,服务随机自启
服务的启动有两个阶段,一是系统开机时随着系统的启动而启动(随机自启),二是系统启动以后用户手动将服务启动
常用命令:
systemctl start 程序名 #启动服务#
systemctl restart 程序名 #重启服务#
systemctl stop 程序名 #停止服务#
systemctl enable 程序名 #设置服务随机自启(前提是服务在启动中)#
systemctl disable 程序名 #设置服务不随机自启,也就是取消随机自启#
svstemctl status 程序名 #杳看服务状态#
systemctl is-enabled 程序名 #查看服务是否被设置随机自启#
[root@localhost /]# yum -y install vsftpd
[root@localhost /]# rpm -ql vsftpd
[root@localhost /]# systemctl start vsftpd //开启服务//
[root@localhost /]# systemctl status vsftpd //查看服务,主要是看(running)//
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
Active: active (running) since 六 2022-02-05 14:14:40 CST; 22s ago
Process: 30278 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 30279 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─30279 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

2月 05 14:14:40 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon…
2月 05 14:14:40 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
[root@localhost /]# ss -anptul | grep vsftpd //查看端口号 :::21 显示21端口//

shell概述
shell是一个程序,它连接了用户和Linux内核,它可以解释用户输入的命令传递给内核,让用户可以更加方便的使用Linux系统
shell本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序
shell是具备编程的能力的,shell也是一种语言,c语言,c++,jave,python,go语言等
语言分为:编译型语言:c,c++,Go ,语言提前编译,编译语言都有编译器
解释型语言:shell,python,php,不需要提前编译,一边执行一边编译,每种语言都有解释器
shell语言支持大部分编程语言都具备的功能,if判断,for循环,变量,数组,函数,加减乘除,逻辑运算
shell算是比较简单的,相比于其他语言
shell语言:就是linux一些命令,都叫shell命令
[root@localhost /]# cat /etc/shells (这里都是解释器)
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash (常用的)
/usr/sbin/nologin
/bin/tcsh
/bin/csh
//规范shell脚本组成//
vim user.sh
#! /bin/bash (环境声明)
#注释信息
可执行代码…
//如何写好一个shell脚本//
明确任务需求
按需求整理好每一个步骤,先做什么,后做什么
运行脚本,并根据运行结果排除错误
优化脚本并达到最终效果

编写一个脚本
[root@localhost ~]# vim hello.sh
#!/bin/bash
#hello word
echo hello word
[root@localhost ~]# chmod u+x hello.sh 赋予权限
[root@localhost ~]# /root/hello.sh 执行脚本
hello word
例子2:
#!/bin/bash
useradd adc
passwd abc
[root@localhost ~]# chmod u+x user.sh
[root@localhost ~]# ./user.sh
例子3:
[root@localhost ~]# cat user.sh
#!/bin/bash
useradd wang
echo 1 | passwd --stdin wang

编写批量查看脚本
#查看系统版本信息,查看系统内核信息,
[root@localhost ~]# cat info.sh
#!/bin/bash
cat /etc/redhat-release
uname -r
free -h
ifconfig
hostname
[root@localhost ~]# chmod 777 info.sh
[root@localhost ~]# ./info.sh

编写本地yum源的脚本

麻烦版:
#!/bin/bash
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng
rm -rf /etc/yum.repos.d/*
echo ‘/dev/cdrom /mnt/liudaheng iso9660 defaults 0 0’ >>/etc/fstab
touch /etc/yum.repos.d/local.repo
echo ‘[liudaheng]’ >/etc/yum.repos.d/local.repo
echo ‘name=liudahen’ >>/etc/yum.repos.d/local.repo
echo ‘baseurl=file:///mnt/liudaheng’ >> /etc/yum.repos.d/local.repo
echo ‘enable=1’ >> /etc/yum.repos.d/local.repo
echo ‘gpgcheck=0’ >> /etc/yum.repos.d/local.repo

简易版:
#!/bin/bash
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng
echo ‘/dev/cdrom /mnt/liudaheng iso9660 defaults 0 0’ >> /etc/fstab
mount -a
rm -rf /etc/yum.repos.d/*
echo ‘[liudaheng]
name=liudaheng
baseurl=file:///mnt/liudaheng
enable=1
gpgcheck=0’ > /etc/yum.repos.d/local.repo
优化版:
#!/bin/bash
echo ‘正在配置本地yum仓库…’
mkdir /mnt/liudaheng
mount /dev/cdrom /mnt/liudaheng &> /dev/null (这个就是个黑洞地址)
echo ‘/dev/cdrom /mnt/liudaheng iso9660 defaults 0 0’ >> /etc/fstab
mount -a
rm -rf /etc/yum.repos.d/*
echo ‘[liudaheng]
name=liudaheng
baseurl=file:///mnt/liudaheng
enable=1
gpgcheck=0’ > /etc/yum.repos.d/local.repo
echo ‘本地yum仓库已完成…’
yum clean all &>/dev/null
yum repolist | tail -1
echo ‘仓库软件包数量…’

脚本的执行方式
执行一个脚本的方式有很多种
方法一:赋予脚本执行权限后,可用绝对路径或者当前路径执行
方法二:调用解释器执行脚本文件
//绝对路径执行脚本//
/root/hello.sh
//相对路径执行脚本//
./hello.sh
//去除执行权限//
chmod u-x hello.sh
//执行脚本//
[root@localhost ~]# ./hello.sh
-bash: ./hello.sh: 权限不够
权限不够的可以用解释器来进行执行
[root@localhost ~]# bash hello.sh
hello word
任何一个解释器都可以

常用特殊符号
“” #双引号,引用整体
‘’ #单引号,引用整体并取消所有字符含义
$[] # 四则运算(+ - / % 取余数)相当于一个计算器
KaTeX parse error: Expected 'EOF', got '#' at position 8: () #̲将命令的输出结果作为参数 #反…PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
//引用整体,屏蔽特殊符号的作用//
[root@localhost ~]# echo ‘$PATH’
$PATH
//没有特殊符号单双引都可以//
[root@localhost ~]# echo ‘xxoo’
xxoo
[root@localhost ~]# echo “xxoo”
xxoo
//四则运算1+1//
[root@localhost ~]# echo $[1+1]
2
//四则运算4除以2/
[root@localhost ~]# echo $[4/2]
2
//取命令结果为参数//
[root@localhost ~]# touch $(date +%F)-abc.txt
[root@localhost ~]# ls
2022-02-06-abc.txt anaconda-ks.cfg hello.sh info.sh initial-setup-ks.cfg user.sh yum.sh

变量
以固定的名称存放可能变化的值,提高脚本的灵活度来适应多变的环境
定义变量:变量名=变量值,如:a1=abc (等号两边不要有空格)
取消变量:unset 变量名
定义变量注意事项:
1:变量名由字母/数字/下划线组成,区分大小写,不能以数字开头,不要使用命令和特殊符号
2:若指定的变量名已经存在,相当于为此变量重新赋值
例如:
//输出变量里的值//
[root@localhost ~]# xx=haha
[root@localhost ~]# echo $xx
haha
//更新变量//
[root@localhost ~]# xx=abcd
[root@localhost ~]# echo $xx
abcd
//调用变量的值//
[root@localhost ~]# xx=5
[root@localhost ~]# echo $xx
5
[root@localhost ~]# echo $[xx+5]
10
//通过变量定义用户名//
[root@localhost ~]# cat user.sh
#!/bin/bash
user=liudaheng
useradd $user
echo 1 | passwd --stdin $user
//优化版//
#!/bin/bash
user=dff
useradd u s e r e c h o " 用户 user echo "用户 userecho"用户user创建完毕"
echo 1 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null (输出…user密码设置成功"
[root@localhost ~]# ./user.sh
用户lll创建完毕
用户lll密码设置成功
//更加智能化的版本//

read标准输入取值
read读取用户在键盘上输入的内容,并把内容存放在变量里,可以降低脚本的使用难度
命令格式:read -p “提示信息” 变量名
//小脚本,手动输入用户名和密码//
[root@localhost ~]# cat user.sh
#!/bin/bash
read -p ‘请输入用户名:’ user
useradd u s e r e c h o " 用户 user echo "用户 userecho"用户user创建完毕"
read -p ‘请设置用户密码:’ pass
echo $pass | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null ec…user密码设置成功"
//验证//
[root@localhost ~]# ./user.sh
请输入用户名:ooo
用户ooo创建完毕
请设置用户密码:liudaheng
用户ooo密码设置成功

变量种类
环境变量:变量名一般都大写,用来设置用户/系统环境
位置变量:bash内置,存储执行脚本时提供的命令参数
预定义变量:bash内置,可直接调用的特殊值,不能直接修改
自定义变量:用户自定义
env 命令查看系统所有环境变量
set 命令查看系统所有变量 ,包括用户自定义变量
环境变量:
[root@localhost ~]# env
系统已经定义好的变量

位置变量:
$0
$1 第一个参数
$2 第二个参数
$3 第三个参数
$n 第n个参数
预定义变量:
$0 代表脚本本身
$* 显示所有参数内容
$# 显示有多少个参数
$? 显示上一条命令的执行结果(0代表正确,非0代表错误)
$$ 显示脚本进程号(PID)
例如:需要给未知变量赋值
[root@localhost ~]# ./ttt.sh a b c
./ttt.sh #$0#
a #$1#
b #$2#
c #$3#
3 #以此类推#
69321
0
//查看系统所有变量//
[root@localhost ~]# set
//查看自己的变量//
[root@localhost ~]# set | grep abc

判断文件状态(判断是否存在)
-e //判断文档(文件或者目录)是否存在,存在为真//
-d //判断目录是否存在,存在为真//
-f //判断文件是否存在,存在为真//
-r //可读为真//
-w //可写为真//
-x //可执行为真//
//判断//
[root@localhost ~]# [ -e /etc ] (括号两边必须有空格)
查看真假
[root@localhost ~]# echo $?
0 #0为真#
//判断2//
[root@localhost ~]# [ -d /opt ]
[root@localhost ~]# echo $?
0

整数比较
-gt 大于
-ge 大于等于
-eq 等于
-lt 小于
-le 小于等于
-ne 不等于
例如:
[root@localhost ~]# [ 1-gt1 ] //1大于1吗?//
[root@localhost ~]# echo $? //判断一下//
0
[root@localhost ~]# [ 1 -eq 1 ] //1等于1吗//
[root@localhost ~]# echo $? //判断//
0

字符串对比
==相等
!=不等于
//例如//
[root@localhost ~]# [ root == xxoo ]
[root@localhost ~]# echo $?
1

常用数值运算方式
$[] //四则运算(+ - * / % 取余数)
$(()) //数值运算工具//
expr //数值运算工具//
let //数值运算工具//
//let简写表达式// //let完整表达式//
let i++ let i+i+1
let i-- let i=i-1
let i+=2 let i=i+2
let i-=2 let i=i-2
let i*=2 let i=i2
let i/=2 let i=i/2
let i%=2 let i=i%2
例如:
[root@localhost ~]# echo $[10+6]
16
[root@localhost ~]# echo $((10+5))
15
//用expr需要用反引号,每个部分都需要有空格//
[root@localhost ~]# echo expr 2 + 2
4
!//使用乘法时需要跟一个\来进行//
[root@localhost ~]# echo expr 10 \* 3
30
//用let进行加法//
[root@localhost ~]# let x=1+1
[root@localhost ~]# echo $x
2
[root@localhost ~]# let a=10+5
[root@localhost ~]# echo $a
15
//例如//
[root@localhost ~]# let a=10
[root@localhost ~]# let b=20
[root@localhost ~]# let c=a+b
[root@localhost ~]# echo $c
30
//例如//
[root@localhost ~]# i=10
[root@localhost ~]# let i++
[root@localhost ~]# echo $i
11
//例如//
[root@localhost ~]# let i–
[root@localhost ~]# echo $i
10
//例如//
[root@localhost ~]# let i+=2
[root@localhost ~]# echo $i
12
//例如//
[root@localhost ~]# let i
=2
[root@localhost ~]# echo $i
24

字符串判断
-z 字符串的值为空为真
-n 字符串的值非空为真
//例如//
[root@localhost ~]# [ -z /etc/passwd ] !注意:括号里的空格还是不能少的
[root@localhost ~]# echo $?
1
//例如//
[root@localhost ~]# [ -n /etc/passwd ]
[root@localhost ~]# echo $?
0
//例如//
[root@localhost ~]# [ ! -z $i ]
[root@localhost ~]# echo $?
0

条件判断结构
当条件满足时执行什么操作,当条件不满足时执行什么操作
&& 逻辑与(并且)
|| 逻辑或(或者)
; 条件之间没有逻辑关系
A && B 当A命令执行成功后才执行B ,如果A执行失败,B就不执行了
A | | B 当A命令执行失败后才会执行B,如果A执行成功则B不执行
A ;B 执行A命令后执行B,两者没有逻辑关系
//例如//
[root@localhost ~]# [ -f /etc/passwd ] && cp /etc/passwd /opt
[root@localhost ~]# ls /opt
passwd rh
//例如,两者没有逻辑关系//
[root@localhost ~]# touch /mnt/xx.txt ; touch /opt/xx.txt
[root@localhost ~]# ls /mnt/
liudaheng xx.txt
[root@localhost ~]# ls /opt/
passwd rh xx.txt

if条件判断结构
if单分支结构,只能判断对,不能判断错
//第一种语法结构//
if [条件判断] ; then
条件成立时,执行的命令
fi
//第二种语法结构,只能判断对,不能判断错//
if [条件判断]
then
条件成立时,执行的命令
fi
//实例//
[root@localhost ~]# cat if.sh
if [ -n /etc/passwd ]; then
echo ‘非空’
fi

if双分支语句(这个就能判断对和错了)
if [条件判断] ; then
条件成立时,执行命令a
else
条件不成立时,执行命令b
fi
//例如//
[root@localhost ~]# cat if.sh
if [ -z /etc/passwd ]; then
echo ‘空值’
else
echo ‘非空’
fi

[root@localhost ~]# ./if.sh
非空
//编写猜数字的脚本,让计算机产生一个0-9随机数字//
#$RANDOM里面放的是0-65535之间的随机数#
[root@localhost ~]# echo R A N D O M 16832 / / 使用 RANDOM 16832 //使用 RANDOM16832//使用RANDOM对10取余,这样就是0-9的随机数//
[root@localhost ~]#
[root@localhost ~]# echo $[RANDOM%10]
6
[root@localhost ~]# echo $[RANDOM%10]
6
[root@localhost ~]# echo $[RANDOM%10]
3
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 33: …ot@localhost ~]#̲ //例子,猜数脚本// […[RANDOM%10]
if [ $num -eq n m 1 ] ; t h e n e c h o " 恭喜你猜对了,奖励一个哇塞 ! " e l s e e c h o " 猜错了,请继续努力! " e c h o " 正确结果为 nm1 ] ; then echo "恭喜你猜对了,奖励一个哇塞!" else echo "猜错了,请继续努力!" echo "正确结果为 nm1];thenecho"恭喜你猜对了,奖励一个哇塞!"elseecho"猜错了,请继续努力!"echo"正确结果为num1"
fi
//例子,安装软件包脚本//
[root@localhost ~]# cat if.4.sh
#!/bin/bash
if [ rpm -q vsftpd &> /dev/null ; echo $? -eq 0 ] ; then
systemctl start vsftpd
systemctl enable vsftpd &> /dev/null
echo ‘软件包已经安装’
else
yum -y install vsftpd &> /dev/null
systemctl start vsftpd
systemctl enable vsftpd &> /dev/null
echo ‘软件包已经安装,并设置随机自启’
fi
[root@localhost ~]# chmod u+x if.4.sh
[root@localhost ~]# ./if.4.sh

if多分支语句
if [条件判断1] ; then
条件1成立时,执行命令A
elif [条件判断2] ;then
条件2成立时,执行命令B
elif [条件判断3] ;then
条件3成立时,执行命令C
省略…
else
所有条件都不成立时,执行命令D
fi
//判断成绩的脚本//
[root@localhost ~]# cat chengji.sh
#!/bin/bash
read -p “请输入你的成绩:” num
if [ $num -ge 90 ] ; then
echo “你的成绩很好,优秀!”
elif [ $num -ge 80 ] ; then
echo “比较优秀!”
elif [ $num -ge 60 ] ; then
echo “勉强及格”
else
echo “回家种地”
fi
[root@localhost ~]# ./chengji.sh
请输入你的成绩:60
勉强及格

case条件判断结构
case从变量中取值,如果变量中的值与预设的值匹配,则执行对应的命令
语法结构:
case $变量名 in
值1)
执行的命令xx;; //如果变量中的值等于值1,则执行的命令
值2)
执行的命令yy;; //如果变量中的值等于值2,则执行的命令
…省略其他分支
*)
执行的命令zz;; //如果变量中的值都不是以上的值,则执行的命令
esac
//例子//
[root@localhost ~]# cat lll.sh
#!/bin/bash
read -p “请输入您喜爱的食物(1)(2)(3)” xxoo
case $xxoo in
1)
echo “你输入的是1,输出1”;;
2)
echo “你输入的是2,输出2”;;
3)
echo “你输入的是3,输出3”;;
*)
echo “你输入的啥也不是,无法识别”;;
esac
[root@localhost ~]# ./lll.sh
请输入您喜爱的食物(1)(2)(3)2
你输入的是2,输出2
[root@localhost ~]# ./lll.sh
请输入您喜爱的食物(1)(2)(3)5
你输入的啥也不是,无法识别

for循环
for循环处理,根据变量的取值,重复执行xx命令
/for循环语法结构//
for 变量名 in 值1 值2 值3 值N…
do
执行的命令
done
//例子,编写循环创建用户的脚本//
[root@localhost ~]# cat rrr.sh
#!/bin/bash
for user in xx1 xx2 xx3 xx4
do
useradd u s e r e c h o " user echo " userecho"user已经创建成功"
echo 1 | passwd --stdin KaTeX parse error: Expected 'EOF', got '&' at position 6: user &̲> /dev/null …user密码设置成功,初始密码为1"
done
//测试企业的服务器连通性//
#!/bin/bash
for i in seq 254 (seq命令这个表示从1到254)
do
ping -c2 -i0.1 -w1 192.168.59.$i &> /dev/null
if [ ? − e q 0 ] ; t h e n e c h o " 192.168.0. ? -eq 0 ] ; then echo "192.168.0. ?eq0];thenecho"192.168.0.i UP" &>> /opt/ping_up.txt
else
echo “192.168.0.$i DOWN” &>> /opt/ping.down.txt

fi
done

while循环
死循环,只要条件成立就重复执行命令
while循环语法结构:
while 条件判断
do
执行的命令
done
//例如//
[root@localhost ~]# cat while.sh
#!/bin/bash
a=1
while [ $a -le 5 ]
do
echo $a
let a++
done

[root@localhost ~]# chmod u+x while.sh
[root@localhost ~]# ./while.sh
1
2
3
4
5
//例如随机数字成功后输出然后退出//
[root@localhost ~]# cat while.sh
#!/bin/bash
num=$[RANDOM%10]
while :
do
read -p “请输入0-10之间的数字” num1
if [ $num -eq $num1 ]; then &> /dev/null
echo “恭喜啊”
exit //执行成功后就直接退出//
else
echo “不要灰心”
fi
done
//使用while来进行网卡进出口流量//
[root@localhost ~]# cat wangka.sh
#!/bin/bash
while :
do
clear //清屏//
ifconfig eno16777736 | head -2
ifconfig eno16777736 | grep “RX p” //网卡入口流量//
ifconfig eno16777736 | grep “TX p” //网卡出口流量//
sleep 0.2 //休眠0.2秒钟//
done

shell函数
在shell环境中,将一些需要重复使用的操作,定义为公共的语句块,即可称为函数,就是给一堆的命令取一个别名
函数可以使脚本中的代码更加简洁,增强易读性,提高脚本的执行效率
//函数定义格式1//
function 函数名 {
执行的命令1
执行的命令2
等更多命令

//函数定义格式2//
函数名(){
执行的命令1
执行的命令2
等更多的命令

//例如,将很多命令变成一个函数来使用,调用函数//
[root@localhost ~]# net_ens() {

ifconfig | head -2
ifconfig | tail -5
ifconfig | grep “RX p”
}
[root@localhost ~]# net_ens
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.142 netmask 255.255.255.0 broadcast 192.168.59.255
RX packets 4489 bytes 502320 (490.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4489 bytes 502320 (490.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    RX packets 28664  bytes 2740961 (2.6 MiB)
    RX packets 4489  bytes 502320 (490.5 KiB)

//例子2//
[root@localhost ~]# miinfo() {

ifconfig
df -Th
free -h
}
[root@localhost ~]# miinfo
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.142 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fe80::20c:29ff:fef4:6ae9 prefixlen 64 scopeid 0x20
ether 00:0c:29:f4:6a:e9 txqueuelen 1000 (Ethernet)
RX packets 28918 bytes 2764081 (2.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21126 bytes 2327675 (2.2 MiB)
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
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 0 (Local Loopback)
RX packets 4489 bytes 502320 (490.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4489 bytes 502320 (490.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root xfs 18G 3.0G 15G 17% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 92K 914M 1% /dev/shm
tmpfs tmpfs 914M 9.0M 905M 1% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.0G 4.0G 0 100% /mnt/liudaheng
/dev/sda1 xfs 497M 119M 379M 24% /boot
total used free shared buffers cached
Mem: 1.8G 1.1G 738M 9.6M 1.8M 386M
-/+ buffers/cache: 700M 1.1G
Swap: 2.0G 0B 2.0G

//fork炸弹,卡死系统,无限消耗系统资源//
[root@localhost ~]# cat zhadan.sh
#!/bin/bash
.() {
. | . & //放后台//
}
.

脚本中断及退出
break //结束整个循环//
continue //结束本次循环,进入下一次循环//
exit //退出脚本//
//跳过脚本的某一次循环,第三次循环,进行下一次循环//
[root@localhost ~]# ./for.sh
1
2
4
5
Over
[root@localhost ~]# cat for.sh
#!/bin/bash
for i in {1…5}
do
[ $i -eq 3 ] && continue
echo $i
done
echo Over
//结束整个循环//
[root@localhost ~]# ./for.sh
1
2
Over
[root@localhost ~]# cat for.sh
#!/bin/bash
for i in {1…5}
do
[ $i -eq 3 ] && break
echo $i
done
echo Over

字符串截取
在使用shell脚本完成各种运维任务时,一旦涉及到判断、条件测试等相关操作时往往需要对相关的命令输出进行过滤,提取出符合要求的字符串
字符串截取的常用方法:${变量名:起始位置:长度}
${}截取字符串时,起始位置是从0开始的
//例如//
[root@localhost ~]# jiequ=1234567890
[root@localhost ~]# echo $jiequ
1234567890
//统计个数//
[root@localhost ~]# echo ${#jiequ}
10
//截取前三位//
[root@localhost ~]# echo ${jiequ:0:3}
123
[root@localhost ~]#
//截取后四位//
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 36: …ot@localhost ~]#̲ //截取一个随机八位数密码…[RANDOM%29]
p= x : n : 1 p a s s = {x:n:1} pass= x:n:1pass=pass$p
done
echo $pass

[root@localhost ~]# ./mima.sh
3klfu3jj
[root@localhost ~]# ./mima.sh
jfl3dfjk
[root@localhost ~]#

字符串的替换
只替换第一个匹配的结果: 变量名 / x x / y y 替换全部匹配的结果: {变量名/xx/yy} 替换全部匹配的结果: 变量名/xx/yy替换全部匹配的结果:{变量名//xx/yy}
//替换第一个匹配的结果//
[root@localhost ~]# xx=1111111
[root@localhost ~]# echo ${xx/1/2}
2111111
[root@localhost ~]#
//替换全部匹配的结果//
[root@localhost ~]# echo ${xx//1/2}
2222222
[root@localhost ~]#

字符串掐头去尾
从左向右,最短匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲*关键字} 从左向右,最长匹配…{变量名##关键字}
从右向左,最短匹配删除:KaTeX parse error: Expected '}', got 'EOF' at end of input: …*} 从右向左,最长匹配删除:{变量名%%关键字
}
例如:
//从左到右最短匹配//
[root@localhost ~]# x=head -1 /etc/passwd
[root@localhost ~]# echo $x
root❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${x#root}
❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${x#0}
:0:root:/root:/bin/bash
//加
的区别//
[root@localhost ~]# echo ${x#0} (不在第一个位置就得加,不加*他只匹配最左侧的字符串)
:0:root:/root:/bin/bash
[root@localhost ~]# echo ${x#*root}
❌0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${x#0}
root❌0:0:root:/root:/bin/bash
//最长匹配//
[root@localhost ~]# echo ${x##*root}
:/bin/bash
[root@localhost ~]#
//批量改文件后缀名//
[root@localhost liudaheng]# touch {1…40}.doc
[root@localhost liudaheng]# ls
10.doc 14.doc 18.doc 20.doc 24.doc 28.doc 31.doc 35.doc 39.doc 5.doc 9.doc
11.doc 15.doc 19.doc 21.doc 25.doc 29.doc 32.doc 36.doc 3.doc 6.doc
12.doc 16.doc 1.doc 22.doc 26.doc 2.doc 33.doc 37.doc 40.doc 7.doc
13.doc 17.doc 2 23.doc 27.doc 30.doc 34.doc 38.doc 4.doc 8.doc
[root@localhost liudaheng]# touch gai.sh
[root@localhost liudaheng]# vim gai.sh
[root@localhost liudaheng]# chmod 777 gai.sh
[root@localhost liudaheng]# ./gai.sh
[root@localhost liudaheng]# ls
10.txt 14.txt 18.txt 20.txt 24.txt 28.txt 31.txt 35.txt 39.txt 5.txt 9.txt
11.txt 15.txt 19.txt 21.txt 25.txt 29.txt 32.txt 36.txt 3.txt 6.txt gai.sh
12.txt 16.txt 1.txt 22.txt 26.txt 2.txt 33.txt 37.txt 40.txt 7.txt
13.txt 17.txt 2 23.txt 27.txt 30.txt 34.txt 38.txt 4.txt 8.txt
[root@localhost liudaheng]# cat gai.sh
for i in ls *.doc
do
mv $i ${i%doc}txt
done
//替换改文件后缀名//
[root@localhost liudaheng]# cat gai.sh
for i in ls *.doc
do
mv $i ${i/doc/txt}
done

shell数组
#定义数组方式一:数组名=(值1 值2 值3 …值n)
#定义数组方式二:数组名[下标]=值
//例如//
[root@localhost liudaheng]# x=(1 2 3 4 5 6 0)
[root@localhost liudaheng]# echo $x
1
//按照下标取值,下标从0开始的//
[root@localhost liudaheng]# echo ${x[0]}
1
[root@localhost liudaheng]# echo ${x[1]}
2
//取值所有//
[root@localhost liudaheng]# echo ${x[@]}
1 2 3 4 5 6 0
//例子2,赋值,然后输出//
[root@localhost liudaheng]# b[0]=aa
[root@localhost liudaheng]# b[1]=bb
[root@localhost liudaheng]# b[2]=cc
[root@localhost liudaheng]# echo $b
aa
[root@localhost liudaheng]# echo ${b[@]}
aa bb cc

正则表达式 (可以连用)
正则表达式使用一串符号描述有共同属性的数据

基本正则符号 描述
^ 匹配行首
$ 匹配行尾
[] 集合,匹配集合中的任意单个字符
[^] 对集合取反
. 匹配任意单个字符

  •                  匹配前一个字符任意次数[*不允许单独使用]
    

{n,m} 匹配前一个字符 n到m次
{n} 匹配前一个字符n次

扩展正则符号 描述

  •                       最少匹配一次
    

? 最多匹配一次
{n,m} 匹配n到m次
() 组合为整体,保留(复制)
| 或者
\b 单词边界
//匹配单个字符//
[root@localhost /]# grep “^root” /etc/passwd
root❌0:0:root:/root:/bin/bash

[root@localhost /]# grep “ro[abcdyty]” /etc/passwd
rtkit❌172:172:RealtimeKit:/proc:/sbin/nologin

[root@localhost /]# grep “root.” /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
roo❌1000:1000:root:/home/roo:/bin/bash

[root@localhost /]# cat 1.t
a
abb
aab
abb
b
baa
bsss
bdd

[root@localhost /]# grep “a*b” 1.t
abb
aab
abb
b
baa
bsss
bdd
[root@localhost /]# grep “a.*b” 1.t
abb
aab
abb

[root@localhost /]# grep “a{1,}” 1.t
a
abb
aab
abb
baa

[root@localhost /]# grep “a{2}” 1.t
aab
baa
aaaaaaaaaaaaaaaaaaaaaaaba

[root@localhost /]# grep “o{2}” /etc/passwd
root❌0:0:root:/root:/bin/bash
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
roo❌1000:1000:root:/home/roo:/bin/bash
ooo❌1008:1008::/home/ooo:/bin/bash

[root@localhost /]# grep “a{2,4}b” 1.t
aab
aaaaaaaaaaaaaaaaaaaaaaaba

//扩展的前面要加e//
[root@localhost /]# grep “a{2,4}b” 1.t
[root@localhost /]# egrep “a{2,4}b” 1.t
aab
aaaaaaaaaaaaaaaaaaaaaaaba
//匹配至少出现一次以上//
[root@localhost /]# egrep “a+” 1.t
a
abb
aab
abb
baa
aaaaaaaaaaaaaaaaaaaaaaaba

[root@localhost /]# egrep “a?b” 1.t
abb
aab
abb
b
baa
bsss
bdd
aaaaaaaaaaaaaaaaaaaaaaaba
//或者//
[root@localhost /]# grep “aaa|ab|bb” 1.t

sed流式编辑器
sed是一个非交互的文本编辑器,实现的功能跟vim相同,主要是对文件内容进行输出、删除、替换、复制、剪切、导入、导出等功能
命令格式1:前置命令 | sed [选项] ‘[指令]’ 文件名
命令格式2:sed [选项] ‘[指令]’ 文件名
! 注意:这个符号用什么也可以,替换符号 / ;, 都可以
常用选项:
-n #屏蔽默认输出,默认sed会将所有的输出结果输出到屏幕中,-n只把sed处理的行输出到屏幕
-i #直接修改文件内容,如果不加-i选项,并不会真正改变文件的内容
-r #使用扩展正则,若与其他选项连用应作为首个选项
动作指令:
p #打印指定的行,如:2,4p 打印第234行,如:2p;4p 打印第2行与第4行
d #删除指定的行,如:2,4d删除第234行
s #字符串替换,如:s/日字串/新字串/
r #导入文件内容,如:4r 1.txt在第4行下导入1.txt文件内容
w #导出文件内容,如:3w 1.txt将文件第三行内容另存到2.txt文件中
//例如,打印第一行//
[root@localhost /]# sed -n ‘1p’ /etc/passwd
root❌0:0:root:/root:/bin/bash
//打印3到6行//
[root@localhost /]# sed -n ‘3,6p’ /etc/passwd
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
//用正则表达式的时候可以必须用/来括起来//
[root@localhost /]# sed -n ‘/^root/p’ /etc/passwd
root❌0:0:root:/root:/bin/bash
//以bash结尾的行//
[root@localhost /]# sed -n ‘/bashKaTeX parse error: Expected 'EOF', got '#' at position 57: …host liudaheng]#̲ sed '2,4d' tes…/d’ test
//替换文件匹配到第一个查到的字串替换//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/’ test
//替换文件匹配到的第二个字串//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/2’ test
//替换所有匹配的字符//
[root@localhost liudaheng]# sed ‘s/aaa/bbb/g’ test
//替换成空//
[root@localhost liudaheng]# sed ‘s/aaa//’ test
//任何符号都可以//
[root@localhost liudaheng]# sed ‘s/2020/5555/’ 1.txt
5555 1111 2222
2021 2222 3333
2022 3333 4444
[root@localhost liudaheng]# sed ‘s,2020,5555,’ 1.txt
5555 1111 2222
2021 2222 3333
2022 3333 4444
[root@localhost liudaheng]# sed ‘s;2020;5555;’ 1.txt
5555 1111 2222
2021 2222 3333
2022 3333 4444
//导入文件内容到文件//
[root@localhost liudaheng]# sed ‘r/etc/passwd’ 1.txt
//导入文件内容第一行到文件//
[root@localhost liudaheng]# sed ‘1r/etc/passwd’ 1.txt
//导入文件内容第1到3行导入到文件//
[root@localhost liudaheng]# sed ‘1,3r/etc/passwd’ 1.txt
//导出文件内容//
[root@localhost liudaheng]# sed ‘1,3w/etc/passwd’ 1.txt

awk编程语言
awk编程语言/数据处理引擎
创造者:Aho Winberger Kernighan
基于模式匹配检查输入文本,逐行处理并输出,获取指定的数据
awk过滤数据时支持仅打印某一列,如:第2列、第4列…
awk命令格式1: awk[选项] '条件1{指令}条件2{指令}文件名
awk命令格式2:前置命令│ awk[选项]‘条件{指令}
常用指令: print是最常用的打印指令
常用选项:-F#指定分隔符,如不指定分隔符,默认以空格或tab键为默认分隔符,可通过[]集合匹配多种单个字符
awk内置变量:$1第一列,$2第二列,$3第三列,依次类推,NR文件当前行号,NF文件当前列数
awk使用数值/字符串比较设置条件
等于:==
不等于:!=
大于:>
大于等于:>=
小于:<
小于等于:<=
awk过滤时机,awk’BEGIN{指令}{指令}END{指令}’ 文件名
BEIN(指令)#读取文件内容之前执行指令,指令执行一次,行前处理
{指令} #读取文件过程中执行,指令逐行执行
END{指令} #读取文件内容结束后执行指令,执行指令一次
awk分支结构
if 单分支格式:if(条件){指令}
if双分支格式:if (条件){指令}else {指令}
awk数组
定义数组格式1:数组名[下标]=值
定义数组格式2:数组名[下标]
数组的用法:for(变量名in数组名){print 数组名[变量]}
awk循环结构
命令格式:fro(变量名in数组名) {print 数组名[变量]}
例如:
//打印文件的第一列//
[root@localhost liudaheng]# awk ‘{print $1}’ test.txt
hello
welcome
//查看第一列和第三列//
[root@localhost liudaheng]# awk ‘{print $1,$3}’ test.txt
hello jfdlf
welcome shandong
//打印第一列,指定分隔符,文件默认没有空格作为分隔符,因为/etc/passwd里面没有空格能做分隔符//
[root@localhost ~]# awk -F: ‘{print $1}’ /etc/passwd
//通过[]集合来打印文件第1列和第7列,用户名和解释器//
[root@localhost ~]# awk -F: ‘{print $1,$7}’ /etc/passwd
//以root开头的行直接打印//
[root@localhost ~]# awk -F: ‘/^root/{print}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
//打印root开头的并且只打印第一行和第七行//
[root@localhost ~]# awk -F: ‘/^root/{print $1,$7}’ /etc/passwd
root /bin/bash
//打印出行号//
[root@localhost ~]# awk -F: ‘{print NR,NF}’ /etc/passwd
//例子//
[root@localhost ~]# awk -F: ‘{print $1,“用户的解释器为:” ,$7}’ /etc/passwd
root 用户的解释器为: /bin/bash
//排除第七行排除noloain然后再输出第1行和第7行//
[root@localhost ~]# awk -F: ‘$7!~/nologin/{print $1,$7}’ /etc/passwd
//利用扩展正则过滤,以root或者adm开头的行,打印第一列与第七列//
[root@localhost ~]# awk -F: ‘/^(root|adm)/{print $1,$7}’ /etc/passwd
root /bin/bash
adm /sbin/nologin
//打印行号为3的,就是打印第三行//
[root@localhost ~]# awk ‘NR==3{print}’ /etc/passwd
daemon❌2:2:daemon:/sbin:/sbin/nologin
//找出文件中第三列大于1000的,然后打印1,3,7,行//
[root@localhost ~]# awk -F: ‘$3>=1000{print $1,$3,KaTeX parse error: Expected 'EOF', got '}' at position 2: 7}̲' /etc/passwd /…/{x++}END{print x}’ /etc/passwd
2
//if语句实例//
[root@localhost ~]# awk -F: ‘{if($3>=1000){x++}}END{print x}’ /etc/passwd
2
//数组//
[root@localhost ~]# awk ‘BEGIN{x[0]=10;x[1]=20;print x[0],x[1]}’
10 20
//用awk打印最终的剩余的内存//
[root@localhost ~]# free -h | grep Mem | awk ‘{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲' 472M //脚本显示根分…’ | awk ‘{print “根分区剩余空间”,$4}’
free -h | grep Mem | awk ‘{print “物理内存剩余空间”,$4}’
//查看用户的登录次数//
[root@localhost ~]# who | awk ‘{ip[$1]++}END{for(i in ip)print i,ip[i]}’
root 1
roo 2

SElinux系统内核的安全机制
Security-Enhanced Linux美国NSA国家安全局主导开发,一套增强Linux系统安全的强制访问控制体系
集成到Linux内核(2.6及以上)针对用户、进程、目录和文件提供了预设的保护策略,以及管理工具
SElinux运行模式
enforcing 强制模式
permissive 宽松模式
disabled 禁用模式
SElinux运行模式切换
查看当前运行模式:getenforce
临时切换运行模式:setenforce 1 | 0 #1强制模式,0宽松模式
SElinux配置文件:/etc/selinux/config
//查看当前模式//
[root@localhost ~]# getenforce
Enforcing
//修改为宽松模式//
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
//永久修改就直接进配置文件//
vim /etc/selinux/config
[root@localhost ~]# cat /etc/selinux/config

This file controls the state of SELinux on the system.

SELINUX= can take one of these three values:

enforcing - SELinux security policy is enforced.

permissive - SELinux prints warnings instead of enforcing.

disabled - No SELinux policy is loaded.

SELINUX=disabled

SELINUXTYPE= can take one of these two values:

targeted - Targeted processes are protected,

minimum - Modification of targeted policy. Only selected processes are protected.

mls - Multi Level Security protection.

SELINUXTYPE=targeted
但是需要重启服务器,然后需要的话就直接修改临时和永久

安全防护firewalld防火墙
防火墙分为硬件防火墙和软件防火墙
系统服务:firewalld ,7版本默认使用的防火墙,6版本默认使用iptables,底层还是iptables
管理工具:firwalld-cmd
防火墙:匹配即停止
防火墙预设安全区域:
public 仅允许访问本机的sshd,DHCP,ping等少量服务
trusted 允许任何访问
block 阻塞任何来访请求
drop 丢弃任何来访的数据包
例如:
//开启防火墙//
[root@localhost ~]# systemctl start firewalld
//查看默认区域//
[root@localhost ~]# firewall-cmd --get-default-zone
public
//修改默认区域//
[root@localhost ~]# firewall-cmd --set-default-zone=block
success
[root@localhost ~]# firewall-cmd --get-default-zone
block
//添加服务到public//
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all #查看命令#
public
interfaces:
sources:
services: dhcpv6-client http ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
#封网段开服务#
若针对永久配置需添加 --permanent
使用 --add-source=网段地址
//永久设置http服务在public区域//
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@localhost ~]# firewall-cmd --zone=public --list-all
public
interfaces:
sources:
services: dhcpv6-client http ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
//把某ip给直接去掉//
[root@localhost ~]# firewall-cmd --zone=block --add-source=10.1.1.1
success

[root@localhost ~]# firewall-cmd --zone=block --list-all
block (default, active)
interfaces: eno16777736
sources: 10.1.1.1
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
//恢复ip的访问//
[root@localhost ~]# firewall-cmd --zone=block --remove-source=10.1.1.1
success
[root@localhost ~]# firewall-cmd --zone=block --list-all
block (default, active)
interfaces: eno16777736
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
#防火墙端口映射#
#本地应用的端口重定向(端口1>端口2)从客户机访问端口1的请求,自动映射到本机端口2#
[root@localhost ~]# firewall-cmd --zone=public --add-forward-port=port=5432:proto=tcp:toport=80
success
–add-forward 添加转发端口
port=port=5432 指定转发的端口
proto=tcp 指定tcp协议
toport=80 指定目标端口

常用协议及端口
http:超文本传输协议(明文协议) 默认端口号是:80 httpd默认走的http协议
https:安全的超文本传输协议,默认端口号:443 加密网站
ftp:文件传输协议,视频音频等,默认端口是:20(数据端口),21(命令端口)
DNS:域名解析协议,默认的端口号是53
telnet:远程管理协议,默认的端口号是23
smtp:用户发邮件协议:端口号25
pop3:用户收邮件协议:端口号110
tftp:简单的文件传输协议:端口号69
ssh:远程连接协议 : 端口号22
0-65535这是端口的总数
//记录协议与端口信息//
[root@localhost ~]# vim /etc/services

cron周期性计划任务
cron周期性计划任务用来定期执行程序,目前最主要的用途是定期备份数据
软件包名: cronie、crontabs
服务名: crond,用来控制服务,启动服务,停止服务
日志文件: /var/log/cron
cron定义时间格式:

          • 执行的命令
            

分 时 日 月 周
分钟: 从0到59之间的整数
小时:从2到23之间的整数
日期:从1到31之间的整数
月份:从1到12之间的整数
星期:0-6之间的整数,0代表周日

  • 没分,每时,每天,每月,每周
    , 分隔多个不连续的时间
  • 指定连续时间范围
    / 指定执行任务的时间间隔

crontab : 用于管理计划任务
crontab -e -u 用户名 #编写计划任务
crontab -l -u 用户名 #查看计划任务
crontab -r -u 用户名 #清除计划任务

//例如//
[root@localhost ~]# crontab -e #进入之后和vim一样#
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost ~]# crontab -l
*/1 * * * * date >> /opt/date.txt
[root@localhost ~]# ls /opt/
date.txt
[root@localhost ~]# cat /opt/date.txt
2022年 02月 13日 星期日 13:00:02 CST
2022年 02月 13日 星期日 13:01:01 CST

#每周5早上8点整执行一个任务#
00 8 * * 5 xx命令
#每天晚上23点30执行一个任务#
30 23 * * * xx命令
#错误格式,日期和星期不能同时定义,会发生矛盾#
30 23 1 * 2 xx命令
#每月的1,3,5号23:30执行一个任务,用逗号,英文的逗号#
30 23 1,3,5 * * xx命令
#每周的1,3,5晚上23:30 执行一个任务#
30 23 * * 1,3,5 xx命令
#每月的2-5号凌晨3:30分执行一个任务#
30 3 2-5 * * xx命令
#每两个小时执行一个任务#
00 */2 * * * xx命令
#每两分钟执行一个任务#
/2 * * * * xx命令
//这样名字不会重复,时间作为名字//
[root@localhost ~]# tar -czf date +%F-log.tar.gz /var/log/
.log
系统默认自动安装的这个软件包,随机自启动
[root@localhost ~]# rpm -q cronie
cronie-1.4.11-11.el7.x86_64

iptables防火墙
nerfilter/liptables:工作在主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应的处理

iptables框架
iptables的4表
filter:数据过滤表 (常用的就是这个表和INPUT链)
—包含三个链:INPUT,UOTPUT,FORWARD
nat:地址转换表,不能过滤数据包,仅仅修改数据包中的IP和端口
—包含三个链:PREROUTING,POSTROUTING,OUTPUT
raw:状态跟踪表,决定是否跟踪数据包
—包含两个链:OUTPUT,PREROUTING
mangle:包标记表,不能过滤也不能修改数据包
—包含五个链:PREROUTING,FORWARD,POSTROUTING,INPUT,OUTPUT
iptables的5链
PREROUTING链:路由前规则,防火墙在刚刚接收到数据包,对数据包进行路径选择之前所需要的链
FORWARD链:转发规则,将数据包从一个网络转发到另外一个网络所需要的链
POSTROUTING链:路由后规则,对数据包进行路径选择后,并在防火墙即将把数据包转发出去之前,所要需要的链
INPUT链:入站规则,限制客户端数据包目地地址是防火墙主机的上层应用所需要的链
OUTPUT链:出站规则,限制防火墙主机上层应用产生的数据包是否可以出站需要的链
目标操作
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过
LOG:记录日志,然后传给下一条规则
iptables命令格式
命令格式: lptables [-t表名]选项[链名][条件][-j目标操作]
添加规则:
-A#追加一条防火墙规则至链的末尾
-l #插入一条防火墙规则至链的开头
查看规则:
-L#查看iptables所有规则
-n#以数字形式显示地址、端口等信息
–line-numbers#查看规则时,显示规则的行号
删除规则:
-D#册除链内指定的序号(或内容)的一条规则
-F#清空所有规则
默认规则:
-P #为指定的链设置默认规则
iptables防火墙规则的条件
通用匹配:
协议匹配: -p#协议名称
地址匹配:-s源地址、-d目标地址
接口匹配: -i 接受数据的网卡、-o发送数据的网卡
端口匹配: --sport源端口号、–dport目标端口号
ICMP类别匹配: --icmp-type ICMP类型
创建规则注意事项
1.可以不指定表,默认为filter表
2.如果没有找到匹配条件,执行防火墙默认规则
3.选项/链名/目标操作用大写字母,其余都小写

//主机型防火墙规则配置//
[root@liudaheng ~]# yum -y install iptablesles-services (安装服务)
[root@liudaheng ~]# iptables -t filter -nL (查看filter的表)
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all – 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp – 0.0.0.0/0 0.0.0.0/0
ACCEPT all – 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all – 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all – 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@liudaheng ~]# iptables -t nat -nL (查看nat的表)
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@liudaheng ~]# iptables -t filter -I INPUT -p icmp -j REJECT (不允许别人访问我的ICMP协议)
[root@liudaheng ~]# iptables -t filter -I INPUT -p icmp -j ACCEPT (允许别人访问我的ICMP协议)
[root@liudaheng ~]# iptables -t filter -D INPUT 8 (删除某一条的规则)
[root@liudaheng ~]# iptables -F (清空防火墙规则)
[root@liudaheng ~]# iptables -nL --line-numbers (查看表里的规则)
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT (允许别人访问我的tcp)
[root@liudaheng ~]# iptables -t filter -nL INPUT (查看指定链)
[root@liudaheng ~]# iptables -t filter -P INPUT DROP (拒绝所有请求,包括ssh)
[root@liudaheng liudaheng]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT (放行tcp22端口)
[root@liudaheng ~]# iptables -t filter -P INPUT ACCEPT (设置防火墙默认规则)
[root@liudaheng ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:22

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j REJECT (拒绝别人访问我的80端口,就是httpd)
[root@liudaheng ~]# iptables -t filter -I INPUT -s 1.1.1.1 -j REJECT (拒绝某一个IP地址)
[root@liudaheng ~]# iptables -t filter -I INPUT -p tcp -i ens32 --dport 80 -j REJECT (匹配某一块网卡拒绝80的请求)
[root@liudaheng ~]# iptables -I INPUT -s 192.168.1.0/24 -j REJECT (匹配某一个网段拒绝某一个网段)

网络型防火墙规则配置
通过路由转发配置网络型防火墙
下面是准备的条件//
主机名 网卡、IP地址、网关设置
client24 ens32,192.168.1.24,网关指向防火墙外网ip:192.168.1.100
porxy ens32内网ip:192.168.0.26,ens34外网ip:192.168.1.100
web27 ens32:192.168.0.27,网关指向防火墙内网:192.168.0.26

防火墙主机添加网卡并设置ip,ip设置为192.168.0.100/24
[root@liudaheng ~]# nmtui (进界面调整IP)
[root@liudaheng ~]# ls /proc/sys/net/ipv4/ip_forward (查看有没有开启路由转发功能)
如果是0,就是没开启
[root@liudaheng ~]# echo 1> /proc/sys/net/ipv4/ip_forward (开启路由转发功能)
测试客户端和网站服务器的连通(能连通,公网ip)
[root@proxy ~]#sysctl -p //加载配置立即生效
net.ipv4.ip_forward = 1
、、查看路由转发、、
[root@proxy ~]# cat /proc/sys/net/ipv4/ip_forward
1
、、第二台服务器提供网站服务:web27将网关指向192.168.0.26
#安装httpd服务
[root@web1 ~]#yum -y insta17 httpd
#修改默认首页
[root@web1 ~]# echo web27 > /var/www/htm1/index. html
[root@web1 ~]# systemct1 start httpd
[root@web1 ~]# systemctl status httpd
、、 、、
第三台为客户端: client将IP修改为192.168.1.30网段,将网关指向防火墙主机的第二块网卡:192.168.0.100
访问测试: curl http://192.168.0.20
、、防火墙主机配置规则:拒绝192.168.1.30访问80端口,,
[root@proxy ~]# iptables -I FORWARD -s 192.168.1.30 -p tcp --dport 80 -j DROP
#客户端192.168.1.30访问测试:
curl http://192.168.0.20
[root@proxy ~]# iptables -F

防火墙扩展
命令格式:iptables 选项 链名 -m 扩展模块 --具体扩展条件 -j 动作
#根据MAC地址封锁主机,安装nmap扫描获取地方IP的MAC地址
[root@proxy ~]#yum -y insta17 nmap

#扫描对方主机IP
[root@proxy ~]#nmap -s 192.168.1.28
starting Nmap 6.40 ( http: / /nmap.org ) at 2020-09-25 17:12 CST
Nmap scan report for 192.168.0.111
Host is up (o.00044s latency). 、、当前主机状态、、
MAC Address: 00:0c:29:CA:87:81 (VMware) 、、mac地址、、
Nmap done: 1 IP address (1 host up) scanned in 4.05 seconds

#通过MAC地址限制对方访问
[root@proxy ~]# iptables -t fiter -I FORWARD -p tcp --dport 80 -m mac --mac-source00:0C:29:D5:29:OF -i REJECT

基于多端口设置过滤规则
[root@proxy ~]# iptables -t filter -I FORWARD -p tcp -m multiport --dports 20,21,80,443 -j ACCEPT
#multiport :多端口模块

#根据IP范围设置封锁规则
[root@proxy ~]# iptables -t filter -I FORWARD -p tcp --dport 80 -m iprange --Src-range192.168.1.20-192.168.1.30 -j REJECT
#iprange模块:ip范围模块
#–src-range: 源工P
#–dst-range:目标IP

配置SNAT实现共享上网
通过防火墙规则,允许局域网中的主机访问外网
主机名 网卡、IP地址、网关
内部主机:host24 ens32:192.168.1.28 网关: 192.168.1.100
内部防火墙:proxy ens32外网ip:192.168.0.26 ens34内网ip:192.168.1.100
外部主机:web27 ens32:192.168.0.27 网关:192.168.0.26
#实现192.168.1.28转换为192.168.0.26
[root@proxy ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.0.26
#POSTROUTING:路由后链
#-s:指定源地址为192.168.1.0网段的地址
#-p:想要通过tcp协议
#–dport:访问目标的80端口时
#-j:SNAT转换
#–to-source:转换源地址为192.168.0.26

#web1动态查看访问日志
[root@web1 ~]# tail -f /var/log/httpd/access_1og

client 192.168.1.30访问网站
curl http://192.168.0.27

#所有iptab1es规则都是临时规则,如果需要永久保留规则需要执行如下命令
[root@proxy ~]# service iptables save

sudo用户提权
管理员提前为用户设置执行权限许可
被授权用户有权执行授权命令
配置文件:/etc/sudoers
命令格式:sudo 特权命令
#修改/etc/sudoers文件,为lisi用户授予相关脚本的执行权限,允许通过systemct1工具来管理系统服务,修改/etc/sudoers配置文件可以用vim编辑文件,或者使用visudo命令修改
[root@liudaheng ~]# vim /etc/sudoers
[root@liudaheng ~]# visudo (这个可以检测语法错误)
第100行的root开头
root ALL=(ALL) ALL
liudaheng ALL=(root) /bin/systemctl 、、修改即可、、
liudaheng ALL=(root) /bin/systemctl,/user/bin/yum 、、这个是可以执行systemctl和yum、、
liudaheng ALL=(root) /bin/systemctl,/user/bin/yum,!/bin/passwd root 、、这个是可以执行systemctl和yum,叹号和root就表示你不能来修改root的东西、、
解释:授权liudaheng用户以root身份执行systemctl命令

[liudaheng@liudaheng root]$ sudo -l
#用户 liudaheng 可以在 liudaheng 上运行以下命令:# 、、主要是看这条、、
(ALL) ALL 、、解释,这个就表示所有权限都可以、、
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。

[sudo] liudaheng 的密码: 、、然后输入密码就可以了、、
然后就可以执行一些systemctl命令了
[liudaheng@liudaheng root]$ sudo systemctl start httpd

#为sudo机制启用日志记录,以便跟踪sudo执行操作,应该是在配置文件里,没有的话就直接手动添加
Defaults logfile=“/var/ log/sudo. log”
、、添加到提权的下面即可,然后当用户执行命令之后,创建的文件里就会显示他做了哪些操作,文件就是/var/log/sudo.log、、

OpenSSH
OpenSSH开源免费提供ssh远程安全登录的程序
ssh协议端口:22/tcp
服务名:sshd
ssh提供密钥认证登录方式,优先级高于密码
[root@liudaheng ~]# 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:dtoSjso2Oe1ODM92afpHWnZAy/BYrO1RwBw+Eg/Dk1E root@liudaheng
The key’s randomart image is:
±–[RSA 3072]----+
| .=BEo |
| =** . |
| .@+o |
| o.B. |
| . S…o |
| = + *= . |
| oB B=… |
| .=+.+… |
| .o=+… |
±—[SHA256]-----+
[root@liudaheng ~]# ls .ssh (会成功创建私钥和公钥)
id_rsa id_rsa.pub known_hosts
[root@liudaheng ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.100 (将公钥给另一个主机)
然后下次登录就不需要用户名和密码了

scp远程复制工具
scp可以实现主机之间的文件拷贝
#将本地文件拷贝至远程主机
[root@localhost ~]# touch /opt/test.txt
[root@locaThost ~]# scp /opt/test.txt root@192.168.0.27:/opt

#将远程主机文件拉取到本地
[root@localhost ~]# scp root/test.txt root@192.168.0.27:/opt (可以指定存的地方)
[root@locaThost ~]# 1s /opt
fstab test.txt
[root@liudaheng ~]# ssh root@192.168.1.1 ls /opt (直接查看,就不需要切换了)
[root@liudaheng ~]# scp root@192.168.1.1:/root/abc.txt /opt (拉取文件到本地)

提高ssh服务的安全性
配置文件: [root@liudaheng ~]# /etc/ssh/ssh_config.d/
#Port 22 #ssh默认监听端口
#PermitRootLogin yes #是否允许root用户连接,yes允许,no不允许
#PermitEmptyPasswords no #不允许空密码登录
#PasswordAuthentication yes #允许用密码登录
、、下面两个直接写到配置文件里即可、、
#AllowUsers 用户1 用户2 用户3 root(必须的,要不然root也登录不了) #定义账号白名单,配置完后需要重启服务,记得一定要把root也放进去
#Denyusers 用户1 用户2 #定义账号黑名单

文件共享服务FTP介绍
FTP:文件传输协议
FTP是一种在互联网中基于TCP协议端到端的数据传输协议
基于c/s架构,默认使用20,21号端口
端口20(数据端口)用于数据传输
端口21 (命令端口)用于接收客户端发出的相关FTP命令

FTP工作模式
主动模式:FTP客户端从本机的非特殊端口(>1023)连接FTP服务器的命令端口21,服务端通过本地的20号端口主动
向客户端的随机端口发起连接请求,开始传输数据

被动模式:FTP客户端通过向FTP服务器发送PASV命令进入被动模式,FTP服务器会另开一个随机端口,客户

相关推荐

  1. Linux笔记

    2023-12-11 03:32:04       36 阅读
  2. Linux笔记

    2023-12-11 03:32:04       9 阅读
  3. linux笔记

    2023-12-11 03:32:04       9 阅读
  4. linux 线程笔记

    2023-12-11 03:32:04       38 阅读
  5. Linux期末复习笔记

    2023-12-11 03:32:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 03:32:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 03:32:04       18 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 03:32:04       17 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 03:32:04       20 阅读

热门阅读

  1. 腾讯字节常考的linux命令

    2023-12-11 03:32:04       31 阅读
  2. 2023-9-6 笔记 反射

    2023-12-11 03:32:04       51 阅读
  3. 在Redis中设置一个键值对并为其指定过期时间

    2023-12-11 03:32:04       38 阅读
  4. Git的常用命令、场景及其实例

    2023-12-11 03:32:04       40 阅读
  5. C++入门

    C++入门

    2023-12-11 03:32:04      35 阅读
  6. stm32通过编码器控制小车行驶指定的距离

    2023-12-11 03:32:04       41 阅读
  7. Nmap脚本简介

    2023-12-11 03:32:04       36 阅读