Linux学习总结

150 阅读13分钟

Linux

1.Vi和Vim的介绍

  • 所有的Linux系统都会内建vi文本编辑器。
  • vim具有程序编辑的能力,可以看做事vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补全等。

2.Vi和Vim三种常见模式

  • 正常模式

  • 插入模式/编辑模式

  • 命令行模式

  • 相互转换图

    相互转换图

3.Vim的实际操作

  • 拷贝当前一行,在正常模式下输入(n代表拷贝当前行下的n行)yy,并粘粘。
  • 删除当前行 (n同上)dd,删除当前行下的n行 => ndd
  • 在文件中查找某个单词 => 在命令行下 输入 /关键字,输入n就是查找下一个查询的结果。
  • 设置文件的行号,取消文件的行号 => 命令行下 输入:set nu设置行号,set nonu取消行号。
  • 编辑 /etc/profile 文件,使用快捷见到文档的最末行[G]和最首行[gg],这些都是在正常模式下进行的。
  • 在正常模式下输入u,可撤销刚刚输入的内容。
  • 正常模式下输入对应行号的数字,加上shift + g 即可跳转到该行。

4.Linux常见命令

  • shutdown:

    • shutdown -h now:表示立即关机。
    • shutdown -h 1: 表示1分钟后关机。
    • shutdown -r now: 立即重启。
  • halt

    • 直接使用,等价于关机。
  • reboot:

    • 重启系统。
  • sync:

    • 把内存数据同步到磁盘
  • 细节:关机或重启时,都应该执行一下sync指令,将数据同步到磁盘。


Linux实操篇

用户管理

  • 基本介绍:

  • 添加一个用户:

    • useradd lc:添加用户lc到 /home/*下面。
    • useradd -d /home/qq lc:添加用户lc到home/qq/*目录下面。
    • useradd -g 用户组 用户名:增加一个用户,将其添加到组里面去。
  • 给用户指定或者修改密码: passwd username

  • 删除用户:

    • userdel username:删除用户保存目录
    • userdel -r username:删除用户以及对应的主目录: 查询用户:id username => 返回 uid=1001(xm) gid=1001(xm) 组=1001(xm) (当用户不存在时,返回’无此用户‘).
  • 切换用户: su username.

    • 从权限高的用户切换到权限低的用户,不需要输入密码,反之则需要。
    • 当需要返回到原来用户时,使用exit指令。

用户组

  • 类似与角色,系统可以对有共性的多个用户进行统一的管理。

  • groupadd groupname:添加组

  • groupdel groupname:删除组

  • usermod -g 用户组 用户名:将用户修改到对应组。

  • useradd -g 用户组 用户名:将用户添加到对应组。

  • groups:查看当前所属组

  • cat /etc/passwd:查看所有的用户信息

  • cat /etc/group:查看所有组信息

  • 用户与组的相关文件:

    • 用户配置文件(用户信息): /etc/passwd.

      • 用户的配置文件,记录用户的各种信息。
      • 每行的含义: 用户名 密码 用户标识号 组标识号 注释性描述 主目录 登录shell。
    • 组配置文件(组信息): /etc/shadow.

      • 口令的配置文件。
      • 每行的含义: 登录名 加密口令 最后一次修改时间 最小时间间隔 最大时间间隔 警告时间 不活动时间 失效时间 标志
    • 口令配置文件(密码和登录信息): /etc/group.

      • 每组的配置文件,记录Linux包含的组的信息。
      • 每行含义:组名 组标识号 组内用户列表.

实用指令

  • linux系统运行级别的示意图:

  • Linux系统运行级别示意图。

  • 切换到指定运行级别的指令:init number:切换到对应级别

  • 帮助类指令:

    • 当对某个指令不熟悉时,可以使用Linux提供的指令的使用方法。
    • man ls:显示ls指令帮助语句。
    • help cd:改变shell的工作目录。
    • 建议: 之间百度搜索。
  • 文件目录类指令:

    • pwd:显示当前工作目录的绝对路径。

    • ls指令

      • 基本语法:ls[选项] [目录或是文件]

      • 常用选项:

        • -a:表示当前目录所有的文件和目录,包括隐藏的。
        • -l:一列表的方式显示信息。
      • 应用实例:

        • 查看当前目录的所有内容信息。
    • 相对路径与绝对路径: 开头有/表示绝对目录(以根目录为起始点),否则代表相对目录,表示当前目录下。

    • mkdir指令

      • mkdir [选项] 要创建的目录.
      • -p:创建多级目录. mkdir -p /animal/tiger
    • rmdir指令

      • rmdir[选项] 要删除的空目录.只能删除空目录.
      • rm -rf /home/dog:可删除非空的目录.
    • touch指令

      • touch 文件名:创建空文件。
      • rm file:删除文件加上-f代表强制。
    • cat filename:查看文件 。

    • more filename:分页查看文件。

    • less filename: 懒加载文件内容。

    • head filename or tail filename:查看首位位置的文件内容。

    • > and >> :代表覆盖和追加 => hello.txt > pig.txt

      or ls -l > pig.txt:将查到的列表数据覆盖到文件pig当中

      如果没有,则自动创建(touch pig.txt).

    • cp指令:复制文件。cp -r /home /root/:将home目录下的文件拷贝到root目录下.

    • history指令:查看历史指令 后面加上 数字 代表显示多少个。

      输入!number表示执行第number个指令。

    • date指令:

      • date显示日期
      • date "+%Y %m %d" 只显示年月日
      • date "+%Y年%m月%d日 %H:%M:%S"只显示年月日 时分秒
  • 解压与压缩命令:

    • gzip filename or unzip filename:压缩与解压文件。

    • tar 指令:

      • tar -zcvf a.tar.gz dog(file1) tom(file2):解压当前目录的两个文件为a.tar.gz。
      • tar -zcvf a.tar.gz /home:将home目录下的文件解压为a.tar.gz.
      • tar -zxvf a.tar.gz -C(表示更换目录) /opt/:将a.tar.gz解压到opt目录下(该目录需要存在,否则报错).

组管理和权限管理(重难点)

  • 修改文件所有者

    • chown -R 用户名 文件名
  • 修改文件所在组

    • chgrp 组名 文件名
  • 修改用户所在组

    • usermod -g 组名 用户名
    • usermod -d 目录名 用户名:改变用户登录的初始目录。
  • Linux下文件的类型

    • -rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc

      • w:写操作,可读取,ls查看内容(作用到目录)
      • r:读操作,可以修改,目录内创建+删除+重命名目录(作用于目录),可以修改,不可以删除(作用到文件,删除前提是拥有写操作x)
      • x:可执行,可以进入该目录(作用到目录)
    • 第0位:

      • -:普通文件
      • d:目录
      • l:软连接
      • c:字符设备【键盘,鼠标】
      • b:块文件,硬盘
    • 1~3:该文件的所有者拥有该文件的权限 -User

    • 4~6:同用户组的用户拥有的权限 -Group

    • 7~9:确定其他用户拥有该文件的权限 -Other

  • 修改文件或目录的权限(u:所有者 g:所以组 o:其他人 a:所有人(u g o 总和))

    • 通过+ - =变更权限

      • chmod u=rwx,g=rx,o=x 文件目录名
      • chmod o+w 文件目录名
      • chmod a-x 文件目录名
    • 通过数字变更权

      • 规则:r=4, w=2 x=1 rwx=4+2+1=7
      • chmod u=rwx,g=rx,o=x 文件目录名 等于 chmod 751 文件目录名

任务调度

  • 任务调度是指系统在某个时间执行的特定的命令或程序。

  • 分类:1.系统工作,如病毒扫描。2.个别用户工作,个别用户可能希望执行某些程序,比如对mysql数据库的备份。

  • 基本语法:crontab -e

    • cron -e
    • */1 * * * * ls -l /etc >> /tmp/to.txt
    • save and exit
    • automatically excute the order per minutes.
  • 参数细节说明

    • 第一个*:一天当中的第几分钟。
    • 第二:一天当中的第几小时。
    • 三:一个月当中的第几天。
    • 四:一年当中的第几月。
    • 五:一周当中的星期几。
  • 特殊符号的说明:

    • *:代表任何事件,如第一个*代表一个小时中的每分钟都执行的意思。
    • ,:代表不连续的事件。如0 8,12,16 * * *代表在每天8,12,16点整执行一次命令。
    • -:代表连续的时间,如 0 5 * * 1-6:代表周一到周六的凌晨5点整执行命令。
    • */n:代表每隔多久执行一次,比如*/10 * * * *表示每隔10分钟执行一次。

磁盘分区与挂载

  • mbr分区:

    • 最多支持四个主分区
    • 系统只能安装在主分区
    • 拓展分区要占一个主分区
    • MBR最大只支持2TB,但拥有最好的兼容性。
  • gtp分区:

    • 支持无限多个主分区(但操作系统可能限制,比如windows下最多128个分区)。
    • 最大支持18EB的大容量(1EB = 1024PB 1PB = 1024TB)
    • windows7 64位以后支持gtp
  • Linux分区:

    • Linux中万物皆文件,无论有几个分区,分给哪一目录使用,归根结底只有一个更目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。
    • Linux中采用一种叫"载入"的处理方法,他的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这时要载入的一个分区将使它的存储空间在一个目录下获取。
  • 增加一个硬盘:

    1. 虚拟机添加硬盘。

    2. 分区 fdisk /dev/sdb

    3. 格式化 mkfs -r ext4 /dev/sdb1

    4. 挂载 先创建一个 /home/newdisk , 挂载 mount /dev/sdb1 /home/newdisk 卸载umount /dev/sdb1

    5. 设置可以自动挂载(重启后也可以生效)

      • vim /etc/fstab
      • 编辑一行/dev/sdb1 /home/newdisk ext4 default 0 0
  • 查询系统整体磁盘使用情况:

    • df -h(-s指定目录占用大小 -h 带计量单位 -a 含文件 -max-depth=1 子目录深度) -c 列出明细的同时,增加汇总值
    • 统计/home文件夹下文件的个数:ls -l /home | grep "^-" | wc -l
    • 统计/home文件夹下目录的个数:ls -l /home | grep "^d" | wc -l
    • 统计/home文件夹下(包括子文件夹)文件的个数:ls -lR /home | grep "^-" | wc -l(注意R要大写)
    • 统计/home文件夹下(包括子文件夹)目录的个数:ls -lR /home | grep "^-" | wc -l(注意R要大写)
  • 安装指令yum install tree:安装tree指令

网络配置

  • NAT模式(网络环境):

  • Linux网络环境配置

    • 自动获取
    • 指定固定的ip(修改文件) 编辑vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改网关,ip,静态,Browse-only=Yes.

进程管理

  • 在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。

  • 每一个进程,都会对于一个父进程,而这个父进程可以复制多个子进程,例如www服务器。

  • 进程分为前台后台

  • 系统服务以后台一般,且常驻,直到关机。

  • 显示系统执行的进程

    • ps -a:显示当前终端的所有进程信息。
    • ps -u:以用户的格式显示进程信息。
    • ps -x:显示后台进程运行的参数。
  • 终止进程kill和killall

    • kill [选项] 进程号:通过进程号杀死进程(常用选项-9表示强迫进程立即停止)
    • killall 进程名称

服务管理

  • 本质进程,运行在后台,作用监听端口,等待程序请求,又名守护进程

  • [systemctl | service] [start | stop | restart | reload | status] 服务名

  • chkconfig指令可以给各个运行级别设置自启动/关闭

    • systemctl list-unit-files | grep xxx
    • systemctl 服务名 --list
    • systemctl --level 5 服务吗 on/off
  • 进程监控指令

    • top [选项]

      • -d:秒
      • -i:使top不显示任何闲置或者僵死进程
      • -p:通过指定监控进程ID来仅仅监控某个进程的状态。
    • k => Pid.终止指定的进程

    • 交互操作 :

      • P:以CPU使用率排序
      • M:以内存等待使用率排序
      • N:以PID排序
      • q:退出
  • 查看网络情况netstat

    • netstat [选项]

      • -an:按一定顺序排序
      • -p:显示哪个进程在调用
      • netstat -anp | grep sshd:显示sshd相关网络状态
  • RPM与YUM管理

    • RPM

      • rpm -qa | grep tomcat4 查看 tomcat4 是否被安装
      • rpm -ql 软件包查询软件包的安装位置
      • rpm -qf 安装包查询文件属于哪个软件包
      • rpm -e 软件包:卸载软件包 加上--nodeps强制删除
      • rpm -i(安装) | -v(提示) | -h(进度条)| ivh 软件包:安装软件包
    • YUM

      • yum list | grep xx软件列表
      • yum linstall xxx:下载安装

Shell编程

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

    graph 
       应用程序-->Shell命令解释器 --> 内核Linux --> 硬件
    
  • 脚本的常用执行方式

    • 方式一(输入脚本的绝对路径或相对路径)

      • 先创建一个xxx.sh文件,并且赋予其x权限。
      • 执行脚本(./myShell.sh | /root/..../myShell.sh ).
    • 方式二(sh + 脚本) 不用赋予脚本+x权限,直接执行即可。

  • Shell的变量的介绍

    • Linux Shell中的变量分为系统变量用户自定义变量

    • #系统变量
      $HOME,$PWD,$SHELL,$USER 
      echo $HOME
      #显示当前shell中所有变量:
      set
      
    • shell变量的定义

      • 基本语法

        • 定义变量: 变量 = 值
        • 撤销变量:unset 变量
        • 声明静态变量:readonly变量,注意,不能unset
      • 定义变量规则

        • 由字母,数字,下划线,不能以数字开头。
        • 等号两侧不能有空格。
        • 变量名称习惯大写
    • 将命令的返回值赋给变量(重点)

      • A = ls -la 反引号,表示运行里面的命令,并把结果返回给变量A。
      • A=$(ls -la)等价与反引号。
    • 设置环境变量

      • export 变量名=变量值:将shell变量输出为环境变量
      • source 配置文件:让修改后的配置信息立即生效
      • echo $变量名:查询环境变量的值
      • #单行注释
        :<<!多行注释!
        
    • 位置参数变量

      • 编写一个shell脚本postionPara.sh,在脚本中获取到命令行的各个参数信息。

      • 基本语法

        #n为数字,$0代表命令本身,$1~9代表第一到第九个参数,十以上的参数使用${n}
        $n
        #代表命令行所有参数
        $*
        #也代表命令行所有参数,不过$@把每个参数区分对待
        $@
        #代表命令行所有参数的个数
        $#
        
    • 预定义变量

      • 在shell脚本中已经定义好的变量,可以直接使用
      • $$  #显示当前进程的进程好(PID)
        $!  #后台运行的最后一个进程的进程号(PID)
        $?  #最后一次执行的命令的返回状态,如果这个变量的值为0,证明正确执行,否则不正确
        
  • 运算符

    • 1. $((运算式))
         $[运算式]
      2. expr m + n 运算符之间要有空格
      3. expr m - n
      4. expr *,/,% 乘法符号带斜杠表示转义 
      
    • #!/bin/bash
      RESULT1=$(((3+4)*5))
      RESULT2=$[(3+4)*5]
      RESULT3=expr 3 + 4
      RESULT4=expr $RESULT3 /* 5
      #计算两个数之和
      SUM=$[$1+$2]
      echo "sum=$SUM"
      
  • 条件判断

    • [ condition ]:注意前后要有空格。

    • [ shuaijing ] 返回true
      [] 返回false
      [ condition ] && echo OK || ECHO notok 条件满足,执行后面的语句
      
    • 常用判断条件

      #!/bin/bash
      1.两个整数的比较    2.按照文件权限进行判断
      = 字符串比较        -r 有读的权限
      -lt 小于           -w 有写的权限
      -le 大于等于        -x 有执行的权限
      -eq 等于           3.按照文件类型进行判断
      -gt 大于           -f 文件存在并且是一个常规的文件
      -ge 大于等于        -e 文件存在
      -ne 不等于         -d 文件存在并且是一个目录
      
  • 流程控制

    • #!/bin/bash
      if [ 条件判断式 ];
      then 
         程序
      fi
      #或者
      if [ 条件判断式 ]
      then 
         程序
        elif [ 条件判断式 ]
        then 
            程序
      fi
      
      # 编写一个shell程序,>=60,输出及格了,否则输出不及格
      if [ $1 -ge 60 ]
      then 
          echo "及格了"
      else
          echo "不及格"
      
    • #!/bin/bash
      case $变量名 in
      
      case $1 in
      "1")
      echo "周一"
      ;;
      "2")
      echo "周二"
      ;;
      *)
      echo "ohter"
      ;;
      esac
      
    • #基础语法1
      for 变量 in 值1 值2 值3....
       do
         程序
       done
      #基础语法2
      for((初始值;循环控制条件;变量变化))
       do
        程序
       done
      
      #!/bin/bash
      
      # 打印命令行输入的参数 
      for var in $*
      do 
           echo "the number is $i"
      done
      
      # 打印从1到100的值输出显示
      SUM=0
      for ((i=1;i<=100;i++))
      do
             SUM=$[$SUM+$i]
      done
      echo "sum=$SUM"
      
    • #while循环
      while[ 条件表达式 ](左右两边要有空格)
       do
         程序
       done
      
      #打印从1到n的值输出
      #!/bin/bash
      SUM=0
      i=0
      while [ $i -le $1 ]
      do
         SUM=$[$SUM+$i]
         i=$[$i+1]
      done
      echo "sum=$SUM"
      
    • read读取控制台输入

      #
      read [选项][参数]
      选项
      -p:指定读取时的提示符
      -t:指定读取值时等待的时间(秒)如果没有在指定时间输入,则不再等待
      #!/bin/bash
      
      #读取控制台输入一个num值
      
      #read -p "请输入一个数num" NUM1
      
      #读取控制台输入一个num值,在10秒内输入
      
      read -t 10 -p "请输入一个数num2=" NUM2
      echo "你输入的值时num2=$NUM2"
      
  • 函数

    • 系统函数

      • basename [pathname][suffix]

      • basename [string][suffix]

      • 返回/home/aaa/test.txt的"test.txt"部分

        #basename /home/aaa/text.txt
        #输出 text.txt
        #basename /home/aaa/text.txt .txt
        #输出 text 无后缀
        
      • dirname

        • 返回完整路径最后/的前面的部分,常用于返回路径部分

        • dirname 文件绝对uilu

        • 返回/home/aaa/test.txt/home/aaa

          dirname /home/aaa/test.txt

    • 自定义函数

      • #基本语法
        [function] funname[()] {
            Action;
            [return int;]
        }
        调用直接写函数名:funname
        
        #计算输入两个参数的和 getSum
        #!/bin/bash
        function getSum() {
            SUM=$[$n1+$n2]
            echo "和是=$SUM"
        }
        read -p "请输入第一个数n1" n1
        read -p "请输入第二个数n2" n2
        #调用getSum
        getSum $n1 $n2
        
  • 综合案例

    • 每天凌晨2:10备份数据库db
    • 备份开始和结束能够给出相应等待提示信息
    • 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如 2021-10-15_xxxx.tar.gz
    • 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
    #!/bin/bash
    #完成数据库的定时备份
    #备份的路径
    BACKUP=/data/backup/db
    #当前的时间作为文件名
    DATETIME=$(date +%Y_%m_%d_%H%M%S)
    echo "=================开始备份================="
    echo "=================备份的路径是 $BACKUP/$DATETIME.tar/gz"
    #主机
    HOST=localhost
    #用户名
    DB_USER=root
    #密码
    DB_PWD=root
    #备份数据库名
    DATABASE=mysql
    #创建备份的路径
    if [ ! -d "$BACKUP/$DATETIME" ]
    then
        mkdir -p "$BACKUP/$DATETIME   
    fi
    #执行mysql的备份数据库的指令
    mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
    #打包备份文件
    cd $BACKUP
    tar -zcvf $DATETIME.tar.gz $DATETIME
    #删除临时目录
    rm -rf $BACKUP/$DATETIME
    
    #删除10天前的备份文件
    find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} ;
    echo "===============备份成功==============="
    
  • crontab -e

    10 2 * * * /usr/sbin/mysql_db_backup.sh