Linux学习

Lunix学习

[文本](超级连接)【toc]是小写的生成目录

文章目录

P1-P6Lunix起源/安装VM和Centos安装
  • 1.先安装virtual machine 15.5

  • 2.再安装Linux(CentOs7.6/8.1)

  • 3.原理 :主机【windos】包含【VM15.5虚拟机软件】包含【Centos7.6(linux)虚拟机系统】

  • 4.下载好的VM进行安装

    去BOIS里修改设置开启虚拟化设备支持(f2,f10)(自己百度),正式安装(密钥自己找)

  • 5下载centos(迅雷下载很快)

    P006_韩顺平图解Linux全面升级_CentOS7.6安装 35:15
    https://mirrors.163.com/centos

  • 6.正式安装两者:

  • 6.1创建虚拟机(新建-典型-稍后安装系统–REDHATlunix7–分配硬件)

    内存2GB

    处理器(本人母机2CPU8核心,我分配1个处理器4核)

    新CD/DVD(光驱)

    网络适配器(三种选NAT模式)

    USB控制器

    声卡

    打印机

    显示器

  • 6.2安装系统

    虚拟机名字-设置-CD/DVD-使用ISO映像文件

    -找到下载好的centos

  • 7.点击开启虚拟机

    此时出现黑屏,双击鼠标叫install enter

    等待安装出现语言选简体中文

    生产最小安装(学习选界面,xw兼容/程序库,开发工具)

    安装目标位置:我要配置分区

    其实一般把lunix分为3个分区

    boot 引导分区swap交换分区根分区
    1G2G剩下

    设置的情况,+号

    挂载点G文件系统设备类型
    选/boot1ext4标准分区
    选swap2swap标准分区
    选/17ext4标准分区

    配置网络和主机:连接网络,改个主机名(yang01) 开始安装

  • 8.设置root密码,创建用户

    练习方便密码我写的root

    用户tom,密码123456

    此时有两个用户权限低的tom和高的root

    等待安装,然后重启

  • 9.后续配置

    许可证点已接受,点完成配置

    默认权限低的tom,可点击未列出,root用户root密码登录

    汉语-汉语(pingyin)-跳过

    点击引用程序-Firefox-进行网页访问-测试网络

P7-P10虚拟机的基础知识
  • 1.虚拟机的网络连接三种形式说明(p7)

    • 桥连接:Linux可以和其他的系统通信。但是可能造成IP冲突。

    • NAT:网络地址转换方式:Linux可以访问外网,不会造成IP冲突。

    • 主机模式:你的Linux是一个独立的主机,不能访问外网。

  • 2.虚拟机的clone(p8)

    • method1:直接拷贝一份安装好的虚拟机
    • method2:使用VMware提供的克隆操作(克隆时先关闭虚拟机)设置-管理-克隆(完整)
  • 3.虚拟机的快照(p9)

    • 恢复到原来状态(设置-快照-现在状态-可以设置ABC三种快照)
    • 点击A–转到-自动重启后到A的状态
  • 4.虚拟机的迁移(本质文件删除和移除)(P10)

P11-安装VMtools
  • 1.安装VMtools

    • vmtools:(主机和lunix共享文件夹)

      可共享文件夹共享剪贴板

    • 安装步骤:

    有光驱弹出,设置-重新安装Vmtools(如果灰色设置将软盘和DVD驱动改成自动检测,再安装vmtools)

    弹出VMtools-点进去复制文件.gz–到主文件夹-计算机-其他位置-/opt目录-粘贴

    双击桌面-打开终端- cd /opt ---- tar -zxvf VM(按tab都出现)

    输入ls,可以见蓝色目录,进入vm的解压目录,输入cd vmxxxxx-distrib/,输入ls,出现绿色文件夹,输入./绿色文件名,然后一直回车

    注意在SkippIng之后有个小陷阱让你不安装,输入no

    出现 --the VMware team 表示成功( gcc -v命令可以查看是否安装gcc)

    • 测试安装:

    主机D盘新建文件夹Myshare–yang虚拟机-设置-选项

    共享文件夹-添加(D盘地址)–总是启用-确定

    主文件夹-设置-其他-计算机-mnt-hgfs-myshare-hello.txt

    修改myshare里的东西,两者都会有反应。表示成功

    (远程是通过网络,后面讲)

P12-13 Lunix目录结构

**Linux世界里,一切皆文件 ** 树状目录结构

  • /bin:是Binary的缩写,这个目录存放着最经常使用的命令。
  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
  • /home:存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。
  • /lib:系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
  • /etc:所有的系统管理所需要的配置文件和子目录my.conf。
  • /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。
  • /boot:存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。
  • /srv:service的缩写,该目录存放一些服务启动之后需要提供的数据。
  • /sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs。
  • /tmp:这个目录是用来存放一些临时文件的。
  • /dev:类似windows的设备管理器,把所有的硬件用文件的形式存储。
  • /media:linux系统会自动识别一些设备,例如U盘光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容了。
  • /opt:这是给主机额外安装软件所摆放的目录,如安装ORACLE数据库就可放到该目录下。默认为空。
  • /usr/local:这是另一个给主机额外安装软件所安装的目录,一般是通过编译源码的方式安装的程序。
  • /var:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件。
  • /selinux:SELinux是一种安全子系统,它能控制程序只能访问特定文件。

总结:

  1. Linux的目录中有且只有一个根目录。
  2. Linux的各个目录存放的内容是规划好,不用乱放文件。
  3. Linux是以文件的形式管理我们的设备,因此linux系统,一切皆为文件。
  4. Linux的各个文件目录下存放什么内容,必须有一个认识。
P14-P16远程登录Lunix和传输文件
  • 远程登录:XShell5(强大的终端模拟软件)
  • 下载地址

1.首先虚拟机终端输入ifconfig 获得inet 192.168.8.129(ip地址)

2.母机cmd输入ping ip 测试网络

3.打开xshell-会话弹出-新建-(名称随便/主机:lunix的ip /协议ssh) 确定-关闭-双击左边对话-未出现主机密钥-接受并保存

4.输入用户名,密码,进入页面,就和VM终端上一样操作系统/

  • 远程上传下载文件:Xftp5

傻瓜式安装,新建-对话-和上个类似,注意协议是sstp

如果出现乱码-对话-属性-选项-utf-8编码

然后就可以自由传输文件

P16-P18vi和vm
  • 三种常见模式:

    • 正常模式

      在正常模式下,我们可以使用快捷键。

    • 插入模式/编辑模式

      在这个模式下,输入字母(i)才可以进入编辑模式

    • 命令行模式

      在这个模式中,可以提供相关指令。

演示在xshell注意在root@–下:vim Hello.java(创建一个java文件),然后输入i进入编辑模式,输入代码,写完代码

输入esc(退出)-输入: 然后输入wq (写入退出)

各种模式的转化:

img

  • 快捷键使用练习:
    • yy 拷贝当前行(注意在一般模式下,再输入p就是粘贴)
    • 5yy 拷贝当前5行
    • dd 删除当前行
    • 5dd 删除当前行向下的5行
    • 在文件中查找某个单词:命令行输入 /(查找内容),按n查找下一个
    • 设置文件行号输入 :set nu,取消文件行号输入 :set nonu
    • 编辑文件,一般模式下使用快捷键到达文档最末行 G,最首行 gg
    • 撤销输入:在正常模式下输入u
    • 编辑文件,光标移动到某行 shift+g(一般模式下)
      • 显示行号:set nu
      • 输入行号这个数
      • 输入shift+g
P19-P20关机和重启命令
  • shutdown -h now:表示立即关机
  • shutdown -h 1:表示1分钟后关机
  • shutdown -r now:立即重启
  • halt:直接使用,关机
  • reboot:重启
  • sync:把内存的数据同步到磁盘上,当我们关机或者重启时,都应该先执行一下sync,防止数据丢失
  • logout:注销用户,在图形运行级别无效,在运行级别3有效

执行可以在虚拟机终端也可以在xshell

可以先用普通用户登录 再 su - 用户名 命令切换管理员

切换用户登录x-shell的时候ssh连接不上的问题,解决是防火墙问题(

*输入* systemctl status firewalld.service 查看防火墙是否关闭 出现active(running)绿色

输入 systemctl stop firewalld.service 关闭防火墙

输入 systemctl disable firewalld.service 将防火墙设置开机不自启动

现在尝试xshell是否能连接虚拟机,如果还是不行则可能是第二种情况。)

修改了一下tom的密码[Ej0b0BWikip)

登录到tom之后权限不够想切换到root 输入su - root 在输入密码

输入logout可以切换回tom(在shell里面)

P21-24用户管理

用户,组,家目录。

  1. Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
  2. Linux的用户需要至少要属于一个组。
  • 添加用户:useradd 用户名。/比如useradd milan 会在/home/milian下自动生成米兰文件夹

  • cd:表示change directory,切换目录。

  • 当创建用户成功后,会自动的创建和用户同名的家目录。

  • 也可以通过useradd -d 指定目录 新的用户名。

    useradd -d /home/test king

    在home下位king用户的家目录是test

    pwd 可以查看当前的位置

  • 指定/修改密码:passwd 用户名

  • 删除用户,保留家目录:userdel 用户名,一般保留家目录,因为干过的活要留着

  • 删除用户以及家目录:userdel -r 用户名

  • 查询用户信息:id 用户名

  • 切换用户:su - 切换用户名,从权限高切换到权限低的用户不需要输密码

  • 返回切换前的用户:exit

  • 查看当前用户/登录用户:who am i


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

  • 增加组:groupadd 组名

  • 删除组:groupdel 组名

  • 增加用户时直接加上组:useradd -g 用户组 用户名

    groupadd wd

    useradd -g wd zwj

    groupadd mj

    usermod -g mj zwj

  • 修改用户组:usermod -g 用户组 用户名

  1. /etc/passwd 文件
  • 用户(user)的配置文件,记录用户的各种信息。
  • 每行的含义:用户名:口令:用户标识号:注释性描述:主目录:登录shell
  1. /etc/shadow 文件
  • 口令配置文件
  • 每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
  1. /etc/group 文件
  • 组(group)的配置文件,记录Linux包含的组的信息。
  • 每行含义:组名:口令:组标识号:组内用户列表
P25-26-27使用指令/帮助指令

实用指令

  • 指定运行级别(7个级别)

    0 关机

    1.单用户【找回丢失密码】

    2.多用户状态没有网络服务

    3.多用户状态有网络服务

    4系统未使用保留给用户

    5.图形界面

    6.系统重启

  • 系统的运行级别配置文件:/etc/inittab

    img

    查看级别systemctl get-default

    设置级别 systemctl set-default graphical.target(图形界面5)

    multi-user.target 是3

  • 切换到指定运行级别的指令:init [012356]

    面试题:如何找回丢失的root密码?

    进入到单用户模式,然后修改root密码。因为进入单用户模式,root不需要密码就可以登录。【开机->在引导时输入 回车键->看到一个界面输入 e->看到一个新的界面,选中第二行(编辑内核),再输入 e->在这行最后输入 1,再输入 回车键->再输入b,这时就会进入到单用户模式,使用passed来修改root密码。】

    【开机->在引导时输入 回车键->看到一个界面输入 e->看到一个新的界面,找到lunix16开头的行数在utf-8后面输入init=/bin/sh,再输入control+x进入单用户模式,在光标闪烁位置输入mount -o- remount,rw / 输入enter

    在新的一行输入passwd,输入新密码,然后enter,确认,成功后出现passwd

    在光标闪烁的地方输入 exec /sbin/init,输入enter,就成功了,完成后系统自动重庆

    • 帮助指令:
      • man [命令或配置文件] 比如ls main
      • (ls -a 显示全部 ls -l 单例 ls -al 组合使用可)
      • help 命令(获得shell内置命令的帮助信息)
P27-P33文件目录指令
  • 文件目录类

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

    • ls:-a:显示当前目录所有的文件和目录,包括隐藏的;-l:以列表的方式显示信息。

    • cd:cd ~:回到自己的家目录;cd …:回到当前目录的上一级目录。(比如我是root 回到/rooot)

    • mkdir:创建目录;-p:创建多级目录。

      mkdir /home/dog (home存在)

      mkdir -p /home/animal/tiger

    • rmdir:删除空目录。rmdir不能删除非空的目录。如果需要删除非空的目录,需要使用rm -rf。

      rmdir /home/dog入门

      rm -rf /home/animal/

    • touch:创建空文件。可以一次性创建多个文件

      touch hello.txt

    • cp:拷贝文件到指定目录;-r:递归复制整个文件夹。强制覆盖不提示的方法:cp命令改为\cp

      将/home/hello/txt拷贝到/home/bbb 目录下

      cp hello.txt bbb/

      cp -r /home/bbb/ /test/

    • rm:移除文件或目录;-r:递归删除整个文件夹;-f:强制删除不提示。

      rm /home/hello.txt

      rm -r /hone/bbb

      rm -rf /hone/bbb

    • mv:移动文件与目录或重命名,两种功能!

      同目录下改名

      mv cat.txt dog.txt(mv 旧目录名 新目录名)

      不同目录剪切

      mv hello.txt /home/test

      两者可以结合移动并且重命名

    • cat:查看文件内容。只能浏览文件,而不能修改文件。-n:显示行号。结尾加上 | more:分页显示,不会全部一下显示完。(输入空格可以一起显示完)

      cat -n /etc/profile

      管道命令|more 类似交给下个指令处理

    • more:是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more还内置了很多快捷键:(交互指令)

      操作功能说明
      空白键(Space)向下翻一页
      Enter向下翻一行
      q立刻离开more,不再显示该文件内容
      Ctrl + F向下滚动一屏
      Ctrl + B返回上一屏
      =输出当前行的行号
      :f输出文件名和当前行的行号
    • less:用来分屏查看文件内容,与more相似,但是更强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容。对于显示大型文件具有较高的效率。

      /字符串 向下搜索字符功能 n向下N向上

      ? 字符串 向上 nN相反

    • >指令:输出重定向。如果不存在会创建文件,否则会将原来的文件内容覆盖。

      echo “hello” > mytext.txt 将hello移入mytext

    • >>指令:追加。如果不存在会创建文件,否则不会覆盖原来的文件内容,而是追加到文件的尾部。

    • cat是查看,echo是写入,echo (内容) >> 文件

    ls -l > 文件列表内容写入a.txt文件中覆盖

    ls-al >> 文件列表内容写入a.txt文件中末尾

    cat 文件1>文件2 文件1内容覆盖文件2

    echo “内容”>> 文件2 追加

    • cal:显示当前月日历。

    • echo:输出内容到控制台。

      echo $HOSTNAME 可以输出主机名

      echo “helloworld” 输出heloworld

    • head:显示文件的开头部分。-n 5:看前面5行内容。

      head -n 5 /etc/profile

    • tail:输出文件中尾部的内容。-n 5:看后面5行内容。-f:时事追踪该文档的所有更新

      tail -f 文件 监控文件

    • ln 软连接

      ln -s /root /home/myroot 这个myroot指向/root

      这个时候cd /myroot 然后ls 出现root下面的…

      删除 rm /home/myroot

    • history 查看已经执行过的或者也可以执行命令

      history 执行过的所有命令

      history 10 显示最近10条指令

      !127 执行历史编号位127的指令

P34data指令P35-P37搜索查找指令
  • 时间日期类

    • date:显示当前日期和时间
    • date “+%Y”:显示当前年份
    • date “+%d”:显示当前月份
    • date “+%Y-%m-%d %H:%M:%S”:显示年-月-日 时:分:秒
    • 设置日期:date -s 字符串时间
    • cal:查看日历指令;cal 年份:显示某一年一整年的日历

    date “+%Y-%m-%d %H:%M:%S”

    date -s “2022-7-3 11:11:00” 设置系统当前时间

    cal 2020 显示2020年的日期

  • 搜索查找类

    • find:从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端。

      • find (搜索范围) -name (文件名):按照指定的文件名查找模式查找文件。

        查找/home下的hello.txt文件

        find /home -name hello.txt

      • find (搜索范围) -user (用户名):按照指定的用户名查找模式查找文件。

        查找/opt下的用户名位nobody的文件

        find /opm -user nobody

      • find (搜索范围) -size (+多少/-多少/多少):按照指定的文件大小查找模式查找文件(大于多少/小于多少/等于多少)

        find / size +200M find / size -200M

      • 查询 /目录下所有.txt的文件:find / -name *.txt

    • locate:locate (搜索文件)

      • 可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻。
      • 在第一次运行之前,必须使用updatedb指令创建locate数据库。

      updatedb
      locate hello.txt

    • grep:过滤查找,表示将前一个命令的处理结果输出传递给后面的命令处理。经常跟管道一起使用。

      管道符“|",表示将前一个命令的处理结果传递给后面命令处理

      • grep [选项] 查找内容 源文件
      • -n:显示匹配行及行号。
      • -i:忽略大小写字母。
      • cat hello.txt | grep yes
      • cat hello.txt |grep -n “yes”
P37-P38压缩和解压

压缩和解压类

  • gzip/gunzip:压缩文件/解压

    • gzip (文件):压缩为.gz文件,原来文件不保留。
    • gunzip (文件):解压缩,同样也不保留源文件。
  • zip/unzip:压缩文件/解压

    • zip [选项] (压缩后文件xxx.zip) (将要压缩的文件)

    • unzip [选项] (要解压的文件xxx.zip)

    • zip -r:递归压缩,即压缩目录

      将home目录以及包含的文件和子文件夹都压缩要不要*不影响

      将/home/下的文件压缩成myhome.zip

      zip -r myhome .zip /home/

      把myhome.zip解压到/opt/tmp下

      unzip -d /opt/tmp myhome.zip

      将myhome.tar.gz解压到/opt/tmp2

    • unzip -d (目录):指定解压后的文件的存放目录

  • tar:打包指令,最后打包后的文件是.tar.gz的文件

    • tar [选项] xxx.tar.gz (打包的内容)
    • -c:产生.tar打包文件
    • -v:显示详细信息
    • -f:指定压缩后的文件名
    • -z:打包同时压缩
    • -x:解压.tar文件

    tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

    将pig.txt和cat.txt一起压缩到pc.tar.gz 注意被压缩的两个文件夹有空格

    tar -zxvf pc.tar.gz 解压

    • 压缩:tar -zcvf (压缩后文件名) (要压缩的文件)
    • 解压:tar -zxvf (要解压的文件)
    • 解压到指定目录:tar -zxvf (要解压的文件) -C (指定目录),指定解压到的目录要存在。
P40linux组管理

组管理和权限管理

  • 文件:

    1. 所有者
    2. 所在组
    3. 其他组
    4. 改变用户所在组
  • 文件/目录所有者:

    • 一般为文件的创建者,谁创建了该文件,就自然的称为该文件的所有者。(但是可以后期修改)

    • 查看文件所有者:ls -ahl

    • 修改文件所有者:chown (用户名) (文件名)

      chown zwj appple.txt (zwj是新的所有者)

    • 文件所在组不一定是文件所有者。

  • 组的创建

    • groupadd (组名)

      groupadd animals

      useradd -g animals dog

      usermod -g mj zwj

  • 文件/目录所在组

    • 修改文件所在组:chgrp (组名) (文件名)

    chgrp fruit ban.txt

  • 其他组

    • 除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组
  • 改变用户所在组

    • 在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组

    • 改变用户所在组:usermod -g 新组名 用户名

    • 改变用户登录的初始目录:usermod -d 目录名 用户名

      -d需要有权限

P41权限管理P46修改权限

权限的基本介绍

  • 文件类型:

    drwx------. 5 milan milan 4.0K 10月 11 00:02 milan

    -rw-r–r–. 1 root root 272 10月 11 16:47 info.txt

    lrwxrwxrwx. 1 root root 5 10月 11 21:58 myroot -> /root(ln -s /root myroo)

    0-9位的说明,第0位确定文件类型

    • -:普通类型
    • d:目录
    • l:软连接
    • c:字符设备【键盘、鼠标等】
    • b:块文件【硬盘】

    第1-3位确定所有者(该文件的所有者)拥有该文件的权限。— User

    第4-6位确定所属组(同用户组的)拥有该文件的权限。— Group

    第7-9位确定其他有用所拥有该文件的权限—Other

  • ls -l 显示内容说明:

    • rw-:表示文件所有者权限(rw,读写)
    • r–:表示文件所在组的用户的权限(r,只有读的权限)
    • r–:表示文件其他组的用户的权限(r,只有读的权限)
    • 1:如果是文件,表示硬连接的数;如果是目录则表示该目录的子目录个数
    • tom:文件所有者
    • bandit:文件所在组
    • 0:文件的大小,0个字节;如果是目录,则统一为4096
    • July 1 13:40:文件最后的修改时间
    • ok.txt:文件名
  • rwx权限详解

    • rwx作用到文件:

      • r:read,可读。读取查看。
      • w:write,可以修改。但不代表可以删除该文件。删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。
      • x:execute,可执行。可以被执行。
    • rwx作用到目录:

      • r:可以读取,ls查看目录内容。
      • w:可以修改,目录内创建+删除+重命名目录。
      • x:可执行,可以进入该目录。

      -rw-r–r–. 1 root fruit 0 10月 11 21:32 ban.txt

      数字1:文件:因链接数或 目录:字目录数

      root 用户

      fruit 组

      0 文件大小(字节)

      10月 11 21:32 最后的修改日期

      ban 文件名

  • 修改权限 chmod

    • 修改文件或者目录的权限
    • 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 文件目录名
  • 修改文件所有者 chown

    • chown newowner file:改变文件的所有者

      chown tom /home/abc.txt

    • chown newowner:newgroup file:改变用户的所有者和所在组

      将所有文件的都修改是递归

      chown -R tom king组 /home/test

    • -R:如果是目录,则使其下所有子文件或目录递归生效

  • 修改文件所在组 chgrp

    • chgrp newgroup file:改变文件的所有组

    • -R:如果是目录,则使其下所有子文件或目录递归生效

      chgrp shaolin /home/text/zwj .txt 将zwj改为shaolin组

      chgrp -R shaolin /home/text 将文件递归改为shaolin组

      练习

      groupadd police

      useradd -g police jerry

      chmod 640 jack1.txt (修改所有者rw 本组r 其他0 )
      ll 显示现在 的 ls -ash(全部)

      usermod -g police xh(root权限)

P52crond任务调动
  • 任务调度(在某个时间执行特定的某个命令)

  • crond任务调度:crontab进行定时任务调度

    • crontab [选项]
    • -e:编辑crontab定时任务
    • -i:查询crontab任务
    • -r:删除当前用户所有的crontab任务
    • -l:列出当前有哪些任务调度
    • service crond restart:重启任务调度
    • 当保存退出后就生效了
    • 参数细节说明
    项目含义范围
    第一个“*”一小时当中的第几分钟0-59
    第二个“*”一天当中的第几小时0-23
    第三个“*”一个月当中的第几天1-31
    第四个“*”一年当中的第几月1-12
    第五个“*”一周当中的星期几0-7(0和7都代表星期日)

    crontab -e

    输入i 输入*/1 * * * * ls -l /etc/ >/tep/to.txt

    按est 输入:wq

    然后输入cd /tep 输入ll 观察to.txt文件

  • 特殊符号说明

    • *:代表任何时间。比如第一个*就代表一小时中每分钟都执行一次的意思。

    • ,:代表不连续的时间。比如“0 8,12,16 * * *命令”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令。

    • -:代表连续的时间范围。比如“0 5 * * 1-6命令”,代表在周一到周六的凌晨5点0分执行命令。

    • /n:代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔10分钟就执行一遍命令。

      分时天月星

      实例1

      crontab -e

      输入*/1 * * * * date >> /temp/mydate(隔1追加日期到xx)

      实例2

      vim my.shell

      输入date >> /home/mycal cal >> /home/mycal

      chmod u+x my.shell

      ./my.shell(运行)

      cat mycal (发现出现cal里面是date和cal)

      crontab -e

      输入*/1 * * * * /home/my.shell

      (三种模式的切换没有写)

      实例3

      crontab -e

      0 2 * * * mysqldump -u -root -proot testdb > /home/db.bak

      (将Mysql数据库tetsdb2:00自动拷贝)

      步骤 写脚本 赋权限 设置调度

      crontab -r 终止任务调度
      crontab -l 列出当前任务调度
      service crond restart 重启任务调度

P55at定时任务

at命令是一次性任务,守护进程atd会后台模式运行检查作业队列来运行,默认情况下atd没60s检查作业队列,如果时间与当前时间匹配,则运行

ps -ef 查看所有运行的进程

ps -ef | grep atd 只检查atd的运行

at [选项] [时间]

ctrl+D结束at命令的输入

选项含义
-m指定用户完成给用户发右键
-Iatq的别名
-datrm的别名
-v显示任务被执行的时间
-c打印任务内容到标准输出
-V显示版本输出
-q <队列>显示指定队列
-t <时间参数>以时间参数的形式提交要运行的任务
-f <文件>从指定文件读入而部署从标准输入读入

at的时间指定

当天 hh:mm 如果过了是第二天,12小时加am /pn ,具体时间

04:00 2022-03-06,相对计时 now+5 minutes,或者today

实例

at 5pm+2 days 按动enter出现at>

输入 /bin/ls/home 输入2次的ctrl+D

atq 可以查看所有任务

删除编号为1的任务

atrm 1

也可以执行脚本输入的时候改成 /root/my.shell

P58P59磁盘分区机制P6061磁盘指令使用

Linux磁盘分区、挂载

输入lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 17G 0 part /
└─sda3 8:3 0 2G 0 part [SWAP]
sr0 11:0 1 1024M 0 rom

img

  • 分区的方式

    • mbr分区
      • 最多支持四个主分区
      • 系统只能安装在主分区
      • 扩展分区要占一个主分区
      • MBR最大只支持2TB,但拥有最好的兼容性
    • gpt分区
      • 支持无限多个主分区(但操作系统可能限制,比如windows下最多128个分区)
      • 最大支持18EB的大容量(1EB=1024PB,PB=1024TB)
      • windows7 64位以后支持gpt
  • Linux分区

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

    • Linux硬盘分IDE硬盘和SCSI硬盘,目前基本上是SCSI硬盘

      IDE标识符“hdx~" hd分区所在设备类型 x为盘号(a基本盘。b基本从属盘 c 辅助 d) ~代表分区(1-4表示主分区和扩展分区) hdb2

      sdx~ 同理

    • lsblk -f:查看当前系统的分区和挂载情况。(list block)

      lsbllk 表示全

    增加磁盘

  • 挂载的经典案例

    • 需求是给我们的Linux系统增加一个新的硬盘,并且挂载到/home/newdisk
    1. 虚拟机添加硬盘

      (在vm做然后reboot,lsblk显示所有,显示为sdb)

    2. 分区:fdsk /dev/sdb

      m 显示命令列表

      p 显示磁盘分区 同fdisk -l

      n 新增分区

      d 删除分区

      w 写入并退出

      开始分区后输入n,新增分区,然后选择p,分区类型为主分区。两次回车默认剩余全部空间。最后写入w写入分区并退出,若不保存退出输入q

      fdisk -f显示所有信息

    3. 格式化:mkfs -t ext4 /dev/sdb1

      其中ext4是分区类型 /dev/sdb是磁盘名

    4. 挂载:新建目录:mkdir /home/newdisk;挂载:mount /dev/sdb1 /home/newdisk

      mount /dev/sdb1 /home/newdisls/

      这个时候在newdisls创建文件存储在新磁盘中

    5. 设置可以自动挂载(永久挂载):重启系统后,仍然可以挂载。vim etc/fstab 增加挂载信息。mount -a:生效

    • 取消挂载:unmount /dev/sdb1

      用命令行挂载的,重启后就消失了,是临时

      永久挂载 通过修改/etc/fstab实现挂载

      (UUID可以用/dev/sdb1代替)

      添加完成后执行mount -a即刻生效

  • 磁盘情况查询:df -h / df -l

  • 查询指定目录的磁盘占用情况:du -h /目录,默认为当前目录

    • -s:指定目录占用大小汇总

    • -h:带计量单位

    • -a:含文件

    • –max-depth=1:子目录深度

    • -c:列出明细的同时,增加汇总值

      du -h --max-depth=1 /opt

      du -ha --max-depth=1 /opt

      du -hac --max-depth=1 /opt

  • 磁盘情况-工作实用指令

    ls -l /opt 显示/opt下所有文件目录

    1. 统计/home文件夹下文件的个数:ls -l /home | grep "^-" | wc -l 以“-"开头的

    2. 统计/home文件夹下目录的个数:ls -l /home | grep "^d" | wc -l

    3. 统计/home文件夹下文件的个数,包括子文件夹里的:ls -lR /home | grep "^-" | wc -l

      R代表递归

    4. 统计文件夹下目录的个数,包括子文件夹里的:ls -lR /home | grep "^d" | wc -l

    5. 以树状显示目录结构:首先安装tree指令:yum install tree,tree 目录

P63网络配置P64网络配置指令

ifconfig查看虚拟机ip地址inet 192.168.8.130(131)

主机ipconfig VMnet 192.168.8.1 (2.1)

主机:ping 192.168.8.130 可以通

无线网卡 192.168.73.186 (101.8) 和外网通信的

教授局域网 存在网关

lunix>主机vmnet>无线网卡>网关>外网

虚拟机编辑-虚拟网络适配器-Vnet8

windos下查看ipconfig

lunix 查看ifconfig

ping 网址 测试两者之间的连接

lunix网络环境的配置

第一种自动获取(variable)

应用程序-系统工具-设置-网络

第二种设置ip

  • 指定固定IP:直接修改配置文件来指定IP,并可以连接到外网,编辑:vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=“Ethernet”
PROXY_METHOD=“none”
BROWSER_ONLY=“no”
BOOTPROTO=“dhcp” 自动分配改为"static"
DEFROUTE=“yes”
IPV4_FAILURE_FATAL=“no”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
IPV6_DEFROUTE=“yes”
IPV6_FAILURE_FATAL=“no”
IPV6_ADDR_GEN_MODE=“stable-privacy”
NAME=“ens33”
UUID=“fed666fc-de2f-4081-a020-3596e82c1e10”
DEVICE=“ens33”
ONBOOT=“yes”

#增加IP地址

IPADDR=192.168.200.130

#网关

GATEWAY=192.168.200.2

#域名解析器

DNS1=192.168.200.2

最后将vmnet8(在虚拟机的设置-NAT设置网关-改为192.168.200.2)

最后重启网络服务

  • 重启网络服务:service network restart

img

P66设置主机名和host映射

hostname 查看主机名

修改 vim /etc/hostname

重启reboot

通过主机名找到lunix系统

在windos下

在C:\Windows\System32\drivers\etc\hosts文件

写入 192.168.8.130 yangvm01

ping yangvm01

在lunix

在/etc/hosts修改,然后ping 名字(类似)

主机名解析过程

hosts:一个文本文件,用来记录ip和hostname之间的映射关系

DNS:Domain Name System 域名系统(互联网上作为域名和ip地址相互映射的一个分布式数据库)

主机名解析机制分析

输入www.baidu

1.浏览器先检查缓存中是否有域名解析ip地址,有就先调用,没有就调用DNS解析器缓存,无就hosts ,无就公网

2一般第一次访问某个网站的时候,会缓存这些

dns域名解析缓存 ipconfig /displaydns

手动清理dns缓存 ipconfig /flushdns

P68进程管理P70父子进程P71终止进程P72pstree指令
  • 在Linux中,每个执行的**程序(代码)**都称为一个进程。每个进程都分配一个ID号

    程序加载到内存-就是进程

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

  • 每个进程都可能以两种方式存在。

    前台和后台

    • 前台进程:用户目前的屏幕上可以进行操作的。
    • 后台进程:实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
  • 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

  • 显示系统执行的进程

    • ps:查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数。PID:进程识别号;TTY:终端机号;TIME:此进程所消耗的CPU时间;CMD:正在执行的命令或进程名

    • ps -a:显示当前终端的所有进程信息。

    • ps -u:以用户的格式显示进程信息。

    • ps -x:显示后台进程运行的参数。

    • ps -axu | grep xxx:过滤得到xxx的信息。

      USER PID %CPU %MEM(占物理内存百分比) VSZ(占虚拟内存情况) RSS (占物理内存情况)TTY STAT(进程状态Z僵死) START TIME COMMAND(启用进程所用的命令或者参数)
      root 2 0.0 0.0 0 0 ? S 10月12 0:00 [kthreadd]

      ps -axu | grep sshd

    • ps -ef:以全格式显示当前所有的进程,查看进程的父进程。

      ps -ef | grep sshd

      ps -ef | more
      UID PID PPID C STIME TTY TIME CMD
      root 1 0 0 10月12 ? 00:00:02 /usr/lib/syst

      PPID=0,可以认为是开机就启动的进程

    • -e:显示所有进程。

    • -f:全格式。

  • 终止进程

    • kill [选项] 进程号:通过进程号杀死进程

    • killall 进程名称:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用

      如果用killall 所有的子进程也会kill

    • -9:表示强迫进程立刻停止

    • 案例1:踢掉非法用户:kill 进程号

    • 案例2:终止远程登录服务sshd,在适当时候再次重启sshd服务

      kill sshd对应的端口

      /bin/systemctl start sshd.service

    • 案例3:终止多个gedit编辑器:killall 进程名称

      比如打开多个文件,后面是gedit

      可以直接

      kill gedit

    • 案例4:强制杀掉一个终端:kill -9 进程号

  • 查看进程树:pstree [选项]

    • -p:显示进程的PID
    • -u:显示进程的所属用户
P73-P75服务管理

service本质就是进程,但是在后台运行,通常会监听某个端口,等待其他进程,比如mysql,所有我们称守护进程

  • 服务(service)管理

    • service管理指令:service 服务名 [start | stop | restart | reload | status]

    • 在CentOS7.0之后,不再使用service,而是systemctl

      可以用ls -l /etc/init.d/ 查看

    • 查看防火墙情况:

      • service iptables status
      • systemctl status firewalld(7.0之后的版本)
    • 测试某个端口是否在监听:telnet

    • 查看服务名:

      • 方式1:使用setup->系统服务就可以看到

        可以看到前有*就是可以自启

      • 方式2:/etc/init.d/服务名称

    • 服务的运行级别(runlevel):

      • 查看或修改默认级别:vim /etc/inittab

        级别3:完全多用户有NFS,无界面进入命令行模式

        级别5:x11控制台,进入图形gui

        开机流程

        开机>BIOS>/boot >systemd进程1>运行级别>运行级对应的服务

      • 每个服务对应的每个运行级别都可以设置

        multi-user.target: analogous to runlevel 3

        graphical.target: analogous to runlevel 5

        #To view current default target, run:

        systemctl get-default

        #To set a default target, run:

        systemctl set-default TARGET.target

    • 如果不小心将默认的运行级别设置成0或者6,怎么处理?

      • 进入单用户模式(级别1,root权限用于系统维护,禁止远程登录)修改成正常的即可。
    • chkconfig:可以给每个服务的各个运行级别设置自启动/关闭

      某个服务在某个级别的自启动/关闭

      chkconfig --list 查看

    • 查看xxx服务:chkconfig –list | grep xxx

    • 查看服务的状态:chkconfig 服务名 --list

    • 给服务的运行级别设置自启动:chkconfig – level 5 服务名 on/off

      chkconfig – level 5 network off

    • 要所有运行级别关闭或开启:chkconfig 服务名 on/off

P76-77systemctl指令管理

systemctl管理指令:

1.语法systemctl 服务名 [start | stop | restart | reload | status]

2.查看指令服务 ls -l /usr/lib/systemd/system

3.设置服务的自启动

systemctl list-unit-files

systemctl enable 服务名 (设置服务开机启动

systemctl disable 服务名 (关闭服务开机启动

systemctl is-enable 服务名 (查看服务是否自启动

查看防火墙情况:

  • service iptables status
  • systemctl status firewalld(7.0之后的版本)
  • ls -l /usr/lib/systemd/system | grep fire 查看防火墙
  • firewalld.service 防火墙的服务名

firwall指令

firewall-cmd --list-port 查询所有的端口

(1)	打开端口: firewall-cmd --permanent --add-port=端口号/协议

通过 netstat -anp | more 指令查看端口号的协议 (more 分页显示)
该指令输出的信息中:
	Local Address下是 ip地址:端口号
	Proto 是协议   (protocol 协议)

(2)	关闭端口: firewall-cmd --permanent --remove-port=端口号/协议

注意:无论是打开端口还是关闭端口,要重新载入才能生效
重新载入:firewall-cmd --reload

(3) 查询端口是否开放: firewall-cmd --query-port=端口/协议



应用案例:
(1)	启用防火墙,测试 111 端口是否能 telnet (远程登录) 不行
	在本地主机DOS命令窗口输入:telnet Linux虚拟机ip地址:端口号
	测试本地主机能否访问虚拟机的111端口
	telnet 192.168.200.130 111

	防火墙打开+端口关闭--->不可以访问端口

(2)	开放 111 端口
	firewall-cmd --permanent --add-port=111/tcp ;
	需要 firewall-cmd --reload

	防火墙打开+端口打开--->可以访问端口

(3)	再次关闭 111 端口
	firewall-cmd --permanent --remove-port=111/tcp 
	需要 firewall-cmd --reload
P78动态监控系统
  • 动态监控进程

    • top [选项]

      top - 12:45:10(此刻) up 14:12(运行时间), 5 users, load average: 0.01, 0.02, 0.0(三折平均数小于0.07表示负载均衡)
      Tasks: 362 total, 1 running, 361 sleeping, 0 stopped, 0 zom
      %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id(空闲), 0.0 wa, 0.0 hi, 0
      KiB Mem : 2027896 total, 76596 free, 1434636 used, 516664
      KiB Swap: 2097148 total, 2073844 free, 23304 used. 410408

    • top和ps命令很相似。它们都用来显示正在执行的进程。top和ps最大的不同之处在于top在执行一段时间可以更新正在运行的进程。

    • -d 秒数:指定top命令每隔几秒更新。默认是3秒。

    • -i:使top不显示任何闲置或者僵死进程。

    • -p:通过指定监控进程ID来仅仅监控某个进程的状态。

    • 案例1:监控特定用户:top查看进程;u输入用户名。

    • 案例2:终止指定的进程:top查看进程;k输入要结束的进程。

    • 案例3:指定系统状态更新的时间(每隔10秒自动更新,默认是3秒):top -d 10

    • 交互操作说明:输入top之后在top界面

      • P:以CPU使用率排序,默认就是此项
      • M:以内存的使用率排序
      • N:以PID排序
      • q:退出top
  • 监控网络状态

    • netstat [选项]

    • -an:按一定顺序排列输出

      Proto(协议) Recv-Q Send-Q Local Address (linux内部地址) Foreign Address (外部地址)
      State

      listen 监听 establish连接

    • -p:显示哪个进程在调用

P82RPM管理

RPM

  • RPM:RedHat Package Manager,红帽软件包管理工具。

    生成扩展名的.RPM文件,类似setup.ext

  • RPM查询已安装的rpm列表:rpm -qa | grep xx

  • rpm包的其它查询指令:

    • rpm -qa:查询所安装的所有rpm软件包

      rpm -qa | grep firefox

      返回软件名firefox-68.10.0-1(版本号).el7.centos.x86_64

    • rpm -qa | more

    • rpm -qa | grep xx

    • rpm -q xx:查询xx软件包是否安装

    • rpm -qi xx:查询软件包信息

    • rpm -ql xx:查询软件包中的文件

    • rpm -qf 文件全路径名:查询文件所属的软件包

  • 卸载rpm包:rpm -e 软件包名称

  • 删除时可能会发生依赖错误,忽视依赖强制删除的方法:rpm -e --nodeps 软件包名称

  • 安装rpm包:rpm -ivh 软件包全路径名称

    • i=install:安装

    • v=verbose:提示

    • h=hash:进度条

      软件包全路径名称:光盘-packages-找到火狐-复制在熟悉目录,然后执行安装命令

P84YUM
  • YUM:是一个shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。使用yum的前提是联网。
  • yum list | grep xx:查询yum服务器是否有需要安装的软件
  • yum install xx:安装指定的yum包
  • yum -y remove xx:卸载指定的yum包
P86安装jdkjtomcatidearmysql

搭建JAVAEE环境

1.mkdir /opt/jdk

2.通过xftp6上传到/opt/jdk下

3.cd /opt/jdk

4.解压tar -zxvf jdk-----.tar.gz

5.mkdir /user/local/java

6.mv /opt/jdk/jdk26 /user/local/java

(找到环境变量echo $PATH)

7.配置环境变量 vim etc/profile

8.export JAVA_HOME=/user/local/java/jdk281(之前的java目录,这段加在profile最后)

9.export PATH= J A V A H O M E / b i n : JAVA_HOME/ bin: JAVAHOME/bin:PATH

10.source /etc/profile [让文件生效]

测试是否成功

  1. 将软件上传到/opt下
  2. 解压缩
  3. 配置环境变量的配置文件vim /etc/profile
    • JAVA_HOME=/opt/jdk1.7.0_79
    • PATH=/opt/jdk1.7.0_79/bin:$PATH
    • export JAVA_HOME PATH
    • 保存然后source /etc/profile生效
P87安装Tomcat

下载地址,选完全的 tar.gz

  1. 上传安装文件 , mkdir /opt/tomcat

  2. 解压缩到/opt:tar -zxvf apache-tomcat-7.0.70.tar.gz

  3. 进入tomcat的bin目录,启动tomcat

    cd aptomcat/ cd /bin

  4. ./startup.sh

  5. 开放端口 vim /etc/sysconfig/iptables

     firewall-cmd--permanent--add-port=8080/tcp(开启8080端口)
    
    systemctl restart firewalld.service
    
     firewall-cmd --reload
    
    • 重启防火墙生效

      查询端口是否以及打开

      firewall-cmd --query-port=8080/tcp

      http://192.168.8.130:8080/(z注意130是linux的ip)

  6. 测试是否安装成功:在windows和Linux下访问http://linuxip:8080

  7. 测试,在cd … cd webapps/ 然后 cd ROOT vim yxy.html

    然后在浏览器192.168.8.130:8080/yxy.html 显示出

P88安装IDEA
  1. 解压缩到/opt/idea:tar -zxvf eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz
  2. 启动idea bin目录下./idea.sh 配置jdk(注意这个要在有界面的终端做,xshell是远程登录)
  3. 编写Hello world程序并测试成功
P89安装mysql
  1. mkdir /opt/mysql,并cd进去

  2. 运行 wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

  3. 解压 tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

  4. 查看是否有mysql:rpm -qa | grep mari

    linux自带mysql数据库名字mari

  5. 删除旧mysql:rpm -e --nodeps mariadb-libs(强制删除)

    再删剩余的rpm -e --nodeps marisa

    查询rpm -qa | grep mari

  6. 依次运行

    1 rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm

    2 rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm

    3 rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm

    4 rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm

  7. 启动mysql

    systemctl start mysqld.service

  8. 然后开始设置root用户密码

    mysql自动设置root用户随机密码

    grep “password” /var/log/mysqld.log

    可以查看当前密码

    [Note] A temporary password is generated for root@localhost: gzPQrE4Rjq;e

  9. 进入到Mysql然后修改密码

    mysql -u -root -p

  10. 安装环境:yum -y install make gcc-c++ cmake bison-devel ncurses-devel

  11. 对于个人可以简单一点密码 set global validate_password_policy=0 默认值是1

    set global validate_password_policy=0 输入;

    (mysql的密码复杂度分三种 1 长度数字大小写特殊字符)

    set password for ‘root’@‘localhost’ =password(‘yangmysqlpwd’);

    执行 flush privileges;

  12. 测试

    quit

    输入mysql -u -root -p

    输入密码

    然后 show datebases1111

P91shellP92shell自定义变量
  • shell是什么

    Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
    
    在计算机科学中,Shell俗称壳(用来区别于核)
    是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。
    它类似于DOS下的COMMAND.COM和后来的cmd.exe。
    它接收用户命令,然后调用相应的应用程序。
    
    中文名	壳
    外文名	shell
    性质		命令解析器
    用途		接收用户命令
    
    Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。是用户使用 Linux 的桥梁.
    
    用户写了一个指令,该指令不能直接发给Linux内核去执行,而是由shell帮我们去执行,执行完之后再通过shell返回给我们结果。
    在Linux中不止一种shell,我们常用的是bash。
    可以直接发一个指令给shell,也可以将指令写在一个文件/脚本(.sh shell脚本)里。
    shell编程就是在shell脚本中写指令
    
  • shell脚本的执行方式

    1.脚本格式要求:
    	脚本以 #!/bin/bash 开头 --->确定shell的类型
        脚本需要有可执行权限
        shell脚本文件以.sh结尾,也可以不以.sh结尾
    
    2.编写第一个Shell 脚本
    需求说明:创建一个 Shell 脚本,输出 hello world! 
    创建一个目录:mkdir /root/shcode
    cd /root/shcode
    vim hello.sh
    写入:
    	#!/bin/bash
    	echo "hello,world!"
    
    3.shell脚本的常用执行方式
    方式 1:
    #输入ll查看权限
    	首先要给shell脚本加x执行权限:chmod u+x hello.sh
    	再输入该脚本的相对路径或绝对路径来执行该脚本
        比如:
    	 	使用相对路径:	./hello.sh 
    	 
    	 	使用绝对路径:	/root/shcode/hello.sh
    
    方式 2:
    	不用赋予脚本+x 权限,直接执行即可。(使用以下指令,即使没有执行权限也可以执行)
    	使用指令: sh  shell脚本/shell脚本的绝对路径
    	比如	sh hello.sh 
    
    
  • shell 变量

(1)	Linux Shell 中的变量分为:系统变量和用户自定义变量。
系统变量:系统自带的变量

(2)	系统变量比如:$HOME、$PWD、$SHELL、$USER 等等
echo $HOME	--->显示当前用户的家目录

(3)	可以通过 set 指令显示出shell中的所有系统变量

  • 自定义变量
基本语法:
(1)	定义变量:变量名=--->不加空格
(2)	撤销变量:unset 变量名
(3)	声明静态变量:readonly 变量 (该变量不能 unset撤销)

案例 1:定义变量 A
案例 2:撤销变量 A
案例 3:声明静态的变量 B=2,不能 unset

cd /root/shcode
vim vr.sh
输入: 
	#!/bin/bash
	
	#案例 1:定义变量 A=100  (#为注释符)
	A=100
	#输出变量需要加上$ ($--->引用变量)
	echo $A
	
	#上述输出结果是100,想要输出结果为A=100,这样写(A=以普通文本形式输出,$A引用变量的值)
	echo A=$A 或者 echo "A=$A" 
		
		
	#案例 2:撤销变量 A 
	unset A
	echo "A=$A"    (--->输出 A= )

	
	#案例 3:声明静态的变量 B=2,不能 unset 
	readonly B=2
	echo "B=$B" 
	
保存:wq
最后输入执行命令:sh vr.sh

--------------------------------------------------------------------


shell 变量名的定义规则:
(1)	变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
(2)	等号两侧不能有空格
(3)	变量名称一般习惯为大写,这是一个规范,我们遵守即可

--------------------------------------------------------------------
将命令的返回值赋给变量:
(1)	A=`date`反引号,运行里面的命令,并把结果返回给变量 A 
(2)	A=$(date) 等价于反引号

案例:
#将指令返回的结果赋给变量
	C=`date` 
	D=$(date)
	echo "C=$C" 输出C=时间
	echo "D=$D" 输出D=时间
	
	#使用环境变量 TOMCAT_HOME
	echo "tomcat_home=$TOMCAT_HOME"

P93设置环境变量(全局变量)
可以将变量提升为全局环境变量,供多个shell程序共同使用。

基本语法:
(1)	export 	变量名=变量值 	
(功能描述:将 shell 变量输出为环境变量/全局变量)

(2)	source 	配置文件		    
(功能描述:在某文件中定义环境变量之后,要对该文件进行刷新才能使其生效,即让修改后的配置信息立即生效)

(3)	echo 	$变量名			
(功能描述:查询环境变量的值)


快速入门:
(1)/etc/profile 文件中定义 TOMCAT_HOME 环境变量
TOMCAT_HOME --->意思是tomcat的家目录是什么
(2)	查看环境变量 TOMCAT_HOME 的值
vim /etc/profile
	写入:export TOMCAT_HOME=/opt/tomcat
	保存退出
source /etc/profile
echo $TOMCAT_HOME ---输出 /opt/tomcat


(3)	在另外一个 shell 程序中使用 TOMCAT_HOME
在另一个shell程序中写入:
	echo "tomcat_home=$TOMCAT_HOME"


注意:在输出 TOMCAT_HOME 环境变量前,需要让其生效source /etc/profile


shell 脚本的
	单行注释:#
	多行注释:   :<<!   独占一行	
				内容 
			    ! 	   独占一行

P94Linux位置参数变量

在vim 中 设置行号:set nu

  • 1.介绍
    当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
    比如: ./myshell.sh 100 200 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
    
    ./myshell.sh --->执行myshell脚本命令
    100 200 都是该命令行的参数
    使用位置参数变量可以在myshell脚本中获得参数
    
    
    2.基本语法
    $n (功能描述:n 为数字,$0 代表命令本身(如./myshell.sh),$1-$9 代表第一到第九个参数(如:$1 就是100 $2 就是200),十以上的参数需要用大括号包含,如${10})
    $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
    $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
    $# (功能描述:这个变量代表命令行中所有参数的个数)
    
    案例:编写一个 shell 脚本 myshell.sh ,在脚本中获取到命令行的各个参数信息。
    vim myshell.sh
    	写入:
    		#!/bin/bash
    		echo "命令本身=$0 第一个参数=$1 第二个参数=$2"
    		echo "所有的参数=$*"
    		echo "$@"
    		echo "参数个数=$#"
    		保存退出
    sh myshell.sh 11 22
    结果输出 
    0=./myshell.sh  1=11  2=222
    所有的参数=11 222
    11 222
    参数个数=2
    
    
P95预定义变量
1.基本介绍:
预定义变量是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用


2.基本语法:
(1)	$$ (功能描述:当前进程的进程号(PID))
(2)	$! (功能描述:后台运行的最后一个进程的进程号(PID))
(3)	$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

3.应用实例:
在一个 shell 脚本中简单使用一下预定义变量

vim preVar.sh
	写入:
	#!/bin/bash
	echo "当前执行的进程 id=$$"
	
	#以后台的方式运行一个脚本(在脚本后加一个$),并获取他的进程号
	/root/shcode/myshell.sh &
	
	echo "最后一个后台方式运行的进程 id=$!" 

	echo "执行的结果是=$?"
	保存并退出
sh preVar.sh
输出结果
当前执行的进程id=5233
最后一个后台方式运行的进程id=5234
执行的结果0
[root@yangvm01 shellcode]# 0=/root/shellcode/myshell.sh  1=  2=
所有的参数=

参数个数=0

P96linux运算符
1.基本介绍:
学习如何在 shell 中进行各种运算操作。


2.基本语法:
(1)	三种写法:
	$((运算式))
	$[运算式]
	expr m + n 	(expression 表达式)
	 
(2)	注意 expr 运算符间要有空格
	如果希望将 expr 的结果赋给某个变量,使用 `` 或者 $( )

(3)	expr m - n

(4)	expr \*, /, %	乘,除,取余


3.应用实例 oper.sh
案例 1:计算(2+3)X4 的值
案例 2:请求出命令行的两个参数[整数]的和 20 50

vim oper.sh
	写入:
	#!/bin/bash
	#案例 1:计算(2+3)X4 的值
	#使用第一种方式
	RES1=$(((2+3)*4))        --->用一个变量RES1接收
	echo "res1=$RES1"
	保存并退出
sh oper.sh

vim oper.sh
	写入:
	#!/bin/bash
	#使用第二种方式, 推荐使用
	RES2=$[(2+3)*4]
	echo "res2=$RES2"
	保存并退出
sh oper.sh	

vim oper.sh
	写入:
	#!/bin/bash	
	#使用第三种方式 expr 
	TEMP=`expr 2 + 3`       
	RES4=`expr $TEMP \* 4` 
	echo "temp=$TEMP"
	echo "res4=$RES4"
	保存并退出
	写入
    #!/bin/bash
    #计算(2+3)X 4
    #method 1
    r1=$(((2+3)*4))
    echo r1=$r1
    #m2
    r2=$[(2+3)*4]
    echo r2=$r2
    #m3
    TEMP=`expr 2 + 3`
    r3=`expr $TEMP \* 4`
    echo TEMP=$TEMP
    echo r3=$r3
        
sh oper.sh
输出
r1=20
r2=20
TEMP=5
r3=20

vim oper.sh
	写入:
	#!/bin/bash	
	#案例 2:请求出命令行的两个参数[整数]的和 20 50 
	SUM=$[$1+$2]
	echo "sum=$SUM"
	保存并退出
./ oper.sh 20 50
输出sum=50
P97条件判断
1.基本语法:
[ condition ] (注意 condition 前后要有空格)
#非空返回 true,可使用$?验证(0 为 true,>1 为 false)


2.应用实例:
[ hspEdu ]		返回 true 
[ ]				返回 false
[ condition ] && echo OK || echo notok	条件满足,执行后面的语句


3.判断语句:
	常用判断条件:
	(1) = 字符串比较
	(2)	两个整数的比较
		-lt 小于     less than
		-le 小于等于  less equal
		-eq 等于      equal
		-gt 大于      greater
		-ge 大于等于   greater equal
		-ne 不等于     not equal
	(3)	按照文件权限进行判断
		-r 有读的权限
		-w 有写的权限
		-x 有执行的权限
	(4)	按照文件类型进行判断
		-f 文件存在并且是一个常规的文件
		-e 文件存在
		-d 文件存在并是一个目录


4.应用实例:
案例 1:"ok"是否等于"ok"
判断语句:使用 =
案例 2:23 是否大于等于 22
判断语句:使用 -ge
案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
判断语句: 使用 -f

代码如下:
vim ifdemo.sh
	#!/bin/bash
	#案例 1:"ok"是否等于"ok"
	if [ "ok" = "ok"  ]
	then
	        echo "equal"
	fi                    -----> if语句 以if开头 以fi结尾
	
	#案例 2:23 是否大于等于 22
	#判断语句:使用 -ge
	if [ 23 -ge 22 ]
	then
	        echo "大于"
	fi
	
	#案例 3:/root/shcode/aaa.txt 目录中的文件是否存在
	#判断语句: 使用 -f
	if [ -f  /root/shcode/aaa.txt ]
	then
	        echo "文件存在"
	fi
	
	#看几个案例
	if [ ]
	then
	        echo "存在"
	fi
	
	if [ hspEdu01 ]
	then
	        echo "hello hspEdu01"
	fi
sh ifdemo.sh

输出结果:
	equal
	大于
	hello hspEdu01

P98 单分支多分支
1.基本语法:
if [ 条件判断式 ] 
then
	代码
fi

或者 多分支

if [ 条件判断式 ] 
then
	代码
elif [条件判断式] 
then
	代码
fi

2.注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格

3.应用实例 ifCase.sh
案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
	if [ $1 -ge 60 ]
	then
	        echo "及格了"
	else
	        echo "不及格"
	fi

	或者

	if [ $1 -ge 60 ]
	then
	        echo "及格了"
	elif[ $1 -lt 60]
	then
	        echo "不及格"
	fi

P99 case语句
1.基本语法:

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…

*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

应用实例 testCase.sh
案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",其它情况输出"other"
vim testCase.sh
	写入:
	#!/bin/bash
	#案例1:当命令行参数是1时,输出 "周一", 是2时,就输出"周二",其它情况输出"other"
	case $1 in
	"1")
	echo "周一"
	;;
	"2")
	echo "周二"
	;;
	*)
	echo "other..."
	;;
	esac
	保存并退出
	
sh testCase.sh 1
周一

P100 for循环
基本语法:

第一种方式:

for 变量 in  值 1  值 2  值 3… 
do
程序/代码
done

应用实例 testFor1.sh
案例:打印命令行输入的参数 [这里可以看出$*  和 $@ 的区别]
	#!/bin/bash
	#案例:打印命令行输入的参数 [这里可以看出$*  和 $@ 的区别]
	#注意:$* 是把输入的参数当作一个整体,所以只会输出一句话
	for i in "$*"
	do
	        echo "num is $*"
	done
	
	#使用 $@ 来获取输入的参数,注意:也是把输入的参数看作一个整体,但这是分别对待;所以有几个参数就输出几句
	echo "======================================"
	for j in "$@"
	do
	        echo "num is $@"
	done

sh testFor1.sh 100 200 300
num is 100 200 300
======================================
num is 100 200 300
num is 100 200 300
num is 100 200 300





语法2第二种方式:

for (( 初始值;循环控制条件;变量变化 ))
do
程序/代码
done

应用实例 testFor2.sh
案例:从 1 加到 100 的值输出显示
	#!/bin/bash
	#案例:从 1 加到 100 的值输出显示
	#定义一个变量SUM
	SUM=0
	for(( i=1; i<=100; i++  ))
	do
	        SUM=$[$SUM+$i]
	done
	echo "总和SUM=$SUM"

sh testFor2.sh 
总和SUM=5050

如果1加到x x由自己输入
	SUM=0
	for(( i=1; i<=$1; i++  ))
	do
	        SUM=$[$SUM+$i]
	done
	echo "总和SUM=$SUM"

sh textFor2.sh 1000
总和SUM=500500

P101while循环
基本语法:
while [ 条件判断式 ]
do
程序/代码
done

注意:while 和 [有空格,条件判断式和[  ]也有空格

应用实例:testWhile.sh
案例:从命令行输入一个数 n,统计从 1+..+ n  的值是多少?
	#!/bin/bash
	SUM=0
	i=0
	while [ $i -le $1 ] 
	do
	SUM=$[$SUM+$i]
	#i 自增
	i=$[$i+1]
	done
	echo "执行结果=$SUM"

sh testWhile.sh 100
执行结果=5050

P102 read获取输入
1.基本语法:
read(选项)(参数)
选项:
	-p:指定读取值时的提示符;
	-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数:
	变量:指定读取值的变量名

2.应用实例 testRead.sh
案例 1:读取控制台输入一个 NUM1 值
案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。代码:

	#!/bin/bash
	#案例 1:读取控制台输入一个 NUM1 值
	read -p "请输入一个数 NUM1=" NUM1 
	echo "你输入的 NUM1=$NUM1"
	
	#案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
	read -t 10 -p "请输入一个数 NUM2=" NUM2 
	echo "你输入的 NUM2=$NUM2"

sh testRead.sh
请输入一个数 NUM1=100
你输入的 NUM1=100

P103系统函数
1.basename 基本语法
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]	

功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

案例 1:请返回 /home/aaa/test.txt 的 "test.txt" 部分
basename /home/aaa/test.txt
返回test.txt

如果输入:basename /home/aaa/test.txt .txt
返回test


2.dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径 

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

案例 1:请返回 /home/aaa/test.txt 的 /home/aaa 
dirname /home/aaa/test.txt
返回/home/aaa

P104自定义函数
基本语法:
[ function ] funname[()]
{
	Action; 
	[return int;]
}

调用直接写函数名:funname	[值]


案例 1:计算输入两个参数的和(动态的获取) testFun.sh
	#!/bin/bash
	#案例 1:计算输入两个参数的和(动态的获取)
	
	#定义函数 getSum 
	function getSum() {
		SUM=$[$n1+$n2] 
		echo "和是=$SUM"
	}

	#输入两个值
	read -p "请输入一个数 n1=" n1 
	read -p "请输入一个数 n2=" n2
	
	#调用自定义函数
	getSum $n1 $n2


sh testFun.sh 
请输入一个数 n1=10
请输入一个数 n2=90
和是=100

P105备份数据
  1. cd /usr/sbin

  2. vim mysql_db_backup.sh

  3. chmod u+x mysql_db_backup.sh

  4. 编辑文件

    #!/bin/bash
    #备份目录
    BACKUP=/data/backup/db
    #当前的时间
    DATETIME=$(date +%Y-%m-%d_%H%M%S)
    echo "$DATETIME"
    #数据库地址
    HOST=localhost
    #数据库用户名
    DB_USER=root
    #数据库密码
    DB_PW=yangmysqlpwd
    #备份的数据库名
    DATABASE=yang
    #创建备份目录,如不存在就创建
    [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
    #备份数据库
    mysqldump	-u${DB_USER}	-p${DB_PW}	--host=${HOST}	-q	-R	--databases	${DATABASE}	| gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
                                                       
    #将文件处理成 tar.gz 
    cd ${BACKUP}
    tar -zcvf $DATETIME.tar.gz ${DATETIME}
                                                       
    #删除对应的备份目录
    rm -rf ${BACKUP}/${DATETIME}
    #删除10天前备份的数据库文件
    find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
            echo "备份数据库${DATABASE} 成功~"
                                                       
    
  5. /usr/sbin/mysql_db_backup.sh

  6. crontab -e

  7. 编辑

    30 2 * * * /usr/bin/mysql_db_backup.sh
    定时 
    
P117日志管理的介绍和实例
(1)日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。
(2)日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。
(3)可以这样理解 日志是用来记录重大事件的工具
系统日志文件的保存位置:/var/log/ 目录下

应用案例:
使用 root 用户通过 xshell6 登陆,第一次使用错误的密码,第二次使用正确的密码登录成功看看在日志文件/var/log/secure 里有没有记录相关信息

系统常用日志:

在这里插入图片描述

P118日志管理服务P119配置文件P120自定义日志服务
CentOS7.6 日志服务是 rsyslogd   (rocket-fast system for log)
CentOS6.x 日志服务是 syslogd 
rsyslogd 功能更强大
rsyslogd 的使用、日志文件的格式,和 syslogd 服务是兼容的

rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。
将日志记录到对应的文件中。

/etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。

原理示意图:

在这里插入图片描述

1.在进行日志管理时,要保证rsyslogd服务是启动的!

(1)查询 Linux 中的 rsyslogd 服务是否启动
ps aux | grep "rsyslog" 

ps aux | grep "rsyslog" | grep -v "grep"
| grep -v "grep" ---> 筛选出ps aux | grep "rsyslog" 结果中不是grep的

(2)查询 rsyslogd 服务的自启动状态(是否是自启动状态enable)
systemctl list-unit-files | grep rsyslog


2.配置文件:/etc/rsyslog.conf
该配置文件中记录了:日志和日志存放在哪个文件

关于日志:*.*
其中第一个*代表日志类型,第二个*代表日志级别

(1)日志类型分为:
auth					##pam 产生的日志
authpriv				##ssh、ftp 等登录信息的验证信息
corn					##时间任务相关
kern					##内核
lpr						##打印
mail					##邮件
mark(syslog)-rsyslog	##服务内部的信息,时间标识
news					##新闻组
user					##用户程序产生的相关信息
uucp					##unix to nuix copy主机之间相关的通信
local 1-7				##自定义的日志设备

(2)日志级别分为:
debug		##有调试信息的,日志通信最多
info		##一般信息日志,最常用
notice		##最具有重要性的普通条件的信息
warning		##警告级别
err			##错误级别,阻止某个功能或者模块不能正常工作的信息
crit		##严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert		##需要立刻修改的信息
emerg		##内核崩溃等重要信息
none		##什么都不记录	
注意:从上到下,级别从低到高,记录信息越来越少


3.由日志服务 rsyslogd 记录的日志文件,
日志文件的内容:每一行都代表一个事件,每一行有以下四个内容:
1)	事件产生的时间
2)	产生事件的服务器的主机名
3)	产生事件的服务名或程序名
4)	事件的具体信息


4.日志如何查看实例
查看一下 /var/log/secure 日志,这个日志中记录的是用户验证和授权方面的信息 来分析如何查看
> > Oct 15 22:54:30 yangvm01 sshd[4457]: Accepted password for root from 192.168.8.1 port 4322 ssh2

5.日志管理服务应用实例(增加自定义的日志)
在/etc/rsyslog.conf 中添加一个日志文件/var/log/hsp.log,当有事件发送时(比如 sshd 服务相关事件),该文件会接收到信息并保存. 
给小伙伴演示 重启,登录 的情况,看看是否有日志保存

vim /etc/rsyslog.conf 
写入:
	*.*  		/var/log/hsp.log
	保存退出
> /var/log/hsp.log  (创建日志文件)
然后重启,重启事件会被记录到/var/log/hsp.log中
cat hsp.log | grep sshd 	就可以查到信息(sshd远程连接)

P121日志轮替 P122自定义日志轮替
日志轮替(logrotate)就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除
清除日志中旧的信息
  • .日志轮替文件命名
(1)	centos7 使用 logrotate 进行日志轮替管理
要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中“dateext” 参数

(2)	如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如 “secure-20201010”。
这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件即可。

(3)	如果配置文件中没有“dateext”参数,日志文件就需要进行改名了。
当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志, 用来保存新的日志。
当第二次进行日志轮替时,“secure.1” 会自动改名为“secure.2”, 当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志,以此类推。

  • logrotate 配置文件 自定义日志轮替
/etc/logrotate.conf 为 logrotate 的全局配置文件(写了日志文件轮替规则)

/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)
可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则
也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用

/etc/logrotate.conf文件内容:
	# rotate log files weekly--->每周对日志文件进行一次轮替
	weekly
	
	# keep 4 weeks worth of backlogs--->共保存 4 份日志文件,当建立新的日志文件时,旧的将会被删除
	rotate 4
	
	# create new (empty) log files after rotating old ones--->创建新的空的日志文件,在日志轮替后
	create
	
	# use date as a suffix of the rotated file--->使用日期作为日志轮替文件的后缀
	dateext
	
	# uncomment this if you want your log files compressed--->日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩
	#compress
	
	#RPM packages drop log rotation information into this directory 
	include /etc/logrotate.d--->可以把一些单独的轮替规则写在/etc/logrotate.d下(在本文件中include调用一下就行),也可以写在本文件中(如下面写的)
	
	#下面是单独设置,优先级更高。
	# no packages own wtmp and btmp -- we'll rotate them here
	/var/log/wtmp {
		monthly					 # 每月对日志文件进行一次轮替
		create 0664 root utmp 	 # 建立的新日志文件,权限是 0664  ,所有者是 root ,所属组是 utmp 组
		minsize 1M				 # 日志文件最小轮替大小是 1MB 。也就是日志一定要超过 1MB 才会轮替,否则就算时间达到一个月,也不进行日志转储
		rotate 1 				 # 仅保留一个日志备份。也就是只有 wtmp  和 wtmp.1  日志保留而已
	}
	
	/var/log/btmp {
		missingok 				 # 如果日志不存在,则忽略该日志的警告信息
		monthly
		create 0600 root utmp rotate 1
	}
	



	单独指定某个日志文件的轮替规则的参数说明:
		daily					日志的轮替周期是每天
		weekly					日志的轮替周期是每周
		monthly					日志的轮替周期是每月
		rotate 数字				保留的日志文件的个数。0 指没有备份
		compress				日志轮替时,旧的日志进行压缩
		create mode owner group	建立新日志,同时指定新日志的权限与所有者和所属组。
		mail address			当日志轮替时,输出内容通过邮件发送到指定的邮件地址。
		missingok				如果日志不存在,则忽略该日志的警告信息
		notifempty				如果日志为空文件,则不进行日志轮替
		minsize 大小				日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
		size 大小				日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。
		dateext					使用日期作为日志轮替文件的后缀。
		sharedscripts			在此关键字之后的脚本只执行一次。
		prerotate/endscript		在日志轮替之前执行脚本命令。
		postrotate/endscript	在日志轮替之后执行脚本命令。

P122 把自己的日志加入日志轮替
1)	第一种方法:
		直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
2)	第二种方法:
		在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。

3)	推荐使用第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写 入/etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

案例:在/etc/logrotate.conf 进行配置, 或者直接在 /etc/logrotate.d/ 下创建文件 hsplog  
编写如下内容,	具体轮替的效果 可以参考 /var/log  下的 boot.log 情况.

在 /etc/logrotate.d/ 下创建文件 hsplog  
vim  hsplog  
写入:
	/var/log/hsp.log
	{
		missingok
		daily
		copytruncate
		rotate 1
		notifempty
	}
	保存退出

这样就好了,因为/etc/logrotate.conf 中有:include /etc/logrotate.d

P123日志轮替
日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。
在 /etc/cron.daily/目录,就会发现这个目录中是有 logrotate 文件(可执行),
logrotate 通过这个文件依赖定时任务执行的。

crond定时后台程序会定时执行cron.daily内的文件
logrotate 文件在cron.daily下
所以也会定时执行文件中的轮替规则


写日志是rsyslogd
日志轮替是logrotate

日志总结

总结

1.系统日志文件的保存位置:/var/log/ 目录下

2.rsyslogd是一个后台程序(服务),来管理/记录/操作相关日志。
将日志记录到对应的文件中。

3./etc/rsyslog.conf配置文件中记录了要管理哪些日志和将这些日志记录到哪个文件中。

4.由日志服务 rsyslogd 记录的日志文件,
日志文件的内容:每一行都代表一个事件,每一行有以下四个内容:

  1. 事件产生的时间
  2. 产生事件的服务器的主机名
  3. 产生事件的服务名或程序名
  4. 事件的具体信息

创建日志

vim /etc/rsyslog.conf 
写入:
	*.*  		/var/log/hsp.log
	保存退出
> /var/log/hsp.log  (创建日志文件)
然后重启,重启事件会被记录到/var/log/hsp.log中
cat hsp.log | grep sshd 	就可以查到信息(sshd远程连接)

日志轮替

/etc/logrotate.conf中的轮替规则适用于所有日志文件(除了单独指定轮替规则的日志文件)
可以在/etc/logrotate.conf对某些日志文件单独指定轮替规则
也可以把对某些日志文件单独指定的轮替规则写在/etc/logrotate.d目录下,然后在/etc/logrotate.conf 中include调用
1)	第一种方法:
		直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
2)	第二种方法:
		在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。
在 /etc/logrotate.d/ 下创建文件 hsplog  
vim  hsplog  
写入:
	/var/log/hsp.log
	{
		missingok
		daily
		copytruncate
		rotate 1
		notifempty
	}
	保存退出
P124查看内存日志
有一些日志是写到内存里的,还没有写到文件里,因为这些日志是实时变化的
重启之后内存日志会被清空

查看内存日志指令:journalctl
journalctl				查看全部
journalctl -n 3			查看最新 3 条
journalctl --since 19:00	--until 19:10:10	查看起始时间到结束时间的日志可加日期
journalctl -p err		报错日志
journalctl -o verbose	日志详细内容
journalctl _PID=1245 _COMM=sshd	查看包含这些参数的日志(在详细日志查看) 或者 journalctl |	grep sshd
 

注意: journalctl	查看的是内存日志, 重启清空

演示案例:
使用 journalctl | grep sshd	来看看用户登录清空, 重启系统,再次查询,看看日志有什么变化没有

P126定制自己的linux系统
通过裁剪现有 Linux 系统(CentOS7.6),创建属于自己的 min Linux 小系统

  • 基本原理
启动流程介绍:
制作 Linux 小系统之前,再了解一下 Linux 的启动流程:
1、首先 Linux 要通过自检,检查硬件设备有没有故障
2、如果有多块启动盘的话,需要在 BIOS 中选择启动磁盘
3、启动 MBR 中的 bootloader 引导程序
4、加载内核文件
5、执行所有进程的父进程、老祖宗 systemd
6、欢迎界面

在 Linux 的启动流程中,加载内核文件时关键文件:
1)kernel 文件:	vmlinuz-3.10.0-957.el7.x86_64
2)initrd 文件:  initramfs-3.10.0-957.el7.x86_64.img

  • 制作 min linux 思路分析
1.在现有的 Linux 系统(centos7.6)上加一块硬盘/dev/sdb
  在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。
  需要明确的是,现在加的这个硬盘在现有的 Linux 系统中是/dev/sdb,但是,当我们把东西全部设置好时,要把这个硬盘拔除,放在新系统上,此时,就是/dev/sda

2.在/dev/sdb 硬盘上,将其打造成独立的 Linux 系统,里面的所有文件是需要拷贝进去的

3.作为能独立运行的 Linux 系统,内核是一定不能少,要把内核kernel 文件和 initramfs 文件也一起拷到/dev/sdb 上

4.以上步骤完成,我们的自制 Linux 就完成,创建一个新的 linux 虚拟机,将其硬盘指向我们创建的硬盘,启动即可

5.示意图

1.虚拟机设置-添加新的硬盘-将虚拟硬盘存储为单个文件(可以用lsblk查看你需要重启)

2.通过fdisk来给我们的/dev/sdb进行分区

n 新增分区 主分区p 然后w写入,做了两个分区

3.格式化第一块,格式化第二块

mkfs.ext4 /dev/sdb1

mkfs.ext4 /dev/sdb12

4.创建目录并且挂载新的磁盘

mkdir -p /mnt/boot /mnt/sysroot
[root@yangvm01 ~]# mount /dev/sdb1 /mnt/boot
[root@yangvm01 ~]# mount /dev/sdb2 /mnt/sysroot/

5.安装grub ,内核文件拷贝至目标磁盘

grub2-install --root-directory=/mnt /dev/sdb

#用二进制确认我们是否安装成功

hexdump -C -n 512 /dev/sdb

复制

[root@yangvm01 ~]# rm -rf /mnt/boot/*
[root@yangvm01 ~]# cp -rf /boot/* /mnt/boot/

6.修改grub2/grub.cfg文件 标红的部分是需要使用指令来查看的

cd /mnt/boot/

cd grub2

vim grub.cfg

在打开的文件中

注意### BEGIN /etc/grub.d/10_linux ###开头的

msdos1 --hint=‘hd0,msdos1’ xxxxxxxxxx1

else
search --no-floppy --fs-uuid --set=root xxxxx1
fi
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=xxxxxx3 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8

注意我们的是拷贝/boot/*的文件来到/mnt/boot/所以要修改

开新终端

[root@yangvm01 ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 bc089e8d-a935-4aff-91d6-cd293a219d98 /boot xxx1
├─sda2 ext4 98ded09e-0090-4b42-a951-ae6eedb72392 / xxxx3
└─sda3 swap 011362b1-fc86-4df2-af4f-44cc10917047 [SWAP]
sdb
├─sdb1 ext4 30bee603-4eb2-4582-b38e-a8897b9039ee /mnt/boot
└─sdb2 ext4 f2e88100-8f93-44d9-8f64-245091b33073 /mnt/sysroot
sr0

将sdb中的代替x1,x3

在77%的时候

 fi
        linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=f2e88100-8f93-44d9-8f64-245091b33073 ro spectre_v2=retpoline rhgb quiet LANG=zh_CN.UTF-8 selinux=0 init=/bin/bash
        initrd16 /initramfs-3.10.0-1160.el7.x86_64.img
}

增加 selinux=0 init=/bin/bash

在88%的时候进行修改

在### END /etc/grub.d/10_linux ###,在上面进行修改

linux16 /vmlinuz-0-rescue-f963f5d2e26e4964b75951a59410ab9a root=UUID=f2e88100-8f93-44d9-8f64-245091b33073 ro rhgb quiet selinux=0 init/bin/bash

然后再类似的地方加入selinux=0 init=/bin/bash(如上图)

7.创建目标主机根文件系统

mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}

8.拷贝需要的bash(也可以拷贝你需要的指令)和库文件给新的系统使用

cp /lib64/. /mnt/sysroot/lib64/

cp /bin/bash /mnt/sysroot/bin/

9.现在我们也可以创建一个新的虚拟机,然后将默认分配的磁盘,溢出的,指向我们新建的磁盘即可

shutdown -h now

10.创建一个虚拟机,然后成功

P129阅读源码

阅读1.0 懂C语言 进程管理 内存管理文件系统 驱动程序网络

内核最新 https://www.kernel.org/查看

可以用wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.8.16.tar.gz

tar -zxvf xxxxx 解压

检查内核版本:

yum info kernel -q

uname -a 查看当前内核的指令

yum update kernel 升级内核

yum list kernel -q查看已经安装的内核

P133linux系统备份与恢复-P136
虚拟机可以做快照。
实体机无法做快照,如果系统出现异常或者数据损坏,后果严重,要重做系统,还会造成数据丢失。
所以我们可以使用备份和恢复技术

linux 的备份和恢复很简单,有两种方式:
(1)	把需要的文件(或者分区)用 TAR 打包就行,下次需要恢复的时候,再解压开覆盖即可
(2)	使用 dump 和 restore 命令

  • 安装 dump 和 restore

如果 linux 上没有 dump 和 restore 指令,要先安装
yum -y install dump
yum -y install restore

  • 使用 dump 完成备份
1.基本介绍:
dump 支持分卷和增量备份(所谓增量备份是指备份 上次备份后,修改/增加过的文件,也称差异备份)

2.语法说明:
dump [-cu] [-123456789]	[-f <备份后文件名>] [-T <日期>] [要备份的目录或文件系统] 
dump [] -wW

选项说明:
	-c 					创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。
	-0123456789 		备份的层级。0 为最完整备份,会备份所有文件。若指定 0 以上的层级,则备份至上一次备份以来修改或新增的文件,到 9 后,可以再次轮替.
	-f <备份后文件名> 	指定备份后文件名
	-j					调用 bzlib 库压缩备份文件,也就是将备份后的文件压缩成 bz2 格式,让文件更小
	-T <日期> 			指定开始备份的时间与日期
	-u 					备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。
	-t  				指定文件名,若该文件已存在备份文件中,则列出名称
	-W 					显示需要备份的文件及其最后一次备份的层级,时间,日期。
	-w 					与-W 类似,但仅显示需要备份的文件。

进行增量备份/备份层级要加-u,因为-u可以记录层级

3.案例
案例 1:将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0”
dump -0uj -f /opt/boot.bak0.bz2	 /boot/
/boot 要备份的分区

案例 2:在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看这次生成的备份文件 boot1.bak  有多大
dump -1uj -f /opt/boot.bak1.bz2 /boot


注意:通过 dump 命令在配合 crontab 可以实现无人值守备份
写一个脚本


4. 显示需要备份的文件及其最后一次备份的层级,时间,日期
dump -W


5.查看备份时间文件
cat /etc/dumpdates


6.dump 备份文件或者目录
前面我们在备份分区时,是可以支持增量备份的,
如果备份文件或者目录,不再支持增量备份, 即只能使用 0 级别备份(-u不能写)

案例:使用 dump 备份 /etc 整个目录
dump -0j -f /opt/etc.bak.bz2 /etc/ 

#下面这条语句会报错,提示 DUMP: Only level 0 dumps are allowed on a subdirectory 
dump -1j -f /opt/etc.bak.bz2 /etc/


注意:如果要备份重要的文件,比如数据区,建议将文件上传到其它服务器保存,不要将鸡蛋放在同一个篮子。

  • 使用 restore 完成恢复

    1.基本介绍:
    restore 命令用来恢复已备份的文件,可以从 dump 生成的备份文件中恢复原文件
                                  
    2.基本语法:
    restore	[模式选项] [选项]
                                  
    模式选项说明:不能混用,在一次命令中,只能指定一种。
    	-C	使用对比模式,将备份的文件与已存在的文件相互对比,看看是否存在差异
    	-i	使用交互模式,在进行还原操作时,restore 指令将依序询问用户
    	-r	进行还原模式 (一般用这个)
    	-t 	查看模式,看备份文件有哪些文件
    	                              
    选项
    -f <备份设备> 	从指定的文件中读取备份数据,进行还原操作
                                  
    3.案例:
    案例 1:restore 命令比较模式,比较备份文件和原文件的区别测试
    mv /boot/hello.java /boot/hello100.java
    restore -C -f boot.bak1.bz2	//注意和 最新的文件比较
                                  
    mv /boot/hello100.java /boot/hello.java 
    restore -C -f boot.bak1.bz2
                                   
    案例 2:restore 命令查看模式,看备份文件有哪些数据/文件
    restore -t -f boot.bak0.bz2
                                
      案例 3:restore 命令还原模式
    注意细节:如果你有增量备份,需要把增量备份文件也进行恢复,有几个增量备份文件,就要恢复几个,按顺序来恢复即可。
    mkdir /opt/boottmp 
    cd /opt/boottmp
    restore -r -f /opt/boot.bak0.bz2 //恢复到第 1 次完全备份状态
    restore -r -f /opt/boot.bak1.bz2 //恢复到第 2 次增量备份状态
                              
      案例 4:restore 命令恢复备份的文件,或者整个目录的文件
      基本语法: restore -r -f 备份好的文件
                              
    [root@hspedu100 opt]# mkdir etctmp 
      [root@hspedu100 opt]# cd etctmp/
    [root@hspedu100 etctmp]# restore -r -f /opt/etc.bak0.bz2
    
    
    
P 137webmin安装和配置
  • webmin介绍

``Webmin 是功能强大的基于Web 的Unix/linux 系统管理工具。管理员通过浏览器访问Webmin 的各种管理功能并完
成相应的管理操作。除了各版本的linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和FreeBSD 等系统

  • 下载安装

    1.下载地址: http://download.webmin.com/download/yum/  用下载工具下载即可
    2.也可以使用
    wget  http://download.webmin.com/download/yum/webmin-1.700-1.noarch.rpm
    
    3.安装: rpm -ivh webmin-1.700-1.noarch.rpm
    
    4.重置密码/usr/libexec/webmin/changepass.pl /etc/webmin root test
    root 是webmin 的用户名,不是OS 的, 这里就是把webmin 的root 用户密码改成了test
    
    5.修改webmin 服务的端口号(默认是10000 出于安全目的)
    vim /etc/webmin/miniserv.conf # 修改端口
    
    将port=10000 修改为其他端口号,如port=6666
    > 注意listen=6666 也要修改
    
    6.重启webmin
    /etc/webmin/restart # 重启
    /etc/webmin/start # 启动
    /etc/webmin/stop # 停止
    
    7.防火墙放开6666 端口
    firewall-cmd --zone=public --add-port=6666/tcp --permanent # 配置防火墙开放6666 端口
    firewall-cmd --reload # 更新防火墙配置
    firewall-cmd --zone=public --list-ports # 查看已经开放的端口号
    >
    
      提示如果6666不行是端口问题,注意避开这些端口,我用5555端口成功
      
      1,    // tcpmux
      7,    // echo
      9,    // discard
      11,   // systat
      13,   // daytime
      15,   // netstat
      17,   // qotd
      19,   // chargen
      20,   // ftp data
      21,   // ftp access
      22,   // ssh
      23,   // telnet
      25,   // smtp
      37,   // time
      42,   // name
      43,   // nicname
      53,   // domain
      77,   // priv-rjs
      79,   // finger
      87,   // ttylink
      95,   // supdup
      101,  // hostriame
      102,  // iso-tsap
      103,  // gppitnp
      104,  // acr-nema
      109,  // pop2
      110,  // pop3
      111,  // sunrpc
      113,  // auth
      115,  // sftp
      117,  // uucp-path
      119,  // nntp
      123,  // NTP
      135,  // loc-srv /epmap
      139,  // netbios
      143,  // imap2
      179,  // BGP
      389,  // ldap
      465,  // smtp+ssl
      512,  // print / exec
      513,  // login
      514,  // shell
      515,  // printer
      526,  // tempo
      530,  // courier
      531,  // chat
      532,  // netnews
      540,  // uucp
      556,  // remotefs
      563,  // nntp+ssl
      587,  // stmp?
      601,  // ??
      636,  // ldap+ssl
      993,  // ldap+ssl
      995,  // pop3+ssl
      2049, // nfs
      3659, // apple-sasl / PasswordServer
      4045, // lockd
      6000, // X11
      6665, // Alternate IRC
      6666, // Alternate IRC
      6667, // Standard IRC
      6668, // Alternate IRC
      6669, // Alternate IRC
    
P138webmin功能演示

比如修改语言设置,IP 访问控制,查看进程, 修改密码, 任务调度,mysql 等.

1.webmin-webmin configue-langage-simplechineseutf-8

刷新之后,全部都是中文

2.改用户名字 系统-change passworlds 然后可以修改各个用户的密码

3.在系统-cron任务调度

4.系统—进程管理器

P139bt宝塔介绍和安装
  • bt 宝塔Linux 面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA 等
    多项服务器管理功能。

  • 安装和使用

    cd /opt mkdir bt cd /bt

  • 安装: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

    先执行指令1,指令2 ,指令3

    完成后拥有

    外网面板地址: http://116.169.4.13:8888/8a823580
    内网面板地址: http://192.168.8.130:8888/8a823580
    username: lwq65vat
    password: 66d39a79

    安装成功后控制台会显示登录地址,账户密码,复制浏览器打开登录
    如果忘记密码 > bt default

1

P142面试题
分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯)

http://192.168.200.10/index1.html
http://192.168.200.10/index2.html
http://192.168.200.20/index1.html
http://192.168.200.30/index1.html
http://192.168.200.40/index1.html
http://192.168.200.30/order.html
http://192.168.200.10/order.html

cat t.txt | cut -d '/' -f 3 | sort |uniq -c |sort -nr
以/为分割的第三段排序uniq -c 统计 sort -nr排序
面试题 统计链接数

统计链接到服务器的各ip情况,按照连接数从大到小排序

netstat -an |grep ESTABLISHED |awk -F " " '{print $5}' |awk -F ":" '{print $1}' | sort | uniq -c | sort -nr

因为是空格用awk " "空格分割取出第五部分

找回Mysql的root密码 05:57
[root@shell38 ~]# systemctl status mysqld
-----  忘记密码了,登录不了MySQL5.7 
[root@shell38 ~]# mysql -u root -p

#1step2 进入 /etc/my.cnf 文件 加入一条指令 skip-grant-tables
[root@shell38 ~]# vim /etc/my.cnf
... 
...
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
# and the blow to skip password
skip-grant-tables             ------增加这句话

#step 3 重启 MySQL 服务 ,验证可以用空密码登录

[root@shell38 ~]# systemctl restart mysqld
[root@shell38 ~]# mysql -u root -p
Enter password:   ------此时输入一个空密码就进入mysql 里面了 

#step4 用空密码登录后进入 mysql 库 user 表 更改 root 用户的authentication_string 密码值

[root@shell38 ~]# mysql -u root -p
Enter password: ------此时输入一个空密码就进入mysql 里面了 
mysql> show databases;--------------显示库列表 

mysql> use mysql;-------------------进入mysql库

mysql> show tables;--------------------显示mysql库下面的表的个数

mysql> desc user;-------------显示user字段 
-------------------------------------倒数第五个authentication_string字段放的是密码 ,更新 root 密码为 root  
我的user表格为
authentication_string  | text                              | YES  |     | NULL  

mysql>  update user set  authentication_string=password("mysqlyangpwd") where user='root';
返回 Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> flush privileges;  -------------------------刷新权限
Query OK, 0 rows affected (0.00 sec)
mysql> exit  ----------------------退出 

step5 重新进入 /etc/my.cnf 文件 不再跳过密码
[root@shell38 ~]# vim /etc/my.cnf
...
# and the blow to skip password
# skip-grant-tables
...
[root@shell38 ~]# 
[root@shell38 ~]# systemctl restart mysqld  -----重启mysql服务
[root@shell38 ~]# mysql -u root -p ------用root 登录 
Enter password:   ----------------------输入密码 root
mysql> show databases;

P144__访问量排名和tcpdump 08:45
vim meituan.txt
统计ip 访问情况,找出访问页面数前两位的ip 

192.168.200.50  index.html
192.168.200.40  index.html
192.168.200.40  index.html
192.168.200.30  index.html
192.168.200.20  index.html
192.168.200.20  index.html
192.168.200.70  index.html

cat access.log | awk -F " " '{print $1}' | sort|uniq -c|sort -nr | head -2

显示头两行

用tcpdump 监听某个ip连接,将结果输出到tcpdump.log
#1.先输入查看是否安装tcpdum
tcpdum
#监听ens33这个设备 主机 端口
#tcpdump -i ens33 host 192.168.8.130 and port 22
#2.追加到上面
tcpdump -i ens33 host 192.168.8.130 and port 22 >> /opt/iw/tecpdump.log
Nginx模块用来做什么用(头条)

rewrite重写

access模块:来源控制

ssl模块:安全加密

ngx_http_gizp_Moudle 网络传输压缩模块

ngx_http_proxy_Moudle 模块实现代理

ngx_http_upstream_Moudle模块实现定义后端服务器列表

ngx_cache_purge实现缓存清除功能

P145权限划分(1) 17:47
ls -l
文件的权限含义: r w(编辑不包括删除) x 
目录权限含义 r(目录内文件列表的查看ls)
w:目录捏文件的增删复制剪切
x:能否进入目录的权限(cd)
权限修改 chmod 
  • 规则:r=4 w=2 x=1 rwx=4+2+1=7
  • chmod u=rwx,g=rx,o=x 文件目录名 等价于
  • chmod 751 文件目录名

权限分离:系统和数据库权限要分开

权限最小原则:满足使用情况下最少优先

减少使用root用户:尽量使用普通用户+sudo提权进行日常操作

重要的系统文件,比如/etc/passwd可以用chattr锁定,需要的时候打开

chattr +i /etc/passwd
#此时不能添加用户
[root@yangvm01 ~]# which chattr
/usr/bin/chattr
#可以该文件移动走
[root@yangvm01 ~]# mv /usr/bin/chattr /opt
#可以通过find找到这个指令
 find / -name chattr
/opt/chattr
#可以把这个名字改其他
mv /opt/chattr /opt/hh

然后还原之后(逆向)
chattr -i /etc/passwd

利用工具比如chkrootkit/rootkit hunter来检测rootkit脚本

#1
mkdir /opt/chkrootkit
#2下载
wget  ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
#此时无法解析主地址
#可以选择下载地址
http://www.chkrootkit.org/
#解决(没解决)
wget: 无法解析主机地址…解决
网络正常的情况下,查看resolv.conf文件
cd /etc
vim resolv.conf
如果配置文件里没有nameserver,那么说明没有配置好DNS。

由于resolv.conf是read-only,因此需要先修改权限:
sudo chmod a+w resolv.conf
再修改resolv.conf文件:
vim resolv.conf
按i键切换为插入模式,再添加如下代码:
nameserver 8.8.8.8
nameserver 8.8.4.4
按Esc键,再按:键,输入wq保存并关闭文件。

再次使用wget语句下载,发现依然报错。

进如 /etc/sysconfig/network-scripts目录
cd /etc/sysconfig/network-scripts
修改目录下对应网卡的配置文件(如ifcfg-ens33)权限:
sudo chmod a+w ifcfg-ens33
修改ifcfg-ens33文件:
vim ifcfg-ens33
按i键切换为插入模式,再添加如下代码:
ONBOOT=yes
DNS1=8.8.8.8
DNS2=8.8.4.4
按Esc键,再按:键,输入wq保存并关闭文件。

重启网络:
service network restart
切换目录:
cd ~

使用wget语句下载成功!

类似的有

wget http://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz

局域网内计算机访问FTP服务器时,提示“无法访问服务器名称或地址”,一般由三个原因造成:

一、防火墙未关闭

解决方法如下:

1、单击屏幕左下角的”开始“菜单

2、在弹出菜单中单击”控制面板“

3、点击”系统和安全“

4、点击”Winsows 防火墙“

5、单击左侧的”打开或关闭Windows防火墙“

6、在”家庭或工作网络位置设置“和”公用网络位置设置“两项里选择关闭防火墙,单击”确定“即可。

二、设置有误,FTP被动模式没有禁止。

解决方法如下:

1、打开浏览器,点击”工具“

2、在下拉菜单中点击”Internet选项“

3、单击”高级“,然后上下拉动滚动条查找”FTP被动模式“选项

4、去掉”使用被动FTP(为防火墙和DSL调制解调器兼容性)“前面的对号,然后单击“确定”即可。

三、FTP服务器设置了权限限制

解决方法如下:

1、在桌面“计算机”图标上单击鼠标右键,在弹出菜单中单击“管理”

2、然后在“本地用户和组”里面添加访问FTP服务器的用户,假设用户为js

3、在FTP服务器的主目录根文件夹上右键,选择“属性”。在“安全标签”下,单击“编辑”,然后选择“添加”,输入刚才添加的用户js单击“确定”

4、选择js,设置该用户的权限

5、打开“授权规则”

6、从右边选择“添加允许规则”,再设置一下js的权限即可。

然后解压启动 ./rootkit

还可利用工具Tripwire

P147Lunix面试题

在这里插入图片描述

注意第一级别是目录必须要有x,然后看文件确定w和r

删除看目录的权限

P148Centos7启动(面试)

img

第一步:硬件启动阶段

这一步和CentOS6差不多,详细请看CentOS6启动流程(含详细流程图)

第二步:GRUB2引导阶段

从这一步开始,CentOS6和CentOS7的启动流程区别开始展现出来了,CentOS7的主引导程序使用的是grub2。

本步的流程:

1. 先加载两个镜像;

2. 再加载MOD模块文件,把grub2程序加载执行;

3. 接着解析配置文件/boot/grub/grub.cfg,根据配置文件加载内核模块到内存;

4. 之后构建虚拟根文件系统,最后转到内核。

在这里grub.cfg配置文件已经比较复杂了,但并不用担心,到了CentOS7中一般是使用命令进行配置,而不直接去修改配置文件了。不过我们可以看到grub.cfg配置文件开头注释部分说明了由/etc/grub.d/目录下文件和/etc/default/grub文件组成。一般修改好配置后都需要使用命令grub2-mkconfig -o /boot/grub2/grub.cfg,将配置文件重新生成。

第三步、内核引导阶段

这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd

第四步、systemed初始化阶段(又叫系统初始化阶段)

CentOS7中我们的初始化进程变为了systemd。

本步的流程:

1. 执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关);

2. 然后执行sysinit.target来初始化系统和basic.target来准备操作系统;

3. 接着启动multi-user.target下的本机服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动;

4. 最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。

注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。

System概述(了解):systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的往来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。

与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:

A.采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;

B.用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。

unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)

(1)./etc/systemd/system/default.target

这是一个软链接,和默认运行级别相关

[root@localhost ~]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 11月  4 2019 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
 

[root@localhost ~]# cd /lib/systemd/system/
[root@localhost system]# ls *.target
basic.target           graphical.target           kexec.target           nss-user-lookup.target    rescue.target     shutdown.target   sysinit.target
bluetooth.target       halt.target                local-fs-pre.target    paths.target              rpcbind.target    sigpwr.target     system-update.target
cryptsetup-pre.target  hibernate.target           local-fs.target        poweroff.target           runlevel0.target  sleep.target      timers.target
cryptsetup.target      hybrid-sleep.target        machines.target        printer.target            runlevel1.target  slices.target     time-sync.target
default.target         initrd-fs.target           multi-user.target      rdma-hw.target            runlevel2.target  smartcard.target  umount.target
emergency.target       initrd-root-fs.target      network-online.target  reboot.target             runlevel3.target  sockets.target
final.target           initrd-switch-root.target  network-pre.target     remote-cryptsetup.target  runlevel4.target  sound.target
getty-pre.target       initrd.target              network.target         remote-fs-pre.target      runlevel5.target  suspend.target
getty.target           iprutils.target            nss-lookup.target      remote-fs.target          runlevel6.target  swap.target
这里可以看到runlevel开头的target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件,也算一种向下兼容吧

[root@localhost system]# ll runlevel*.target
lrwxrwxrwx. 1 root root 15 6月   1 2020 runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 6月   1 2020 runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 6月   1 2020 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月   1 2020 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月   1 2020 runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 6月   1 2020 runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 6月   1 2020 runlevel6.target -> reboot.target

可以看到我的default.target与runlevel3.target指向的是同一个文件,可以看出我的默认运行级别是3。

(2)./usr/lib/systemd/system/

这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/

(3)./run/systemd/system/

系统执行过程中产生的脚本

(4)./etc/systemd/system/

类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接

P149Linux高级命令
netstat/网络状态监控 top//系统运行状态 lsblk/查看硬盘分区
ps -aux查看运行进程 chkconfig/查看服务系统启动状态 systemctl /管理系统服务器

查看内存,io读写,                      磁盘存储,  端口占用             进程查看
top     iotop先安装yum install iotop  df -lh     netstat -tunlp   ps -aux | grep sshd

张三 40
李四 50
五五 60

cat t2.txt | awk -F " " '{sum+=$2} END {print sum}'
输出150
P150写脚本查询一个文件是否存在
if [ -f 文件名 ] then echo "存在" else echo "不在" fi
写脚本对t3.txt中无需的一列数字查询,并且将总和输出
sort -nr t3.txt/倒叙
sort -n t3.txt、正序
sort -nr t3.txt| awk '{sum+=$0} END {print sum}' 输出最后
sort -nr t3.txt| awk '{sum+=$0;print $0} END {print sum}' //每条完成后输出
写出/home下所有的文本文件中包含字符Cat的文件

复习 find /home -name hello.txt

grep -r "cat" /home
 grep -r "cat" /home | cut -d ":" -f 1 //取出名字

ls -al 显示所有

查询目录下所有的文件的个数,所有文件总行数
find /home/test -name "*.*" | wc -l
find /home/test -name "*.*" | xargs wc -l
P151了解web服务器负载架构

Ngix

Haproxy

Keepalived

LVS

每天晚上10:30分 ,打包站点目录/var/spool/mail备份到/home下每次备份都按时间生成生成不同的备份包

TIME=$(date "+ %Y%m%d%H:%M:%S")
    
#!/bin/bash
cd /var/spool/
#打包
/bin/tar -zcf /home/mail- `date` .tar.gz mail/
                

如果脚本 没有执行权限可以***** * * * * /bin/sh /xxxx.sh

如何优化Linux系统

1.对Linux的架构优化

2.对linux系统本身的优化

(1)不用root用sudo提示权限

(2)定时的自动更新服务时间:nptdate npt1.aliyun.com让croud定时更新

(3)配置yum源,指向国内镜像

(4)配置合理的防火墙策略打开必要端口,关闭不要的端口

(5)打开最大文件数(调正文件的描述数量 vim /etc/profile ulimit -Shn 655535

(6) 配置合理的监控cl

(7) 对安装的软件进行优化如nginx,apache

(8)配置合理的系统文件的备份策略

(9)内核参数的优化 /etc/sysctl.conf

(10)锁定一些重要的文件 chattr /rtc/passwd

(11) 禁用不必要的服务 setup

Another app is currently holding the yum lock; waiting for it to exit…

另一个应用程序是:PackageKit

内存: 31 M RSS (451 MB VSZ) 已启动: Wed Aug 17 09:08:40 2022 - 00:59之前

状态  :睡眠中,进程ID:2833
解决办法:
1|rm -f /var/run/yum.pid

然后重新运行yun命令即可

1.使用kill命令杀掉

ps aux | grep yum(查询有关yum的进程,找到那个更新进程)
kill -s 9 pid (上一步找到pid后直接杀掉)

2.有可能杀不掉

可以通过强制关掉yum的进程
rm -f /var/run/yum.pid

然后你再试试你的yum源就可以使用了!
注:以后更新yum的时候尽量别中断哈,要不就找个最新的yum源文件。
yum install lrzsz.x86_64

乱码

xshell中出现中文乱码解决方法

一、问题原因:

1、远程登录的Linux系统服务器编码问题;

2、本地的系统的编码问题;

3、远程服务器和本地系统编码不一致导致。

二、解决方法:

1、Linux系统编码问题,服务器主机一般不能随便修改配置,甚至普通人都没有权限修改配置。一般不推荐!

(1) 执行locale命令查看系统语言,如下图;

(2)设置系统环境变量LANG为zh_CN.UTF-8,export LANG=zh_CN.UTF-8

或者编辑文件:vim /etc/sysconfig/i18n

2、本地的系统的编码问题;

设置为Unicode (UTF-8):File->Properties

点击选择UTF-8

3、远程服务器和本地系统编码不一致导致:

查看远程服务器的编码和本地系统的编码是什么格式,调整一致即可。

要么修改Linux环境变量LANG,要么修改Xshell终端编码。

NAVicat

https://www.cnblogs.com/xisheng/p/14690282.html

在vim找寻文件,直接esc /xxxx想找内容

ps -ef | grep xxx 出现线程

level开头的target文件,对应着CentOS6的启动级别,不过一样是软链接,指向了同目录下的其他文件,也算一种向下兼容吧

[root@localhost system]# ll runlevel*.target
lrwxrwxrwx. 1 root root 15 6月 1 2020 runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 6月 1 2020 runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 6月 1 2020 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 1 2020 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 6月 1 2020 runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 6月 1 2020 runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 6月 1 2020 runlevel6.target -> reboot.target

可以看到我的default.target与runlevel3.target指向的是同一个文件,可以看出我的默认运行级别是3。

(2)./usr/lib/systemd/system/

这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/

(3)./run/systemd/system/

系统执行过程中产生的脚本

(4)./etc/systemd/system/

类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接


##### P149Linux高级命令

netstat/网络状态监控 top//系统运行状态 lsblk/查看硬盘分区
ps -aux查看运行进程 chkconfig/查看服务系统启动状态 systemctl /管理系统服务器


查看内存,io读写, 磁盘存储, 端口占用 进程查看
top iotop先安装yum install iotop df -lh netstat -tunlp ps -aux | grep sshd


张三 40
李四 50
五五 60

cat t2.txt | awk -F " " ‘{sum+=$2} END {print sum}’
输出150


##### P150写脚本查询一个文件是否存在

if [ -f 文件名 ] then echo “存在” else echo “不在” fi


##### 写脚本对t3.txt中无需的一列数字查询,并且将总和输出

sort -nr t3.txt/倒叙
sort -n t3.txt、正序
sort -nr t3.txt| awk ‘{sum+=$0} END {print sum}’ 输出最后
sort -nr t3.txt| awk ‘{sum+=$0;print $0} END {print sum}’ //每条完成后输出


##### 写出/home下所有的文本文件中包含字符Cat的文件

> 复习 find /home -name hello.txt 
>
> ```
> grep -r "cat" /home
>  grep -r "cat" /home | cut -d ":" -f 1 //取出名字
> ```
>
> ls -al 显示所有

##### 查询目录下所有的文件的个数,所有文件总行数

find /home/test -name “.” | wc -l
find /home/test -name “.” | xargs wc -l


##### P151了解web服务器负载架构

> Ngix
>
> Haproxy
>
> Keepalived
>
> LVS

###### 每天晚上10:30分 ,打包站点目录/var/spool/mail备份到/home下每次备份都按时间生成生成不同的备份包

TIME=$(date “+ %Y%m%d%H:%M:%S”)

#!/bin/bash
cd /var/spool/
#打包
/bin/tar -zcf /home/mail- date .tar.gz mail/


> 如果脚本 没有执行权限可以*****  * * * * /bin/sh  /xxxx.sh

##### 如何优化Linux系统

1.对Linux的架构优化

2.对linux系统本身的优化

(1)不用root用sudo提示权限

(2)定时的自动更新服务时间:nptdate npt1.aliyun.com让croud定时更新

(3)配置yum源,指向国内镜像

(4)配置合理的防火墙策略打开必要端口,关闭不要的端口

(5)打开最大文件数(调正文件的描述数量 vim /etc/profile ulimit -Shn 655535

(6) 配置合理的监控cl

(7) 对安装的软件进行优化如nginx,apache

(8)配置合理的系统文件的备份策略

(9)内核参数的优化 /etc/sysctl.conf

(10)锁定一些重要的文件 chattr /rtc/passwd

(11) 禁用不必要的服务 setup

# Another app is currently holding the yum lock; waiting for it to exit...
## 另一个应用程序是:PackageKit

## 内存: 31 M RSS (451 MB VSZ)    已启动: Wed Aug 17 09:08:40 2022 - 00:59之前
    状态  :睡眠中,进程ID:2833

```bash
解决办法:
1|rm -f /var/run/yum.pid

然后重新运行yun命令即可

1.使用kill命令杀掉

ps aux | grep yum(查询有关yum的进程,找到那个更新进程)
kill -s 9 pid (上一步找到pid后直接杀掉)

2.有可能杀不掉

可以通过强制关掉yum的进程
rm -f /var/run/yum.pid

然后你再试试你的yum源就可以使用了!
注:以后更新yum的时候尽量别中断哈,要不就找个最新的yum源文件。
yum install lrzsz.x86_64

乱码

xshell中出现中文乱码解决方法

一、问题原因:

1、远程登录的Linux系统服务器编码问题;

2、本地的系统的编码问题;

3、远程服务器和本地系统编码不一致导致。

二、解决方法:

1、Linux系统编码问题,服务器主机一般不能随便修改配置,甚至普通人都没有权限修改配置。一般不推荐!

(1) 执行locale命令查看系统语言,如下图;

(2)设置系统环境变量LANG为zh_CN.UTF-8,export LANG=zh_CN.UTF-8

或者编辑文件:vim /etc/sysconfig/i18n

2、本地的系统的编码问题;

设置为Unicode (UTF-8):File->Properties

点击选择UTF-8

3、远程服务器和本地系统编码不一致导致:

查看远程服务器的编码和本地系统的编码是什么格式,调整一致即可。

要么修改Linux环境变量LANG,要么修改Xshell终端编码。

NAVicat

https://www.cnblogs.com/xisheng/p/14690282.html

在vim找寻文件,直接esc /xxxx想找内容

ps -ef | grep xxx 出现线程

c’s

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值