教大聪明学Linux

Linux基础

1、环境的搭建

1) 下载Linux镜像后,安装VM虚拟机,激活请进行百度“VM版本激活码” 来获取激活码,比如“VM16PRO激活码” ,安装-激活VM后创建虚拟机 ,最小安装请在安装界面时就点击“这个

 

2)  使用“MobaXterm” 连接CentOS

首先下载“MobaXterm” 然后使用“ip addr”使用获取IP,使用“SSH”方式输入IP连接

 

3) 中文模式:帮助文档改为中文与命令提示,点击查看教程

2、在Linux上安装软件或服务:

 

   现在最主要的发行版本是“红帽”的CentOS与"debian"的ubuntu,用作服务器的就是CentOS, 在Linux上安装软件或服务只有两种“源码包”与“二进制包”,二进制在window上就是.exe,  但在Linux红帽发行版本是.rpm,debian发行版本是.deb ,但在Linux上如何单纯地用二进制包安装,会有依赖问题。即你安装一个.rpm,可能这个rpm要依赖其它的.rpm,但又没有。此时你要安装的.rpm就安装不了。而包管理器就可以解决这个问题,当然红帽、debian的包管理器不是同一个。红帽是yum,即使用yum命令,而debian是apt-get或apt(代替apt-get).包管理器是一种在线安装的方式,通过网络向远程仓库获取二进制包,进行安装,可以解决上面据说的依赖问题。

  两种安装方式安装的选择,源码包比二进制包更好,体现在性能、源码可见。但需要自己手动编译安装。两种方式如何选择呢,如果要安装给外部多人访问的具有服务性的,最好选用源码包的形式进行安装,如果是个人使用,比如播放器等,推荐使用二进制的方式,因为这样更方便。

1)CentOS包管理器安装:

下载加速设置:默认是外国的源,一般先备份原生yum源,再替换为第三方的(国内)

加速(替换远程仓库的地址):  

       #yum 的仓库源在 /etc/yum.repos.d 目录下默认yum唯一生效的源是/etc/yum.repos.d/CentOS-Base.repo,这是由配置.repo文件内部决定是否生效的。所以替换的话。 只需修改生效的源改变后缀即可,然后再下载其它源放在该目录下即可。

       mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.back   #移动式重命名文件

  wget -O  /etc/yum.repos.d/   http://mirrors.aliyun.com/repo/Centos-6.repo   #下载.repo文件到/etc/yum.repos.d/目录下

命令:

       yum install/update/remove vim  #安装vim文本编辑器,自带vi编辑器

2)源码包安装

     环境:gcc     即:yum -y install gcc 

      一般步骤是:去官网下载源码包(tar.gz、tar.bz2、..) ——> 解压进入——>"./configure --prefix 安装路径" ——> make  ——> make install

     在报错时,执行“make clean”进入清扫,执行make install命令之后报错时,不但要执行“make clean”命令,还要删除掉安装目录

 

3、学习常用命令

(在Linux上一切皆文件)

 

 详细:

 

 

❤️ 常用的目录还有:

/lib/systemd/system/*.service   #目录下面是服务(.service)文件

/etc/profile        #对所有用户都生效的“环境变量”配置文件

~/.bashrc          #只对当前用户生产的“环境变量”配置文件    点击查看境变量配置示例 

 

...

 

 

 

❤️ 常用命令:

pwd   #查看当前所在位置绝对路径

mkdir  note #创建一个"note"的文件夹,note还可以是一个路径 /tmp/note如果不存在会创建,但不会创建多及目录

cd  note   #进入当前目录下的note文件夹, note可以是个路径比如/dev/sdb5

ls  -a  #列出当前目录的内容

ll        #列出当前目录的内容及属性,请问"ls"与“ll”的区别是?

         

           1)d代表是文件夹, “-”普通文件、“d”目录、“l” 代表是一个软链接

           2)rwxr-xr-x 其它就是rwxr-xr-x 分别是文件或文件夹所属者、所在组用户、其它组用户 分别拥有的对该文件的权限,r是读w是写x是执行

           3)2 文件数

     4)root root  是所属的 用户

           5)21 文件大小

           ✳️如何修改权限?(重要)

           chmod  a+rwx 大聪明专区文件夹  #a代表所属者(u)、所在组用户(g)、其它组用户(o) 三者, 代表给全部类型的用户添加rwx三种权限

           假设用4-2-1代表r-w-x,那么我们想设置文件的权限为r--rw-rwx 就可以用467即可,所以第二种方式可以用数字来代表要设置的权限

           chmod  777 大聪明专区文件夹    

           ✳️文件与文件夹的默认权限

           #需要想看用户的 nmask值,然后文件最大权限是666,即创建的文件权限是666-nmask值得出; 文件夹最大权限是777,即创建的文件夹默认权限是777-nmask值,得到。

           ✳️如何修改所属? (重要)

           首先要知道如何创建一个用户及组 :groupadd  mysql  #创建一个mysql组   useradd -g  <组名>  <新用户>   #创建一个用户   groups user1 #查看user1所属的组

           chown  <用户>:<组>  大聪明专区文件夹

            ✳️如何设置ACL权限?

            # 什么情况下使用ACL权限?平时的权限就是所属者、所属组用户、其它用户权限,所以我们就会遇到一种问题,在上课,会用到文件分享等,老师是所属者rwx,学生是所属组rwx,其它班级不应有任何权限,但如果有一个暂时来学生(listen)来听课。我们要于的权限是rx, 这样我们就实现不了,所以需要用到ACL权限,比如“/www”目录是共享文件:

            setfacl -m u:listen:rx -R /www      #给现已存在的/www目录及内容文件listen用户ACL权限为rx

            setfacl -m d:u:listen:rx -R /www   #给于listen用户ACL权限为rx,d是默认在在文件夹下以后要创建的文件都有rx权限,注意除了是“u”,还可以是"g"——组

            getfacl  /www

            setfacl -b -R /www

            ✳️sudo 权限

            visudo    #编辑sudo权限

            root  ALL=(ALL)  ALL  #(第一个ALL指网络中的主机;第二个ALL指目标用户,以谁的身份运行命令;第三个ALL指命令名)

touch  test.sh #创建一个文件  

vim test.sh     #使用vim编辑器编辑test.sh文件...

      “a” 切换编辑模式(刚进入是查阅模式)

      “Esc”  切换为查阅模式

      “Ctrl+F” 下一页, "查阅模式"

      “Ctrl+B”  上一页, “查阅模式”

       "/大聪明"  在查阅模式下查找“大聪明”,满足的内容会高亮显示

       ":set nu"  显示行号

       “:wq!”  保存并退出

       “:q!”    忽略更改,强制退出

       ":! cmd"   执行cmd命令,, 暂时退出vim,回车回来

       ":r ! cmd"  将执行cmd命令的输出变为输入

       ":map ^p I#<ESC>"   Ctrl+P在行前自动插入,更多请自行学习,  长期:vim ~/.viminfo

       ":ab myemail  21192nnnfs@163.com"   #文字替换,使用输入“myemail” 回车就变为了  21192nnnfs@163.com,   长期:vim ~/.viminfo

        "vim -O file1  file2"   #左右编辑file1与file2文件,上下小写o,   长期:vim ~/.viminfo

         "gg" 转到文本第一个字符

          “shift+g” 转到最后一个字符

          “shif+^/$” 转到行首行尾

        

cp -r bb cc   #文件夹:将bb文件夹及里面的所有文件{ 如果cc不存在复制成为cc | 如果存在复制到cc目录下,此时cc下有bb  }

mv bb cc       #与cp一样,只不过这是移动,源文件会消失。 除此还可以用来对文件或文件夹的重命名

rm -rf   删库跑路      #删除文件或文件夹,是直接删除的,这就是“删库跑路” ,rm -r  是有提示的,但文件是一个个删的,文件比较多就很麻烦   

       

 

 ln   #创建链接(软链接、硬链接)

      ln -s  <源文件或文件夹>  <将由哪个文件夹或文件冒牌>   #创建的是一个软链接(快捷方式)   

      ln   <源文件>  <目标文件>   #创建一个硬链接(不常用),注意目标文件是一个真实的文件,它的信息与源文件同步更新

      🤔问题:硬链接权限区第一个字符是“l” 吗?  

      ✳️ 文件或文件夹的颜色表示的意义

     

 tar  #解压、压缩命令

     在Linux上,.tar.gz、tar、 tar.xz 是常见的压缩包

     

 

 

     tar -zxvf mysql.tar.gz #解压   -xvf=默认=智能解缩(未认证)

     tar  -zcvf   mysql.tar.gz  mysql  #压缩命令, 将mysql 文件夹压缩成mysql.tar.gz         -cvf=默认=-zcvf

     tar  -ztvf   mysql.tar.gz  mysql   #查看不解压

     如果是zip, 需要安装使用到zip与unzip

     unzip test.zip  #解压zip文件

     zip -r test.zip test   #压缩成zip文件

 

左边的输出 右边作为流入                #管道符

cat 小说.txt                                     #打印文本

cat 日志.log | grep 运行成功              #列出匹配成功的行  

lsof -i:80                                       #查看80端口被哪个程序占用

kill -9 PID                                     #根据进程的PID杀死进程

ip addr                                         #查看ip ,还有一种方式 “ifconfig”

ps -ef | grep java                          #“ps -ef”列出所有进程信息,通过管道符“|”交给grep处理  

find /usr/local -name mysql          #从根目录下搜索mysql 

tail -f /tmp/run.log                      #默认输出最后10行,并进行监听文件的增长情况,比如该文件新追加了一行信息,它也会跟着输出,直到你按Ctrl+C

md5sum mysql.tar.gz                    #计算和校验文件的MD5值

 

firewall-cmd --zone=public --add-port=80/tcp --permanent   #永久开放80端口

firewall-cmd --reload                    #开放了端口,需要重启防火墙

crontab                                         #定时任务

          crontab -l  #查看定时任务,每一行代表一个定时任务

          crontab -e   #修改定时任务     " *  *  * * *      cmd "  分别是分钟、小时、天 、月、周 

          示例:每一天的8:00  :  00 8 * * *

                    每月的第1天与第5天:  *  *  1,5 * *

                    第每的第1天到第5天:  * * 1-5 * *

                    

 alias  root="ls -l /"   # root命令等于ls -l / ,  示例2: alias ll="ls -l"   ll / 等于ls -l /  

                                  #但这是临时的,如果是永久,那么需要将该命令追加环境变量中占用一行,然后“source 环境变量配置文件”

mount    #挂载

         iso挂载:  mount  /dev/sr0  /mnt/iso        卸载:umount   /mnt/iso   或umount    /dev/sr0 

         USB挂载:  mount  -t  vfat -o iocharset=utf8  /dev/sda1  /mnt/usb   #以-t指定挂载分区的文件系统,可以写到“auto”自动识别文件系统 -o中文不乱码,还可以指定挂载后的权限,比如只读   卸载:方式不变

  挂载windows盘:   mount -t ntfs-3g /dev/sda1 /mnt/windows   #注意可以不支持ntfs-3g,原因应该是没有对应的驱动

        上面的操作是临时的,如果想要永久修改: 要编辑 /etc/fstab,改错,系统起不来!!,可以用  "mount -a" 检测,但不完全靠谱

        

分区知识: 一个硬盘的格式有两种,MBR与GPT,MBR格式决定了一个硬盘最多只能分四个分区,可以是主分区(存储数据)、与扩展分区,因为最多 只能有四个分区,所以我们需要创建扩展分区,创建扩展分区后,该扩展分区序号为5,第一个扩展分区必为5。后面我们创建的主分区是建立在扩展分区上的,改名为创建逻辑分区(l),且MBR决定了每个分区最大为2T。而GPT可以说几乎没这些限制。所以我们在分区GPT时,没有创建逻辑分区这个选项。

  fdisk  /dev/sda     #该命令用于给MBR格式硬盘分区。 分区流程如下图: 创建分区, a代表第一个sd盘,一个盘最多分四块,每一块可以是存储分区或扩展分区,  注意创建扩展分区后,l是p,一样的l是逻辑分区,是建立在扩展分区上的存储分区   ,视频教学:https://www.bilibili.com/video/BV1ut411a7ro?p=93

     

     

    t    #可以手动改变分区格式,l能列出分区情况 

  parted  /dev/sda    #该命令用于给GPT、MBR格式硬盘,进行分区。使用方法与“fdisk” 差别不大。

      help(或m)                                #帮助

    print(或p)                               #对应fdisk里面的p,可以 p回车补全。

         mklabel GPT                         #改变硬盘的格式为GPT,注意这会使硬盘的内容全部丢失。

         mkpart                                  #创建一个分区,注意现在的parted只能创建ext2 ,其它格式需要退出parted使用mkfs来进行格式化

         rm                                         #删除分区

              quit                                       #退出parted       

       mkfs -t ext4  /dev/sdb1           #分区格式化,分好后需要格式化才能使用 

       mount   /dev/sdb1 /tmp/ssb    #挂载

       vim /etc/fstab                          #自动挂载   ,注意这个文件不能乱修改  /dev/sdb1(要挂载的分区)      /disk1(挂载为目录,挂载后,该目录文件暂时不可见)   ext3  defaults    1   2

                                                      #修复由于修改/etc/fstab 文件发错而导致的无法启动,在启动报错页面-> 输入密码root -> 修改 / 根挂载的权限为rw , “ mount -o remount,rw / ”,因为此时是读,无法保存修正 -> 去修正 -> 重启  

 

df    -h                                     #查看分区使用情况,及挂载位置

du -sh ./mysql.tar.gz              #查看指定文件的大小

swap交换分区  # free -h不仅能查看我们的内存还能查看交换分区,交换分区当我们内存使用完后或一定量后,能开始使用我们的交换分区,如果边交换分区也使用完了,不要慌,我们可以来加,即创建一个swap分区,然后格式-挂载即可。

      1、创建一个主分区后,我们  l 查看所有的格式的序号,用 t  改变分区格式为swap 

      2、mkswap /dev/sda2   #格式化sda2  swap分区

      3、swapon  /dev/sda2  #挂载指定 swapp,此时free -h 就可以查看我们的swap大小改变了

      4、vim /etc/fstab          #加入自动挂载

      4、swapoff  /dev/sda2  #卸载指定 swap

 

shutdown -h  5:00  #5:00关机,  示例2:shutdown -r now  #立即重启

        -h  #关机

        -r   #重启

        -c   #取消已执行shutdown命令

       注意:shutdown是安全的是最建议的,reboot也是安全的,但使用halt关机是不安全的,不建议使用  

 nohup cmd  > file  2>&1 & #如果执行命令,它会占用shell,Ctrl+C又会将程序kill掉,这里就需要将它放在后台运行了,且把错误信息同正确输出。

   

磁盘配额   #限制用户或组在一个分区中存储的文件大小或i节点,  内容:略

LVM         #逻辑分区

 

 

5、快捷键加快效率

基本的:Tab补全、Ctrl+c强制终止正在运行的命令

常用的:alt+y粘贴、ctrl+a 回到命令前、ctrl+e回到命令尾部、ctrl+u删除当前行命令、ctrl+l清屏

 

6、shell脚本基础:  

                              

 

概述: 要linux上的shell是base, 现在的sh也变为了base, 而苹果Mac上是csh.shell编程是最简单的编程,它不需要考虑效率问题,一般就是自己使用的。简化工作的。

 

 

脚本 : 脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行。它通过解释器解释运行。

 

1)在if或for都是需要判断的,注意:首先需要知道:
  ""与'' ,                        字符与字符中变量      单引号代表里面的内容都是字符串,不需要解释变量。 双引号相反,有变量就进行替换比如"输出$a"
  [[ 与 [ 的区别是?           逻辑判断                   [[ 恐怖如斯,但[功能比较少,与或非逻辑运算是不支持的
  ``与$()                          命令替换                   主要是用于命令替换或说子命令或说子查询;嵌套用法`cmd1+\`cmd2\`` , $(cmd1 $(cmd2)) 示例:echo `ls -n \`echo "/tmp"\` | grep www`
  $变量 与 ${}                  变量替换                   比如有个变量a,怎么输出? $a 或 ${a}
                                                                ${} 的特殊功能,${xv:0:5} 对xv变量字符串,进行截取0索引到5索引、 ${xv:-3} 截取倒数后三个字符


2)判断分为几个类型的判断!  []  [[ ]]
  实体判断
    -d dir         判断文件夹是否存在
    -f file         判断file文件是否存在且为普通文件
    -r/w/x file  分别判断当前用户下是否可读、写、执行
  数值判断
    A -eq B     相等
    A -lt B       小于
    A -gt B      大于
    A -le B       小于等于
    A -ge B      大于等于
    A -ne B       不等于
  字符判断(注意空格)
    'A' == 'B'      等于
    'A' != 'B'       不等于

 

3)如何在运行过程中输入数据?
  read o
  或
  echo "检测到你还没有安装git,需要安装吗?(y/n)"; read o

 

4) 如何在在执行脚本前输入数据?
  ./test.sh 1 2 3                            #在脚本中声明了$1、$2、$3变量,值分别是1、2、3

5)如何声明一个数组?

  array=( value1 value2 value3 ... )  #声明连续的元素,它们对应的索引就是 0,1,2...  访问:${array[索引]} 

      array[nb] = '666'                        #声明k-y ,读取时可以是索引也可以是key,即${array[nb]} 

      ${#array[*]}                              #获取数组的长度

6)如何将字符根据某个字符进行切割成数组?

str='192.168.87.103'

OLD_IFS="$IFS";IFS="."
  array=($str)
IFS="$OLD_IFS"
for i in "${!array[@]}";do
   echo "$i=>${array[i]}"
done

 

7)如何将字符进行替换

file='-dir-dir-dir-'
echo ${file/dir/path} 将第一个 dir 提换为 path   输出: -path-dir-dir- echo ${file//dir/path}     将全部 dir 提换为 path 输出: -path-path-pathh-

 

8)基本结构说明

#!/bin/bash           
#声明使用什么什么解释器运算该脚本,当前是bash,除此还有sh,bash兼容sh,同时sh是bash的一个软链接
# 判断结构
if [ -d '/tmp/www' ];then 
echo '文件存在!' elif [[ `ls -a /tmp | grep www | wc -L` > 0 ]];then
echo '我看了,文件真的存在!'

else
echo '我看了,文件不存在!' fi #循环结构 for val in 1 2 3;do echo val done

 

echo  "Hello,world!";    #你可以使用echo 输出, 如果想要不换行输出 “-n”  ,如果要输出十六进制数或输出具有指定颜色的字要使用"-n"

                                    echo -n "不换行";

                                    echo -e "\u8f93\u51fa\u5341\u516d\u8fdb\u5236";   #输出十六进制 ,你可以进行Unicode与中文互转 16进制

                                    echo -e "\e[1;32m 成功! \e[0m";                              # 32代表绿色,31是红色 

运行shell脚本:   赋于执行权限(chmod  777 ./test.sh)   直接运行./test.sh ,或bash ./test/sh 运行

history    #shell历史命令,查看当前用户下的历史命令,即cat ~/.bash_history     ;-c  清空   -w 将缓存中的命令写入到文件,除此还可以对历史命令进行更多操作

source /etc/profile   #或  “.   /etc/profile”, 重新加载这个文件的shell命令

>>  与>与 < 与<<  #向右的是输出流,向左的是输入流; 

            ls / >> /tmp/run.log  #将ls /命令的输出以追加的方式保存在 /tmp/run.log文件中,如果要覆盖是“>”   ,注意这保存的是命令成功的执行命令才存到, 如果你执行了一个不存在的命令,会报错,此时是直接在控制台输出的,而不是保存在文件中,如果不管怎样都不存在什么信息都输出在文件中,可以这样“ls123  >> /tmp/run.log”  2>&1 " 或 “ls123  &>> /tmp/run.log”  ”, 如果想执行存在的命令与执行不存在的命令分开保存,可以 这样“ls -a >> /tmp/run.log  2>> /tmp/run.err.log”

 

输出  |  wc  -L  #wc命令的功能为统计指定文件中的字节数、单词数、行数, 并将统计结果显示输出        

       -l, --lines 打印行数
  -L, --max-line-length 打印最长行的长度

分号“;”   #可以一行执行多个命令如:  “ ls / ; date  ”  他们互不影响

&& 与 ||  #是逻辑运算,&&当左边OK时,右边才会执行,|| 是当左边不OK时右边才执行。  运用模拟if语句:    ls123 && echo yes || echo no

grep 与find  #grep是查找字符串的,而find是查找文件名的,所以find可以用来查看文件  find / -name "java"

特殊符号:  ' ' 单引号时里面的内容就是单纯的字符;“ ”双引号时,里面可以是变量  $变量名、$(命令)或`命令`

bash         #当我们执行base时,会在当前bash开一个子bash, (cmd)  括号中的命令是在子bash中执行的,而{cmd} 则是在当前bash下执行的。区别是不同bash程序下,声明的变量是不通的

            #是脚本的注释

             #是转意字符  echo "$v"  这样会输出变量v的变量,但如果是echo "\$v"则输出 $v  

 赋值       #我们在赋值时,“=”号两边是不能存在空格的,且如果值是字符且中间有空格,那么一定要用引号  name="小  庄“ 而不能是name=小  庄

变量的分类  #变量分为 用户自定义变量、环境变量(用户自定义、系统自带)、位置参数变量 、预定义变量 ; 环境变量名介意使用大写

环境变量     #set可以查看环境变量,但不全,而env可以查看几乎全部的环境变量,但只能查看系统自带的环境变量

                   set  变量名=变量值    #变量的声明

                   set -u  再输出变量时,若该变量 不存在会报错,不执行它前没有时只输出一个空行。

      export 变量名=变量值    #用来声明一个环境变量,特点是bash共用的变量

                       PATH  环境变量是系统自带的环境变量,是系统查找命令的路径

                                 PSI      可以修改命令提示符 “ zhuangjie@zhuangjie-WRT-WX9:~/note$ ” 的显示的格式 

                                 LANG      是系统的环境变量,可以查看当前使用的语言

            locale       查看已安装的语言

     位置参数: 向脚本中传参,如“  ./start.sh  11 22 33 44 ”  我们可以在脚本内使用  $1   $2  $3 获取(超过9指定使用${ }),#*可以查看全部参数, $#是参数个数,#@ 以一个一个的方式输出,可以用来遍历。 

$((   ))     #用于数学运算 ,而$(    )    放的是命令

预定义变量:   echo $? 可以输出上一次运算是否成功,0代表无错误运行。  echo $$ 可以输出当前进程的PID; $!代表后台运算的最后一个进程

read -t 30 -p "请你输入第一个数字:"  num1              #可以输让脚本进行输入数据。  -h 指定字符数、-s  隐藏   -t等待时间  -p 提示输入

declare    #声明有数据类型的变量,我们在声明时环境变量时用的 export 是declare的简写,可以用来声明环境变量,declare -x k=v   而查询: declare -p PATH

一个计算器的shell示例:

#!/bin/bash
read -p 'one num1:' num1
read -p 'operator:(+/*\):' operator
read -p 'num2:' num2
[ "$operator" == "+" ] && echo $(( $num1 + $num2 )) && exit
[ "$operator" == "-" ] && echo $(( $num1 - $num2 )) && exit
[ "$operator" == "*" ] && echo $(( $num1 * $num2 )) && exit
[ "$operator" == "/" ] && echo $(( $num1 / $num2 )) && exit

echo "Error!"

变量测试     #  x=${name=新值}   如果name变量没有值,"新值"就是x的值,如果有name的值就是x的值,根据x的值判断name的值。

环境变量加载顺序

 

ssh登录欢迎信息:    /etc/motd  通过在这个文件中加入欢迎语句,我们在登录时就会显示。 From woner :  This is zhuangjie's pc,illegal user Please exit now!

ssh 本地六大终端的登录提示信息:  修改 “/etc/issue”  文件  

stty -a   #查看快捷键,也可以修改,比如 stty iner ^p ,意思是Ctrl+p强制退出。

grep  是用来筛选行的。我们可以通过正则匹配到想要的行。grep的使用方法放在下面的正则部分

自启动:如果想写在系统固定执行文件,vim  /etc/rc.local ,如果想创建自启动文件: vim /etc/profile.d/<脚本名>.sh

基础正则:   

  grep "a"  file   #这样是说查出包含"a"的一行。 如果我们要找出至少2个"a"的一行呢,那就是 grep  "aaa*"  ,引出了“*” 意思是*前面的一个字符含有0个或多个;  还有比如  grep "saa*id" file  是找出s-id之间必须含有一个a, 那么我们叫s与id是限位符;  更多:

    [a-z] 代表一个多形态的一个字符,  [A-Z] [abc]、[0-9] 、 [a-zA-Z] 特别的[^a-z]代表除小写字母后的其它字符。

              .   点是代表任意一个非换行符的字符

              限位符:  ^开头    $结尾

              a\{3\}: 代表三位a字符,特别的,如果没有限定符跟 a\{3,\} 是一样的效果代表的是3位或多于3位的a,  所以^a\{3,6\}$ 则是找出含有a到6位的a的一行

              \  是转意的意思

  grep -v "root" file  #取不含root的行,-v是取反的意思

       示例: grep -v "root" /etc/passwd | grep "/bin/bash"   #找出可以登录ssh我们创建的用户

扩展正则: + 一个或多个  ?0个或1个  ()与 |  一般一起用,如下示例,扩展正则是完整的正则在使用时使用egrep或grep -E 正则 file 

匹配IP的正则示例: grep -E "^((1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5]))\.){3}(1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5]))$" ips.txt     实质只是   1?[0-9]{,2}|(2[0-4][0-9])|(25[0-5]))  ,而它是由第个块范围是0-255 , 即百十个位 

                                             0    0-9   0-9

                                             1    0-9   0-9

                                             2    0-4   0-9

                                                   5      0-5

cut  提取列: cut  -d "," -f   2,3 file   ,提取file文本中第一行以“,”作为列的分隔符, 提取出2,3列。 除此 -c  2-3  可以提取每行的第2-3 字符。有明显的一些缺点,无法以空格+ 作为列分隔符

awk  #当我们cut无法解决时,我们需要使用便强大的工具了,awk 可以筛选行&筛选列。awk也算是一门编程语言,很多结构都有。而我们要掌握的就一点即可。

  df -h |  awk  'BEGIN{FS=" "} $6 ~ /\/$/ {split($5,arr,"%");printf arr[1] "\t"} END{print "\nexec done!"}'         

    这是awk比较完整的写法,其实我们可以简化我们需要掌握的东西,

    BEGIN是在整体处理之前执行可以用来指定分隔符,而我们也可以通过“-F” 来指定分隔符。END是处理完后执行,非常少用;

    NR是当前行,NF是当前列,FS指定分隔符, $0是当前处理的行、$n是当前行的第几列这些都是内置变量;

              printf不换行,需要“\n”来换行,注意字符需要用双引号括起来,print自动换行。

 

    $3 ~ /正则/ 通过当前行的指定列来匹配行,/正则/ 通过当前行来匹配行; 

  故可简化为:

       df -h |  awk  -F ' '   ' $6 ~ /\/$/   {split($5,arr,"%");print arr[1] "\t"}'       #以空格+为分隔符,以当前前的第6列来匹配行, 对匹配的行的第5列以“%”作为分隔符,得到数据arr,然后输出arr[1]

sed #可以对文本文件或字符串进行““增删改查”,不管是哪种操作都是先匹配行,然后再进行操作。 -n 是取消默认输出、-r是可以使用“扩展正则”, -i 如果操作的是文件就保存更改到文件。单引号中的p是匹配输出、a、i 加入行,c、s是替换操作。

    ... |  sed -n '3p'            #该命令是输出第三行, n是取消默认输出,r是识别正则。 进行字符串或文件文件的“增删改查”      

    ... |  sed -n '1,3p'        #输出第1~3行,共三行。当然1,3也可以是正则,可以行号与正则混用

              ... |  sed -nr '/8:00/,/9:00/p'   #输出8:00~9:00的内容,注意这里使用的是正则。 原理是先找到第一个,找到后开始输出,然后找第二个正则,找不到会一直输出。

         sed -i '/error/i  99' test.sh    #在/error/ 匹配成功的行前加入一行内容为"99“ 。  a是行后加入一行内容 ,i是行前加入一行内容。

      sed -i '/匹配行/s/被替换的字符/替换的字符/g' test.sh     #进行字符替换,且保存修改

netstat -lntp  #查找打开的端口

运行级别: 有七种运行级别,切换命令是init 0~6  , 如何要默认启动指定的运行级别,修改"/etc/inittab" 文件即可。注意可不能把0与6级别写入否则,开机就关机/重启。

  • 0 停机,关机
  • 1 单用户,相当于window的安全模式,无网络连接,不运行守护进程,不允许非超级用户登录
  • 2 多用户,无网络连接,不运行守护进程
  • 3 多用户,正常启动系统
  • 4 用户自定义
  • 5 多用户,带图形界面
  • 6 重启

自执行脚本: 在进入命令行前,会自动执行  /etc/rc.local  bash脚本文件,这是软链接,引用的是/etc/rc.d/rc.local 文件。我们可以将服务放在/etc/rc.d/init/下,开机也会自启动。 

Linux的系统引导:有二种旧的是Lilo,新的是grub , 配置文件是 /etc/grub.conf => /boot/grub/grub.conf 我们可以通过修改这个文件来修改系统启动时等待时间,默认启动的系统。在等待进入系统那个界面我们可以进入安全模式,进而修改密码,不过这都要我们有主机的情况下。在这个界面我们只需按"e" ,然后修改启动为1,安全模式启动(临时生效)。然后直接进入安全模式即可。如果在加密了,即在 /etc/grub.conf 配置了 password -md5 ... 时。先p验证完密码后才能e。修改密码是passwd 用户名 就可以了。忘了密码除了安全模式外,还有光盘修复模式可以修改密码。

 

服务管理:RPM包与源码包的服务是在不一样的地方的。

  1)RPM包启动脚本是放在指定位置由指定命令管理的,而源码包是安装的位置的。而启动脚本是执行了"/usr/sbin/"下对应的脚本 。除了独立的服务,还有基于xinetd 的服务管理,而xinetd也是独立服务的一个服务,下面说的是独立服务

    centos6    “/etc/rc.d/init.d/*.service start”  使用的是“service”管理的。格式是“ service * start|stop|status ”,而自启动命令“chkconfig --list”查看可被管理自启动的脚本,“ chkconfig <服务名> on  ” 就开启指定服务启动服务,能被chkconfig管理是因为脚本中有“# chkconfig: 35 86 76\n# description:备注信息”。而图形界面管理命令是“ntsysv”

    centos7 放在 "/lib/systemd/system" , systemctl管理命令,语法格式是“ systemctl start|stop|status  *.service  ” ,同样可以用"ntsysv"图形界面管理(空格选中或取消、tab跳在下面)。

  2)源码管理管理:管理脚本是放在官方指定的文件的,放在与安装位置相关的位置上。如果想要自启动,把启动命令放在“ /etc/rc.d/rc.local ”下,这是一个bash脚本,会在输入命令登录前执行。如果想要把源码包像rpm包一样被管理,需要将启动脚本设置软链接到服务管理的位置, 比如systemctl的“/lib/systemd/system” ,且修改文件软链接文件,在#!/bin/sh 下加入二行 “# chkconfig: 35 86 76\n# description:备注信息”, 然后 "chkconfig --add" 给chkconfig管理。但这就是service ,systemctl不适用。chkconfig * on 会转发到命令是 ”systemctl enable * “。

服务优化: 是将不必要的服务关闭,比如蓝牙服务。

进程:  ps aux 可以查看进程, top -b -n 1 是top的一次输出。ps -le 可以查看服名式的服务,而"killall -9 服务名"

杀服务: kill -9 服务PID #我们可以查找lsof -i:80 可以查看80端口占用的进程。pkill -9 -t  用户up  , w可以查看

放入后台: “命令 &” 放在后台运行(后台运行状态),在运行时可以使用Ctrl+z 放在后台暂停运行, "nobup  命令 &"放入后台,就算退出ssh。jobs可以查找后台的进程列表。”fg 工作号“ 可以恢复到前台,”bg 工作号“ 可以将暂停的后台变为运行后台。 注意vi、top放在后台都会暂停状态。

系统定时任务:

   at 是一次性任务,指定的是具体时间执行, /etc/at.allow是用户白名单、/etc/at.deny是用户黑名单,两个文件的关系是,都存在白名单优先,都不存在,只能root用户使用 。使用方法是”at 17:30 2/24/2022“ 回车 命令 回车 ctrl+d 。atq 查看、”atrm 工作号“ 删除指定at定时任务。

  cron 循环定时任务:"/etc/cron.allow"是白名单,“/etc/cron.deny”是黑名单 , "crontab -e” 可以写root的定时任务, vi  /etc/crontab 可以写指定用户的定时任务。书写的时间格式是 "* * * * *" 对应的是"分 小时 天 月 星期",注意写天就不要写星期,如果两个都写了是并关系。 

    "*/10  1,2 1-15 * *" 是每月的1-15日,的1点和2点每10分执行。注意星期位0-6表示星期日到 星期六,且7等价于0都是星期日。

  anacron  关机时防止任务漏掉, 执行的是/etc/cron.{daily、weekly、monthly} 文件夹下的脚本。会每天、每周、每月执行对应文件夹下的脚本。

 

 uname -a   #可以查看系统信息 

vmstat  1  3 #显示系统内存信息,1是刷新间隔,3是次数

uptime   #可以查看系统启动时间

/proc/*   #硬件信息, cat /proc/cpuinfo 输出cpu信息, cat /proc/meminfo 输出内存信息

日志管理: 系统的日志放在/var/log/*下的文件,lastb命令可以查看登录错误信息查看的/var/log/btmp 日志文件。我们可以对  日志切割|轮替  更多内容

网络安全

ping  -c 4 192.168.87.101   #探测4次是否能连接指定ip

netstat -rn    #查网关    -tulnp查开启的端口

nmap -sP 192.168.1.0/24   #工具在局域网里进行侦探,查看局域网里ip存活数量

w         #查看登录该主机shell 的ip用户或查看几分钟前的平均负载情况

  

 

6、实战篇

1、服务管理脚本

如果想要开机自启   ||  还有执行启动命令后,如果退出就关闭时,使用脚本

vim /lib/systemd/system/*.service

[Unit]
[Install]
[Service]
Type=simple                 #默认值,这个服务主要由 ExecStart 设置的程序来启动,启动后常驻于内存中。
ExecStart=启动命令           #启动 当执行 systemctl start *.service    (不能接受 <, >, >>, |, & 等特殊字符,可以写在脚本中,再在这里执行这个脚本)
ExecStop=停止命令            #关闭 当执行 systemctl stop *.service

systemctl daemon-reload   #重新加载服务管理脚本

systemctl enable *.service  #设置开机自启

systemctl is-enabled  *.service   #判断是否已开启了开机自启

systemctl start *.service     #手动启动

 

2、安装实战

🖱️安装MySQL      🖱️安装Nginx 

🖱️安装tomcat      🖱️安装Java

🖱️发送邮件           🖱️使用企业微信发信息

🖱️安装httpd

posted @ 2021-11-24 12:34  小庄的blog  阅读(136)  评论(0编辑  收藏  举报