RHCSA Liunx基础完整版笔记

虚拟机上安装rhel9

网络模式:

桥接模式:与主机使用同一张网卡。要求虚拟机的ip地址与物理机的ip地址在同一个网段

nat模式:该模式会使用vm8网卡与真机网卡进行通讯的。即虚拟机中的网卡与vm8连接,真机网卡与vm8连接。是的真机与虚拟机之间可以进行通讯。当虚拟机想要访问外界网络时,会通过nat技术将虚拟机的ip转换为真机网卡的ip。通过真机的网卡访问外界。

仅主机模式:相当于是局域网。通过vm1网卡与主机实现通讯。但是无法访问外界的互联网。

lan区段:后期用于组件多个局域网

linux的文件管理

ctrl+c:终止当前命令的执行

命令终端字段含义介绍及更改

  • [root@localhost ~]#

    • root:当前登录系统用户名(root超级管理员)

    • localhost :当前主机名 显示第一个小数点之前的部分

      linux 复制代码
      [root@study ~]# hostname	#查看主机名称
      study
      主机名称可以进行更改
    • ~:当前用户所在**工作目录**(~ 为家目录:游戏登陆进去之后会存在出生地) ,root超级管理员家目录:/root

      普通用户的家目录是 (/home/用户名)和超级管理员的家目录(/root)不一样(就像公司的boss和天选打工人的工位一样)

      最前面的/表示根目录,时候的/表示路径分隔符

      对照着windows下的路径:windows从盘符找路径的,linux从根目录开始进行查找的。分割符也不同

    • :#: 当前用户身份是超级管理员 [student@localhost ~]$

    • $:当前用户身份为 普通用户,普通用户的家目录:/home/用户名同名

  • 改变命令终端的值

    • 切换用户 su - 用户名

      su -:默认切换到root用户

    • root切换普通用户,不需要密码。普通用户切超级管理员用户,需要输入密码

    • exit可以退出

    • 修改主机名

      bash 复制代码
      tab键盘可进行补全
      
      
      [root@study ~]# hostname zhangsan   #重启会失效
      
      
      #查看主机信息
      [root@study ~]# hostnamectl status 
         Static hostname: study
      Transient hostname: zhangsan
               Icon name: computer-vm
                 Chassis: vm 🖴
              Machine ID: e2877dc6cc114e3793ad482169ff612f
                 Boot ID: 9c501369d932407c811ddbf5c46f0aa9
          Virtualization: vmware
        Operating System: Red Hat Enterprise Linux 9.1 (Plow)     
             CPE OS Name: cpe:/o:redhat:enterprise_linux:9::baseos
                  Kernel: Linux 5.14.0-162.6.1.el9_1.x86_64
            Architecture: x86-64
         Hardware Vendor: VMware, Inc.
          Hardware Model: VMware Virtual Platform
      [root@study ~]# hostnamectl set-hostname gaolaozhuang    永久更改
      [root@study ~]# reboot    #重启
      [root@gaolaozhuang ~]# 
    • 更改当前工作目录

      bash 复制代码
      #查看当前工作目录
      [root@gaolaozhuang ~]# pwd
      /root
      
      #切换工作目录   cd 
      #1、从根目录开始查找
      #2、本身就在这个文件中,则直接写切换的工作目录的文件名即可。在/root下就不能用cd /gouxin
      
      
      [root@gaolaozhuang ~]# cd /home
      [root@gaolaozhuang home]# 
      
      
      
      [root@gaolaozhuang home]# ls
      gouxin
      [root@gaolaozhuang home]# cd gouxin
      [root@gaolaozhuang gouxin]# 
      
      
      
      #绝对路径和相对路径
      绝对路径:从根目录开始的路径
      相对路径:不是以根目录开始的路径
      
      
      
      cd -:在当前的工作目录和上一次的工作目录之间来回切换
      
      
      cd ~:当前用户的家目录
      
      cd . :.代表当前的工作目录
      
      cd .. :当前工作目录的上一级目录
      
      
      
      cd:直接默认切换到家目录

命令的格式

  • 命令字 [-选项...] [参数...]

    • 命令字:命令本身(功能)

      • 输入命令后,会进入到某些路径下面查找相对应的文件。

        ​ cd----/usr/bin/cd ls /usr/bin/cd

        ​ /usr/bin/cd :不能执行

      ​ pwd === /usr/bin/pwd

      • 外部命令

        在/目录下面有对应的可执行文件,执行文件和执行命令效果一致

      • 内置命令

        程序自带的命令。bash程序自带的命令

    • 选项:调整命令功能的

      • 短选项:-l -a -d -h(单个字符),短选项可以合并使用:-lad -lh
      • 长选项:--help(单词),长选项通常是不能合并使用的
    • 参数:命令的执行对象,文件/目录/程序等

    • []:可选的

    • ...:可以同时有多个选项或参数

安卓系统用的linux的内核。linux系统装置在服务器提供服务的机器)上面。linux具有稳定性(保证一直开机)---》linux系统是开源的。存在bug会被立即修复,用命令

ls命令

  • ls命令(英文全拼:list):用于查看目录下内容及目录和文件详细属性信息

  • 命令格式:ls [-选项...] [参数...]

  • 常用选项:

    • -a 显示目录下所有内容,包含隐藏的内容

      .代表当前工作目录 ...代表上层目录

    • -l 以长格式显示目录下的内容及详细属性

      • 文件类型 三组文件权限(read、write、execute)【文件的所属者(我) 文件的所属组 (家人) 其他人 (陌生人)】 硬链接次数 所属用户 所属组 文件大小(单位是字节 1字节=8比特 )
    • -h 人性化显示目录下内容大小(kB、MB、GB)

    • -d 仅显示目录本身而不显示目录下的内容(类似于window中文件进行右键点击属性

    • -i 查看inode号(系统任何的文件或目录都有一个唯一的编号)

    • -R:递归查看目录下所有内容(从头到尾)

​ ls -l === ll ls -lh ls -l -h

linux文件类型

ls -l之后,通过第一个字符查看文件类型,和文件名的后缀无关

    • 普通文件
  • d 目录文件

  • l (软)链接文件(符号链接) /bin 类似于windows的快捷方式

    ​ 硬链接文件

  • b 硬件设备文件 /dev/nvme0n1(磁盘设备) 一切皆文件 ----后期磁盘分区可以用到

  • c 字符设备文件 /dev 键盘、鼠标......

  • p 管道设备文件

  • s 套接字文件

    套接字文件:两个不同主机之间交互数据,用到的文件就是套接字文件

    管道文件:同一台主机之间不同进程间交互数据,用到的就是管道文件

普通文件的创建touch,stat,cat,more

touch 命令用于创建新的空白文件。当创建的文件本身存在时,修改该文件的时间

命令格式:touch [-选项] 文件名

stat 文件:查看文件的状态 三个时间

分别是:文件的最后一次被访问的时间 查看文件内容的命令:cat

modify:文件的内容最后一次被更改的时间

change:文件的元数据 (最原本的:文件名、文件大小、权限等属于文件的属性的就是元数据)被改变,就会更新当前的时间

touch会更新三个时间

bash 复制代码
[root@gaolaozhuang test]# touch abc1 abc2 abc3

[root@gaolaozhuang test]# touch abc{7,8,9}

[root@gaolaozhuang test]# touch abc{11..21}

[root@gaolaozhuang test]# touch a{1..3}{a..b}
[root@gaolaozhuang test]# ls
a1a  a2b  abc1   abc13  abc16  abc19  abc21  abc8
a1b  a3a  abc11  abc14  abc17  abc2   abc3   abc9
a2a  a3b  abc12  abc15  abc18  abc20  abc7

普通文件的删除

rm 要删除的文件路径

-f 不要询问的过程,直接删除。没有这个文件也不会提示。强制删除 linux的删除是不可逆的

bash 复制代码
[root@gaolaozhuang test]# rm -f file{1..10}
#删除全部的普通文件
[root@gaolaozhuang test]# rm -f *

普通文件中写入内容(编辑内容)

  1. echo 回声 > 重定向符号

    bash 复制代码
    echo "hello  world"  >  file   #覆盖原文件的内容
    cat	file
    echo "666"  >>  file   追加#会将符号左边命令的执行结果追加到右边文件的最后一行
    
    ls >> file
    
    
    << 指定结束符
    
    cat > 1.txt << end(指定结束符号)
    
    <: 读取文件中的数据
    
    echo ls -a >> 1.txt
    
    echo `<1.txt`
    $(<1.txt)

将时间输入到file文件中:

获取时间的命令:

date命令:

时间同步很重要

linux中单引号、双引号、反引号推荐用双引号

反引号:输入的内容当做命令

echo pwd

%j:本年度第几天,备份,数字越大,越新

date

date:

使用:

date 选项...... [+format]

date -R //+0800 东八区(也是中国标准时间)

date //cst 中国标准时间

date -u //utc 世界统一时间

bash 复制代码
[root@gouxin ~]# date

2024年 01月 06日 星期六 00:37:15 EST

只想出现时分秒???

[root@serve ~]# date +%R

09:25

[root@serve ~]# date +%r

上午 09时25分51秒

[root@serve ~]# date +%T

09:26:41

只有月和日 

[root@serve ~]# date "+%m-%d"

01-11

[root@gouxin ~]# date "+%Y-%m-%d %H-%M-%S"//整体数据中有空格,加双引号  空格本身是有意义的  命令 选项 参数,会认为是多个参数

2024-01-06 00-37-39

[root@gouxin ~]# date +%Y-%m-%d %H-%M-%S

date: 额外的操作数 "%H-%M-%S"

请尝试执行 "date --help" 来获取更多信息。

[root@gouxin ~]# echo "ls"

ls

[root@gouxin ~]# echo ls

公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg

[root@gouxin ~]# date "+%Y-%m-%d %H-%M-%S %p %A %Z"2024-01-06 00-42-26 上午 星期六 EST

[root@gouxin ~]# date "+%Y-%m-%d %H-%M-%S %p %A %Z %j"

2024-01-06 00-42-47 上午 星期六 EST 006

//设置时间 把时间改为2023-01-01  ,只改日期,时间会是00:00:00

[root@serve ~]# date -s 20200101

2020年 01月 01日 星期三 00:00:00 CST

[root@serve ~]# date -s 2001

2020年 01月 01日 星期三 20:01:00 CST

[root@serve ~]# date -s "20240111 09:38:00"

2024年 01月 11日 星期四 09:38:00 CST

[root@gouxin ~]# date -s "2023-01-01 13:47:21"//带""

2023年 01月 01日 星期日 13:47:21 EST

//时间混乱 设置回来

今年到现在经过了多少天

[root@gouxin ~]# date "+%j"

033

timedatectl:系统时间

bash 复制代码
[root@gouxin ~]# timedatectl status //主要检查时间是否同步

       Local time: 一 2003-01-06 13:49:12 E...		

     Universal time: 一 2003-01-06 18:49:12 UTC  世界标准时间

        RTC time: 六 2024-01-06 05:49:50 //实时时钟时间

        Time zone: America/New_York (EST, -System clock synchronize... no//时间未同步

       NTP service: active

     RTC in local TZ: no

//查看识别哪些时区

[root@serve ~]# timedatectl list-timezones

Africa/Abidjan

Africa/Accra

Africa/Addis_Ababa

Africa/Algiers

Africa/Asmara

Africa/Asmera

Africa/Bamako

Africa/Bangui

Africa/Banjul

Africa/Bissau

Africa/Blantyre

Africa/Brazzaville

Africa/Bujumbura

Africa/Cairo

Africa/Casablanca

[root@gouxin ~]# timedatectl set-timezone  Africa/Bissau

A

[root@gouxin ~]# timedatectl set-timezone Asia/Shanghai//设置时区为亚洲上海

//设置时区不能用简写

cst

timedatectl 设置时间前提是关闭ntp(时间同步服务)时间同步

[root@gouxin ~]# timedatectl set-ntp no

[root@gouxin ~]# timedatectl set-time 2023-01-01

date --help

  1. vi/vim编辑器

    • 所有的linux操作系统都有vi命令。要用vim必须有vim的包。vim是vi的升级版本

    • 有一些程序会调用vi编辑配置信息

    • vim有程序编辑的能力

      ​ vim .bashrc 变颜色

    • 编辑速度很快

    • vim使用方式:vim 文件

      ~代表空

  • Vim是从 vi 发展出来的一个文本编辑器,vim 具有程序编辑的能力,可以主动的以字体颜色辨别语 法的正确性

  • vi/vim 共分为三种模式:命令模式、输入模式、底线命令模式(末行模式)

    • 命令模式:刚刚启动 vi/vim,便进入了命令模式 .

      gg 光标跳转到第一行
      G 光标跳转到最后一行
      w 按单词前跳转
      b 按单词后跳转
      ^ 光标所在行的行首
      $ 光标所在行的行尾
      上下左右键
      yy 复制
      p 粘贴
      【数字】dd 删除
      u 撤销
    • 输入模式:在命令模式下按 a/i/s/o或者A/I/S/O 就进入了输入模式(编辑模式)。ESC,退出输入模式,切换到命令模式

      a 在光标后插入
      i 在光标前插入
      s
      o
    • 底线命令模式(末行模式):在命令模式下按下:(英文冒号)就进入了底线命令模式

      :q 退出
      :q! 强制退出
      :wq 保存退出
      :w 保存
      :wq! 强制保存退出
      :w /dir2/file 另存为
      set nu 显示行号
      /keyword 查找关键字 n:跳转到下一个关键字(从前到后) N:从后往前
      :%s/old/new/g 全局替换
      :g/关键字/d 删除有某一关键字的行
      :num1,num2 d 删除num1-num2行
      :n s/old/new/g 某一行的就得替换为新的

插入模式和末行模式之间不能直接跳转

文件名的命名规则:

(1)不能使用/来当文件名,/是用来做根的,也是用来做路径分隔符的

(2)文件名不能超过255个字符

(3)区分大小写file File FILE fIle

(4)目录也是文件,在同一路径下,两个不同类型文件不能同名

查看普通文件的内容

cat:把文件所有内容全输出在屏幕上 是concatenate的缩写

more:按页查看文档内容。并且可以enter键一行一行的向下翻,按空格键,一页一页的往下翻。没有翻到命令结束时,可以按b往回翻

less:与more的区别是在最后不会自行退出。q进行退出

tac:从最后一行开始,将文件的内容输出在屏幕上

打开纯命令行:ctrl+alt+1|2|3|4

head 默认查看文件的前10行

​ -n 前n行

tail 默认查看文件的后10行

​ -n 最后n行

查看第几行:

管道符 | ===》将左边命令的执行结果作为右边命令的参数

查看文件的第三行: head -3 file | tail -1

目录文件的创建与删除

mkdir 文件名

​ -p 将前置不存在的路径同时也创造出来。递归创建目录。

​ -v:显示详细的创建过程

tree 目录文件 :以树状结构显示文件结构

mkdir abc{1...6}:也可以一次创建多个目录文件

删除:rm -r [f] 要删除的目录 -r表示递归删除 -f 表示强制删除

linux删除掉之后就彻底没了

文件的复制cp和移动mv

cp 原始文件 要复制的位置(顺带改名字)

复制多个文件时,不能改名字。cp 原始文件1 原始文件2 目录

复制目录文件: cp -r /etc/ssh /home /root

-r:递归复制目录

移动文件:mv

相当于window的剪切,等同于改名字

不要去mv本身存在的文件。会出现问题

移动目录:mv /root/{home,ssh} /root/dir1

硬链接和软链接

文件创建时,会存在一个编号,也叫做inode,节点。用于标识文件在磁盘中的位置

ls -i 查看文件的节点

链接文件:

  • Linux中的链接文件类似于windows中的快捷方式

  • 软连接命令格式:ln -s 源文件路径 目标路径

  • 软连接特点:软连接可以跨分区(lsblk查看的分区演示软连接的跨分区),可以对目录进行链接,源文件删除后,链接文件不可用。链接文件删除掉,源文件不受影响

  • 注意:创建链接时一定要写目录或文件的绝对路径,哪怕是在当前路径下,也要写绝对路径·

  • 链接文件的权限还是参考源文件的权限的,源文件是什么权限,链接文件就是什么权限

  • 硬链接特点:硬连接不可以跨分区,不可以对目录进行链接,源文件删除后,链接文件仍然可用

  • 硬链接创建:

  • ln 源文件 目标文件

  • stat查看软连接和源文件的节点号是否相同

  • 相互同步,实时备份

硬链接与拷贝的区别:硬链接会进行数据的同步,拷贝则不会

作业:画出/下面的文件结构

用户和用户组管理

所有者:文件或目录的拥有者,拥有者的权限通常是最大的

所属组:文件或目录属于哪一个组,所属组的权限略微比所有者小

其他人:既不是文件或目录的所有者,也不属于文件或目录组内的成员,其他人的权限通常 最小的权限

用户账号管理

  • 用户使用用户账号登录系统

  • 用户模块目录:/etc/skel/ (了解即可)

    目录下与用户家目录下面的文件类似。都是从 /etc/skel/拷贝到用户的家目录里边去的

    linux 复制代码
    [root@study ~]# ls -a /etc/skel
    .  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
    [root@study ~]# ls -a ~
    .   052+备份   公共  视频  文档  音乐  anaconda-ks.cfg  .bash_logout   .bashrc  .config  .lesshst  .tcshrc  .viminfo
    ..  052日文件  模板  图片  下载  桌面  .bash_history    .bash_profile  .cache   .cshrc   .local    test     .Xauthority

    一般企业只会给员工一些普通账号,权限较低。

用户添加

useradd [-选项] 用户名

常用选项

  • -u 指定用户的uid
  • -d指定用户的家目录(了解)
  • -c用户描述信息
  • -g 指定用户的基本组
  • -G指定用户的附加组
  • -s指定用户的解释器程序

权限管理

suid

对于一个可以执行的文件添加上suid权限后,普通用户在执行该文件时,会临时拥有该文件所有者的权限

普通用户可以使用passwd改命令,但是/etc/shadow文件对普通用户没有写的权限???

which passwd 查看命令文件的路径

ll /usr/bin/passwd

会发现在所属者的权限位置上存在s,表示suid权限

举例:普通用户不能用cat查看/etc/shadow

bash 复制代码
[gouxin@study ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够

[root@study etc]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 37464  5月 31  2022 /usr/bin/cat
[root@study etc]# chmod u+s /usr/bin/cat
[root@study etc]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 37464  5月 31  2022 /usr/bin/cat

SGID

SetGID(SGID):当对一个可执行的程序文件设置了SGID后,普通用户在执行该文件时临时拥有 其所属组的权限,该权限只在程序执行过程中有效,程序执行完毕后用户恢复原有组身份

当对一个目录作设置了SGID权限后,普通用户在该目录下创建的文件的所属组,均与该目录的所 属组相同

SetGID权限会附加在所属组的 x 权限位上,所属组的 x 权限标识会变成 s

设置SetGID命令格式:chmod g+s 文件名

##Sticky BIT特殊权限:

针对目录的,一旦目录存在BIT特殊权限,即使其他用户具有文件的rwx,也只能删除自己创建的文件

chmod o+t 目录名

bash 复制代码
#为目录设置SBIT

[root@localhost ~]# chmod o+t /test

[root@localhost ~]# ll -d /test

drwxrwxrwt. 2 root root 6 4月  11 16:07 /test
[lisi@localhost test]$ ls

kenji.txt laowang.txt lisi.txt
[lisi@localhost test]$ rm -rf *

rm: 无法删除"kenji.txt": 不允许的操作

rm: 无法删除"laowang.txt": 不允许的操作

FACL访问控制列表

单独为每一个用户量身定制一个权限(不是你们部门的,但是需要一些权限)

命令格式:setfacl 选项 归属关系:用户名:权限 文档 常用选项:

-m 设置权限

-x 删除指定用户权限

-b 删除所有用户权限

网络管理

获取ip地址

bash 复制代码
查看网卡设备名称
nmcli device

设备未连接,连接设备   #ens160托管给一个服务
nmcli device connect ens160

rhel9存在一个服务管理网络(知道即可,一般不需要进行操作)

bash 复制代码
systemctl   	status 	NetworkManger  查看控制网络的服务是否运行着
  • 网络的管理需要的命令行管理工具

nmcli 按两下tab键

connection:描述的是连接

device:描述的是设备

设备:如果想要添加网卡---》设置--》添加--》选中网络适配器--》网络连接模式用nat模式。

windows上的网卡会通过一个虚拟设备,链接多个nat模式的网卡。保证nat与nat,nat与window都可以通信。这个虚拟网卡类似于交换机的作用。为甚麽不直接连接window和linux的两张网卡呢,因为需要保证其他的linux系统也能与window通信,网卡只有一个接口。

如何查看windows上的这个网卡名:

编辑--》虚拟网络编辑器==》nat模式==》点击更改设置===》

也就是说,window上存在一个叫做vmnet8的网卡连接着虚拟设备

windows要发送信息给linux,则ip地址需要保证在一个网段内。这个网段就是上方的子网ip 192.168.159.0/24这个网段内。

网卡自动获取的ip地址。DHCP服务会进行ip地址的分发。不让自动分配,则进行手动配置

windows的网卡的地址:

linux中nat模式的网卡的范围是:2-254,然而2也不能进行使用。linux主机如果要上网访问百度,则需要网关(路由器)。

bash 复制代码
#查看自己的网关地址
route  -n

上网还需要什么???

ping www.baidu.com

ip记不住,记域名。但是域名如何翻译成ip,由域名解析服务器 进行翻译。域名解析服务器的ip地址也要写在ip地址的参数里面。因此,我们进行ip配置时也需要对其进行配置。

connection:描述的是连接

我们尝试添加了一个网卡,但是会发现:

bash 复制代码
[root@gouxin ~]# nmcli device 
DEVICE  TYPE      STATE   CONNECTION 
ens160  ethernet  已连接  ens160     
ens224  ethernet  已断开  --         
lo      loopback  未托管  --  

但是该网卡已经插上去,通上电了,所以问题是我的服务没有接管它。

bash 复制代码
[root@gouxin ~]# nmcli device connect  ens224
#让服务器接管ens224
成功用 "ens22488967519-a652-4564-ba41-28d4611e88ff" 激活了设备 ""。
[root@gouxin ~]# nmcli device 
DEVICE  TYPE      STATE   CONNECTION 
ens160  ethernet  已连接  ens160     
ens224  ethernet  已连接  ens224     
lo      loopback  未托管  --   

只代表服务让ens224网卡可以开始进行工作了,但是它还需要有地址。也就是,该网卡肯定存在配置文件:/etc/NetworkManager/system-connections/ens224.nmconnection。不建议直接更改配置文件,建议使用命令配置。

bash 复制代码
[root@gouxin /]# cd /etc/NetworkManager/
conf.d/             dispatcher.d/       dnsmasq.d/          dnsmasq-shared.d/   system-connections/
[root@gouxin /]# cd /etc/NetworkManager/system-connections/
[root@gouxin system-connections]# ls
ens160.nmconnection
[root@gouxin system-connections]# cat ens160.nmconnection 
[connection]
id=ens160
uuid=a12ef250-0c59-37ab-98cf-9b17cc092b07
type=ethernet  #类型是以太网类型
autoconnect-priority=-999   #表示自动连接的优先级为 -999。在网络连接中,优先级决定了连接的顺序和方式。较高优先级的连接会被优先处理,而较低优先级的连接可能会被延迟或跳过。具体的优先级值可以根据网络环境和需求进行设置。
interface-name=ens160   #设备名称
timestamp=1704473068  #表示时间戳。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数

[ethernet]

[ipv4]
method=auto   #IPv4 地址的配置,方法设置为自动

[ipv6]
addr-gen-mode=eui64   #地址生成模式   
method=auto   

[proxy]   #代理相关的配置

借助NM服务器再给ens160网卡添加一个配置文件

  • 文本图形管理工具

网络测试命令

(1)使用ping命令测试网络的连通性

命令一般格式为:ping [选项] <目标主机名或IP地址>

选项:

-c 数字------用于设定本命令发出的ICMP消息包的数量,若无此选项,则会无限次发送消息包直到用户按【Ctrl+C】组合键才终止命令。

-s 字节数------设置ping命令发出的消息包的大小,默认发送的测试数据大小为56字节;自动添加8字节的ICMP协议头后,显示的是64字节;再添加20字节的IP协议头,则显示的为84字节。最大设置值为65507B。

-i 时间间隔------设定前后两次发送ICMP消息包之间的时间间隔,无此选项时,默认时间间隔为1秒。为了保障本机和目标主机的安全,一般不要小于0.2秒。

-t------设置存活时间TTL(Time To Live)

bash 复制代码
[root@master ~]# ping -c 2  www.baidu.com

(2)使用tracepath命令用来追踪并显示报文到达目的主机所经过的路由信息

命令一般格式为:tracepath [选项] <目标主机名或目标IP地址>

常用选项:

-n------对沿途各主机节点,,仅仅获取并输出IP地址,不在每个IP 地址的节点设备上通过DNS查找其主机名,以此来加快测试速度。

-b------对沿途各主机节点同时显示IP地址和主机名。

-l 包长度------设置初始的数据包的大小。

-p端口号------设置UDP传输协议的端口(缺省为33434)。

bash 复制代码
[root@master ~]# tracepath -b  www.baidu.com

(3)traceroute (Windows 系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器,追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节

bash 复制代码
[root@master ~]# traceroute  -I www.baidu.com   #-I表示使用ICMP协议

通过域名访问主机

1、配置静态解析,通过/etc/hosts文件实现域名解析

bash 复制代码
[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.168.11  master
[root@master ~]# ping master
PING master (192.168.168.11) 56(84) bytes of data.
64 bytes from master (192.168.168.11): icmp_seq=1 ttl=64 time=0.131 ms

2、通过/etc/resolv.conf文件指派域名解析服务器的地址,由dns服务器做域名解析

bash 复制代码
[root@master ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.168.2
[root@master ~]# host www.baidu.com 或者[root@master ~]# host www.baidu.com 192.168.168.2
Using domain server:
Name: 192.168.168.2
Address: 192.168.168.2#53
Aliases:

www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 14.215.177.39
www.a.shifen.com has address 14.215.177.38

当通过域名访问服务器的时候,其默认解析顺序为hosts文件、resolv.conf文件中的DNS服务器。其响应的先后顺序可在文件/etc/nsswitch.conf中设置。

从网站下载文件

1、wget命令用于在终端命令行里下载网络文件,英文全称为:"web get",语法格式为:wget [选项] 网址

bash 复制代码
-P  下载到指定目录 
-t  最大尝试次数 
-b  后台下载模式
-c  断点续传  
-p  下载页面内所有资源,包括图片、视频等 
-r  递归下载
bash 复制代码
[root@node12 ~]# wget http://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/s/sl-5.02-1.el8.x86_64.rpm

2、curl命令是一个网络工具,其主要作用是通过http、https、ftp等方式下载/上传文件

bash 复制代码
[root@node12 ~]# curl www.baidu.com -o index.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2381  100  2381    0     0  20976      0 --:--:-- --:--:-- --:--:-- 21070
[root@node12 ~]# ll
total 4
-rw-r--r-- 1 root root 2381 Jun 19 17:38 index.html

磁盘分区

磁盘组成:主轴马达,盘片,数据存储在盘片上。机械手臂上的读写磁头。存储数据时,磁头摩擦盘片进行数据的操作、硬盘里面是真空的,一旦拆开就废废了。进灰尘,盘片也会受损。

扇区是磁盘存储数据的最小单元,默认一个扇区可以存储512字节的数据

你要划分10G,磁盘是用扇区作为单位去划分的。

磁盘盘片是双面存储的

磁盘类型介绍:

  • IDE接口类型:主要用于个人家用计算机领域,优点价格便宜,缺点数据传输速度慢

  • SCSI接口类型:早期主要用于服务器理领域,数据传输速度快

  • SAS接口类型:目前在服务器领域比较流行

  • SATA接口类型:串口磁盘,主要用于个人家用计算机领域,偶尔也应用在服务器领域

  • SSD接口类型:固态硬盘接口,价格昂贵,数据传输速度快,利用内存的机制读写数据,主要应用 在个人电脑

  • NVMe接口类型:固态硬盘接口,价格昂贵,数据传输速度快,利用内存的机制读写数据

  • ide:09年就淘汰了,数据传输速度慢

  • scsi:2013-2016/2017 数据传输速度快,支持热插拔了

  • SSD:固态,价格贵,数据传输速度快、利用内存帮助存储数据的。

  • NVME:协议,固态硬盘的协议。

常用的分区格式

硬盘只有进行分区之后才能进行使用

MBR分区格式:古老。一块硬盘只能划分4个主分区。

不满足需求,因此后期增加扩展分区,扩展分区上可以划分逻辑分区(与主分区都是存数据的)第四个分区作为扩展分区。扩展分区内部可以划分多个逻辑分区。

逻辑分区的数量限制:

IDE:59

SCSI:11

其他的靠本上也是11个

致命的缺点:最大支持2.2T的容量

GPT分区格式

可划分128个主分区,支持18EB磁盘容量

1024byte = 1k

1024k = 1MB

1024MB = 1GB

1024G = 1TB

1024T = 1PB

1024PB = 1EB

##lsblk查看系统所有磁盘的信息

通常查看系统中磁盘的信息,包括有多少块以及磁盘的分区

-d :不列出分区数据

-f:列出磁盘使用的文件系统等具体信息

挂载点:这个分区再给那个目录存储数据

/dev/sda

lsblk -f /dev/sda

文件系统

df 查看分区的使用率

查看不同的分区使用的文件系统类型

-h ⼈性化显示

-T 显示文件系统的类型

查看正在使用的分区的容量的使用情况(空间的资源使用率)

blkid

du 统计文件目录的大小

-h:以人类可读的

-s:只统计总数

du -hs  /etc
ls -h /etc不会统计文件内容,只会统计文件名占用的空间大小

Mbr分区fdisk

早期,MBR和GPT的分区格式是不兼容的,会把前面的分区格式化

fdisk

先划分扩展分区是没问题的

n 穿件新的分区

​ +2G

w 保存分区划分并退出

p 查看分区情况

第四个逻辑分区大小之间全部梭哈:直接默认的扇区就可以

注意:扩展分区会占用一个主分区号(mbr分区格式中:1-4是主分区号,5以后是逻辑分区),但是不能够直接使用

逻辑分区可以存在若干个,通过扩展分区建立,可以直接进行使用

分区格式化、文件系统

分区结束之后,进行格式化,即文件系统确定

文件系统:管理分区里面的文件的,文件属性,文件存放多少数据......,都需要进行管理,即文件系统

文件系统到底是怎么管理的:以ext4进行举例:

将分区格式化为ext4的文件管理系统,帮助管理整个文件系统下的文件的

1、日志记录功能:服务器意外当机,数据可能在内存中未保存,那么文件系统会记录哪些数据在内存中准备写入硬盘。系统重启时,读取日志文件,快速恢复

2、单个文件系统最大支持1eb的分区容量,单个文件最大可存储16TB的数据

xfs: 单个文件系统最大支持8eb的分区容量,单个文件最大可存储500TB的数据.文件的读写速度可以达到每秒4G

rech9默认的文件系统就是xfs

  • 文件系统格式化的命令是:mkfs
bash 复制代码
mkfs -t ext4    /dev/sdb1

mkfs.ext4  分区设备路径


mkfs.xfs   分区设备路径
bash 复制代码
[root@gouxin ~]# mkfs -t ext4 /dev/sdb1
mke2fs 1.46.5 (30-Dec-2021)
创建含有 2621440 个块(每块 4k)和 655360 个inode的文件系统
文件系统UUID:8551ef00-c6d1-4c16-938d-82b79a5fea52
超级块的备份存储于下列块: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

正在分配组表: 完成                            
正在写入inode表: 完成                            
创建日志(16384 个块)完成
写入超级块和文件系统账户统计信息: 已完成
[root@gouxin ~]lsblk -f /etc/sdb1     #查看文件系统是否已经格式化成功   df -T也可以看到

挂载

如何用分区存储数据呢???----通过目录(本质是磁盘分区的入口),目录本身没有存储空间,所以,通过挂载,把分区和目录之间进行关联

  • 挂载的命令

mount 设备路径 挂载点

挂载点原本要是有文件,因为文件系统不一致,会将源文件暂时隐藏起来。挂载点卸掉之后,文件就会又出现。

bash 复制代码
[root@gouxin ~]# mount /dev/sdb1   /home/
[root@gouxin ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0    7G  0 disk 
├─sda1          8:1    0    4G  0 part 
└─sda2          8:2    0    1K  0 part 
sdb             8:16   0   20G  0 disk 
├─sdb1          8:17   0   10G  0 part /home
├─sdb2          8:18   0    2G  0 part 
├─sdb3          8:19   0  512M  0 part 
├─sdb4          8:20   0    1K  0 part 
└─sdb5          8:21   0    5M  0 part 
sr0            11:0    1  8.4G  0 rom  /run/media/root/RHEL-9-1-0-BaseOS-x86_64
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  400M  0 part /boot
└─nvme0n1p2   259:2    0 19.6G  0 part 
  ├─rhel-root 253:0    0 15.6G  0 lvm  /
  └─rhel-swap 253:1    0    4G  0 lvm  [SWAP]

磁盘分区如果被存满了,则需要卸掉挂载,重新将文件挂载到新的分区上

umount 分区设备路径

注意:目录无法存储数据的,数据是存储在磁盘上的,因此,挂载卸掉之后,通过原来的挂载文件就无 法再访问磁盘上的数据了。

其他的文件夹只要与该磁盘进行挂载,即可查看磁盘上所存储的内容

bash 复制代码
[root@gouxin /]# mount /dev/sdb1 /testsdb1   挂载
[root@gouxin /]# cd /testsdb1/
[root@gouxin testsdb1]# echo ll >> 1.txt
[root@gouxin testsdb1]# ll
总用量 20
-rw-r--r--. 1 root root     3  4月 16 09:14 1.txt
drwx------. 2 root root 16384  4月 16 09:02 lost+found

[root@gouxin testsdb1]# echo `ls -l` >> 1.txt
[root@gouxin testsdb1]# cat 1.txt
ll
总用量 20 -rw-r--r--. 1 root root 3 4月 16 09:14 1.txt drwx------. 2 root root 16384 4月 16 09:02 lost+found

[root@gouxin testsdb1]# umount /dev/sdb1   取消挂载

[root@gouxin /]# ls -l /testsdb1    #原来的挂载点文件无法再访问sdb1上的内容
总用量 0
[root@gouxin /]# mkdir test2
[root@gouxin /]# mount /dev/sdb1 /test2   #谁对sdb1进行挂载,即可通过该目录,访问sdb1磁盘上对应的文件
[root@gouxin /]# ll /test2
总用量 20
-rw-r--r--. 1 root root   117  4月 16 09:15 1.txt
drwx------. 2 root root 16384  4月 16 09:02 lost+found

想要自动挂载分区:在**/etc/fstab**下进行配置

mount挂载是临时挂载

有的目录,/dev等文件系统类型,是系统自己分配的

/etc/fstab 解释每一列代表的意义:

default:默认所有参数都是标准值

备份:一般企业中存在另一台服务器,专门进行备份

文件顺序:0 不检查 自动按照顺序挂载 /分区一定要进行挂载

mount -a 会检测配置文件/etc/fstab,未挂载的帮助进行挂载

​ -o 挂载时的额外参数 想要修改参数时 。比如机器开机时异常,可能系统中的/boot挂载点掉了,内核文件都在/boot上。此时采用root用户的维护模式,采用-o进行修复

remount 重新挂载 ----不常用

GPT分区

gdisk

如果不存在gdisk包,使用yum进行安装 yum -y install gdisk

分区类型默认就是linux类型

格式化文件系统

挂载

LVM逻辑卷创建和使用

将底层的物理分区整合成大的虚拟硬盘

分区存储满了,但是又不想数据被分散存储,希望有种方法可以帮助增加分区的大小,逻辑卷就可以。

虚拟硬盘:在虚拟硬盘上要存储数据,需要在虚拟硬盘上划分逻辑卷,将空间给逻辑卷。数据存储在逻辑卷中,逻辑卷挂去一个目录上。当该逻辑卷存储达到最大存储量时(存满了),逻辑卷可以进行扩容。

逻辑卷--------空间扩容

增加到400G之后就不能再进行增加了,文件会损坏。虚拟硬盘不够用,直接把新的物理硬盘直接扩容到虚拟硬盘上。不需要格式化。因为逻辑卷会进行格式化。

应用场景就是空间扩容

逻辑卷管理的命令:

pv表示物理卷 物理分区要组成卷组,需要转换为pv格式,但是centos7不需要,因此pvcreat不需要记

vg:卷组管理

lv:逻辑卷管理

创建和扩展常用

存在挂载点的分区就不能创建为卷组了。分区也不要存在文件系统,后期在逻辑卷中给文件系统。已经将空间划分给卷组的,就无法进行挂载操作了

  • 创建卷组 把创建好的物理卷组成卷组,后者直接创建卷组

  • vgcreate 卷组名 设备路径1、设备路径2......

    vgs

    bash 复制代码
    [root@study ~]# vgcreate myfirstvg   /dev/sda1  /dev/sda2 /dev/sda3
      Physical volume "/dev/sda1" successfully created.
      Physical volume "/dev/sda2" successfully created.
      Physical volume "/dev/sda3" successfully created.
      Volume group "myfirstvg" successfully created
      
      
      #简要查看卷组信息的方式
      [root@study ~]# vgs
      VG        #PV #LV #SN Attr   VSize   VFree 
      myfirstvg   3   0   0 wz--n-  <8.99g <8.99g
      rhel        1   2   0 wz--n- <19.61g     0 
  • 创建逻辑组

    • lvcreate -L 大小 -n 逻辑卷名 卷组名

    lvs

    bash 复制代码
    [root@study ~]# lvcreate -L 1G -n mylv1 myfirstvg 
      Logical volume "mylv1" created.

    逻辑卷会在卷组文件下生成文件:

    /dev/卷组名/逻辑卷名

    bash 复制代码
    [root@study ~]# lvdisplay /dev/myfirstvg/mylv1 
      --- Logical volume ---
      LV Path                /dev/myfirstvg/mylv1
      LV Name                mylv1
      VG Name                myfirstvg
      LV UUID                oZi1HA-LqcT-gxwS-cO5k-N58a-WnTn-aAdQ9S
      LV Write Access        read/write
      LV Creation host, time study, 2024-04-17 23:56:22 -0400
      LV Status              available
      # open                 0
      LV Size                1.00 GiB
      Current LE             256
      Segments               1
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:2
    
    
    
    #简单的查看逻辑卷的方式
    [root@study ~]# lvs
      LV    VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
      mylv1 myfirstvg -wi-a-----   1.00g                                                    
      root  rhel      -wi-ao---- <15.61g                                                    
      swap  rhel      -wi-ao----   4.00g
      
      
      
      [root@study ~]# lsblk
    NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    sda                   8:0    0   20G  0 disk 
    ├─sda1                8:1    0    5G  0 part 
    │ ├─myfirstvg-mylv1 253:2    0    1G  0 lvm  
    │ └─myfirstvg-mylv2 253:3    0    7G  0 lvm  
    ├─sda2                8:2    0    2G  0 part 
    │ └─myfirstvg-mylv2 253:3    0    7G  0 lvm  
    ├─sda3                8:3    0    2G  0 part 
    │ └─myfirstvg-mylv2 253:3    0    7G  0 lvm  
    ├─sda4                8:4    0    1K  0 part 
    └─sda5                8:5    0    4G  0 part 
    nvme0n1             259:0    0   20G  0 disk 
    ├─nvme0n1p1         259:1    0  400M  0 part /boot
    └─nvme0n1p2         259:2    0 19.6G  0 part 
      ├─rhel-root       253:0    0 15.6G  0 lvm  /
      └─rhel-swap       253:1    0    4G  0 lvm  [SWAP]

    /分区用的也是逻辑卷:可以进行扩容

    • 逻辑卷的使用:

      mkfs.xfs /dev/卷组名/逻辑卷名

      mount /dev/卷组名/逻辑卷名 挂载点文件

    ​ 开机自动挂载:在/etc/fstab下更改配置文件即可

    bash 复制代码

    扩展逻辑卷

#top查看系统健康状态

类似于电脑上的任务管理器

是动态的

第一行第五列:判断服务器忙不忙。根据cpu的核数判断负载量

如果4核,那么值为1.0表示1个核的负载量达到100% 4.0就是4核超负荷

看内存直接用 free -h查看即可

进程管理

解释程序、进程、线程

线程:是真正干活的人

pstree

-p 显示进程的pid

-a 显示完整的命令行

-u 显示每个进程所属的账号名称

后面表示的是6个县城

可以方便的看进程之间的关系

systemd【1】是天赋进程,内核的管家

pstree -pa 用户名

查看该用户启动的进程

ps aux unix系统下查看系统进程信息

a - 显示当前终端所有进程

u 以用户的格式输出

x 当前用户在所有终端下的进程

ps -ef:Linux格式静态查看系统进程,查看系统所有进程信息

-e #显示系统所有进程

-l #以长格式输出信息

-f #显示最完整的进程信息

bash 复制代码
#查看系统所有进程信息
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.2 0.3 127992 6576 ? Ss 09:08 0:01 /usr/lib/systemd/systemd --
switched-root
#个字段含义如下:
user:进程属于那个用户
PID :进程PID号
%CPU:进程占用CPU资源百分比
%MEM:进程占用物理内存百分比
VSZ :进程使用掉的虚拟内存量

(单位:Kb)
RSS :进程占用固定内存量(单位:Kb)
TTY :进程在那个终端运行,如果内核直接调用则显示"?",tty1-tty6表示本机终端登录的用户进程,
pts/0-255则表示远程终端登录用户的进程
STAT:进程状态:R(Running)运行,S(Sleep)休眠,s包含子进程,T(stop)停止,Z(Zombie)
僵尸,+后台进程
START:进程启动时间
TIME :占用CPU运算时间
COMMAND:产生进程的命令
#查看系统所有进程信息
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:08 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --
system --dese
#PPID :该进程的父进程ID号

僵尸进程:当子进程在结束时,父进程并没有对子进程进行资源回收。父进程有问题了,没有正常的进行回收。kill掉父进程,systemd会自然而然的将孤儿子进程回收掉

ps aux | grep sshd 过滤系统中进程的信息

检索进程

1、使用ps aux | grep 配合进行过滤

2、pgrep 对程序名进行匹配,没有第一种过滤的详细

进程的前后台调度

希望程序运行但是不想占用前台终端

& :把进程放在后台

jobs -l 查看用户自己放在后台运行的进程

bash 复制代码
[root@study ~]# sleep 5m &
[1] 3524
[root@study ~]# jobs -l
[1]+  3524 运行中               sleep 5m &

软件包管理

window传文件给linux,借助lrzsz软件包

企业中,负责软件包的管理

软件类型:开源(二次开发 tengine 在nginx上进行的二次开发。允许企业进行二次开发)、闭源(window系统是闭源的系统)后期开发不维护对公司的损失很大(win7)

软件包类型

源码 包:可以看到软件的源代码。bacd这些的英文字母,转换为二进制,安装灵活,可以自定义安装的路径以及安装的功能。卸载方便。

缺点:要手动编译为二进制,需要手动解决依赖关系

rpm包(二进制包):

无法自定义安装的路径,安装不灵活,看不到源代码

软件包的来源:1、本机:安装系统时候,镜像文件4g多,但是内核可能才几m。剩下的都是安装包。

sr0:镜像文件所在的位置,也是光驱文件

/dev/cdrom 是/dev/sr0的软连接

硬件设备,不能直接查看的哦。挂载一下。挂载到/mnt

packages包下面都是软件包

ls Packages/ | wc 0l

##rpm

rpm安装包需手动解决依赖关系:

树形依赖:a-->b-->c--d

环形依赖:a-->b-->c--a

模块依赖:需要模块文件支持,模块查询地址:www.rpmfind.net

bash 复制代码
#安装时必须把包路径写清楚
[root@study Packages]# rpm -ivh /mnt/myfilep/AppStream/Packages/vsftpd-3.0.3-49.el9.x86_64.rpm


#查看软件包是否安装成功
[root@study Packages]# rpm -q vsftpd 
vsftpd-3.0.3-49.el9.x86_64

#列出所有已经安装在系统中的所有软件
[root@study Packages]# rpm -qa


#列出软件的详细信息
[root@study Packages]# rpm -qi vsftpd 
Name        : vsftpd
Version     : 3.0.3
Release     : 49.el9
Architecture: x86_64
Install Date: 2024年05月05日 星期日 23时20分58秒
Group       : Unspecified
Size        : 356096
License     : GPLv2 with exceptions
Signature   : RSA/SHA256, 2021年11月24日 星期三 06时31分28秒, Key ID 199e2f91fd431d51
Source RPM  : vsftpd-3.0.3-49.el9.src.rpm
Build Date  : 2021年11月16日 星期二 06时17分01秒
Build Host  : x86-vm-55.build.eng.bos.redhat.com
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor      : Red Hat, Inc.
URL         : https://security.appspot.com/vsftpd.html  #软件包的官网
Summary     : Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.


[root@study Packages]# which ls
alias ls='ls --color=auto'
	/usr/bin/ls
	
#查询某个文件是由哪一个包产生的  基本上所有的文件都是由包产生的
[root@study Packages]# rpm -qf /usr/bin/ls
coreutils-8.32-32.el9.x86_64



#列出与该软件相关所有文件与目录的存放位置   -ql
[root@study Packages]# rpm -ql vsftpd 
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/.build-id
/usr/lib/.build-id/72
/usr/lib/.build-id/72/ca63b253f865702e043a3e2b9dc9093556b550

#-e  卸载
[root@study Packages]# rpm -e vsftpd 
[root@study Packages]# rpm -q vsftpd
未安装软件包 vsftpd 

#-ivh  给用户点体验度
[root@study Packages]# rpm -ivh vsftpd-3.0.3-49.el9.x86_64.rpm 
警告:vsftpd-3.0.3-49.el9.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID fd431d51: NOKEY
Verifying... #警告出现的原因:最初的linux安装软件,大部分是开源的,允许被二次开发。存在一批人二次开发时植入病毒代码了,其他人下载后会中毒。红帽把常用的上万个软件包封装到镜像中,放了秘钥id,让系统知道是红帽检验过的无病毒的包。自己不认识自己的id,解决:--import导入红帽签名
################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:vsftpd-3.0.3-49.el9              ################################# [100%]




#--import 导入红帽的签名。解决警告的出现

[root@study myfilep]# rpm --import RPM-GPG-KEY-redhat-beta 
[root@study myfilep]# rpm --import RPM-GPG-KEY-redhat-release 
[root@study myfilep]# rpm -e vsftpd 
[root@study myfilep]# rpm -ivh AppStream/Packages/vsftpd-3.0.3-49.el9.x86_64.rpm 
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:vsftpd-3.0.3-49.el9              ################################# [100%]
   
 #-Uvh升级:升级时,注意重要配置文件的备份
#--nodesps  卸载时忽略依赖关系

依赖问题:

bash 复制代码

yum软件包管理

软件仓库:(和window的软件仓库一样:迅雷)

本地仓库:自己的本机上搭建的。

网络仓库:只要能联网,使用网络仓库下载软件

本地yum源(软件包的来源)配置(本地软件仓库):

/etc/yum.repo.d/[自定义名称,以.repo结尾]

bash 复制代码
[root@study ~]# vim /etc/yum.repos.d/local.repo


#配置的内容:

yum安装只需要指定包名就可以了

bash 复制代码
#查看系统中提供的软件包
[root@study ~]# yum list | grep java | grep jdk
java-1.8.0-openjdk.x86_64                            1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-demo.x86_64                       1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-devel.x86_64                      1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-headless.x86_64                   1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-javadoc.noarch                    1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-javadoc-zip.noarch                1:1.8.0.362.b09-4.el9              AppStream 
java-1.8.0-openjdk-src.x86_64                        1:1.8.0.362.b09-4.el9              AppStream 
java-11-openjdk.x86_64                               1:11.0.18.0.10-3.el9               AppStream 
java-11-openjdk-demo.x86_64                          1:11.0.18.0.10-3.el9               AppStream




#搜索该命令由哪个软件包产生
[root@study ~]# yum provides ab
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:1:34:25 前,执行于 2024年05月06日 星期一 03时52分11秒。
httpd-tools-2.4.53-7.el9.x86_64 : Tools for use with the Apache HTTP Server
仓库        :mylocal
匹配来源:
文件名    :/usr/bin/ab

源码包

控制安装的路径等:源码包

1、下载源码包 官网下载

2、

shell

是一门编程语言。

语言的分类:

编译型语言:c、c++

解释性语言 shell、python、php

规范shell脚本组成

脚本的本质就是命令的堆积

.sh结尾的--》一看就是shell脚本。不加也可以

1、环境声明

那个解释器去解释你的命令

解释器查看:cat /etc/shells

#!/bin/bash(环境声明)

2、可执行的代码

注释#

如何写好一个shell脚本

1、明确需求

2、按需求整理好每一步,先做什么,在做什么

3、运行脚本,根据运行的结果进行拍错

4、优化脚本达到最终效果

编写第一个脚本

bash 复制代码
#创建账户,设置密码。passwd这种需要交互式的,不适合写在脚本中。会卡住

vim mysh.sh

#!/etc/bash
useradd zhangsan
echo 123456 | passwd --stdin zhangsan


#执行shell脚本
./mysh.sh

脚本要进行执行,就需要添加x可执行权限哦

如果你是超级管理员,那么可执行文件可以在任何位置,都能够执行。如果你是普通用户,那么你是不能执行写在管理员家目录下的shell脚本的。因为你进不去

案例:通过脚本,搭建yum仓库

脚本的执行方式

1、赋予文件执行权限,用绝对路径或者相对路径进行执行

./xxx.sh是为了让系统知道这是个执行文件

2、不给权限,直接 bash 文件绝对路径或者相对路径

特殊符号补充

" " :引用整体

' ':引用整体

区别:单引号引用整体并且取消特殊字符的含义

bash 复制代码
[root@study ~]# echo "path:$PATH"
path:/root/.local/bin:/root/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
[root@study ~]# echo 'path:$PATH'
path:$PATH

$[] :四则运算 + - * / %

echo $[1+1+1]

$() 取命令结果作为参数

反引号:将命令的结果取出来

bash 复制代码
[root@study ~]# touch myfile`date "+%H%X"`.txt
[root@study ~]# ls
04:27:08  1.txt  视频  下载    桌面             myfile0404时29分07秒.txt

判断文件的状态

看到认识即可

[命令]:

全部是在[空格 -e 文件 空格 ]中 一定不要忘记前后的空格

bash 复制代码
[root@study ~]# [ -e /etc ]
[root@study ~]# echo $?   #问一下上个命令的结果
0

整数的比较

bash 复制代码
[root@study ~]# [ 1 -gt 1 ]
[root@study ~]# echo $?
1
[root@study ~]# [ 1 -ge 1 ]
[root@study ~]# echo $?
0
[root@study ~]# [ 1 -eq 1 ]
[root@study ~]# echo $?
0
[root@study ~]# [ 1 -lt 1 ]
[root@study ~]# echo $?
1
[root@study ~]# [ 1 -le 1 ]
[root@study ~]# echo $?
0
[root@study ~]# [ 1 -ne 1 ]
[root@study ~]# echo $?
1

字符串对比

==

!=

bash 复制代码
[root@study ~]# [ a == b ]
[root@study ~]# echo $?
1
[root@study ~]# [ a == a ]
[root@study ~]# echo $?
0
[root@study ~]# [ a != b ]
[root@study ~]# echo $?
0
[root@study ~]# [ $USER == root ]
[root@study ~]# echo $?
0

常用的数值运算

bash 复制代码
#shell风格
[root@study ~]# echo $[1+1+1]
3

#c语言风格
[root@study ~]# echo $((3*2))
6


[root@study ~]# echo `expr 1+1`
1+1
[root@study ~]# echo `expr 1 + 1`
2
[root@study ~]# echo `expr 1 * 1`
expr: 语法错误:未预期的参数 "04:27:08"

#*具有别的意义,需要进行转义
[root@study ~]# echo `expr 1 \* 1`
1
[root@study ~]# echo `expr 1 / 1`
1



[root@study ~]# let a=5+1
[root@study ~]# echo $a
6
[root@study ~]# let a=5-1
[root@study ~]# echo $a
4

let的简写

a++ a-- a+=1 a-=1 a*=1 a/=1

bash 复制代码
[root@study ~]# a=12
[root@study ~]# b=1
[root@study ~]# let c=a+b
[root@study ~]# echo $c
13
[root@study ~]# let c++
[root@study ~]# echo $c
14
[root@study ~]# let c--
[root@study ~]# echo $c
13
[root@study ~]# let c+=10
[root@study ~]# echo $c
23
[root@study ~]# let c-=10
[root@study ~]# echo $c
13

字符串的判断

-z 字符串的值为 空为真

-n 字符串的值非空为真

可以判断文件,可以判断变量

bash 复制代码
[root@study ~]# [ -z /etc/passwd ]
[root@study ~]# echo $?
1
[root@study ~]# a=zhangsan
[root@study ~]# [ -z $a ]
[root@study ~]# echo $?
1
[root@study ~]# a=
[root@study ~]# [ -z $a ]
[root@study ~]# echo $?
0


[root@study ~]# [ -n /etc/passwd ]
[root@study ~]# echo $?
0

shell条件判断与循环

条件判断结构

&&:与。如果a命令执行成功后才回去执行b,a执行失败则不会去执行b

||:或者 :只有a执行失败时才回去执行b。a命令执行成功的话,那么b命令就不会进行执行了。

; 条件之间没有逻辑关系

bash 复制代码
[root@study ~]# rpm -q vsftpd && systemctl start vsftpd
未安装软件包 vsftpd 



[root@study ~]# rpm -q vsftpd || yum install vsftpd未安装软件包 vsftpd 
正在更新 Subscription Management 软件仓库。
无法读取客户身份

本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。

上次元数据过期检查:0:01:32 前,执行于 2024年05月13日 星期一 23时25分17秒。
依赖关系解决。
===================================================
 软件包   架构     版本          仓库         大小
===================================================..........................................


#存在vsftpd时:
[root@study ~]# rpm -q vsftpd && systemctl start vsftpd
vsftpd-3.0.5-5.el9.x86_64

[root@study ~]# rpm -q vsftpd || yum -y install vsftpd && systemctl start vsftpd && systemctl enable vsftpd && systemctl status vsftpd

案例:判断文件是否存在,存在则拷贝到指定的路径下

if条件判断结构

bash 复制代码
###单分支  

#语法结构1  用的比较多
if [条件判断];then
	条件成立时执行的代码
fi

#语法结构2
if [条件判断]
	then
		条件成立时执行的代码
fi


if [ -f /etc/passwd ];then
	echo "文件存在"
fi



#目前脚本停留在改别人的脚本
## 双分支   缩进没有严格要求
if [条件判断];then
	条件成立时执行的命令
	else
		体检不成立时执行的命令
fi




	

猜数字练习(数字0-9之间) /dev/random

set 查看系统中所有的变量

bash 复制代码
[root@localhost shelltest]# echo $RANDOM
9206
[root@localhost shelltest]# echo $RANDOM
25390
[root@localhost shelltest]# echo $[RANDOM%10]
7
[root@localhost shelltest]# echo $[RANDOM%10]



#开始大战手脚
#!/bin/bash
read -p "请输入一个0-9之间的整数:" num
num1=$[RANDOM%10]
if [ $num -eq $num1 ];then
        echo "恭喜你猜对啦"
else
        if [ $num -gt $num1 ];then
                echo "猜的数字有点大了"
        else
                echo "猜的数小了"
        fi
fi




#安装软件的脚本
#!/bin/bash
RPM=`rpm -q vsftpd &> /dev/null ; echo $?`
if [ $RPM -eq 0 ];then
        systemctl start vsftpd
        systemctl enable vsftpd &> /dev/null
        echo "软件包已经安装并且设置了随机自启"
else    
        yum -y install vsftpd &> /dev/null
        systemctl start vsftpd
        systemctl enable vsftpd &> /dev/null
        echo "yijingjinxinganzhuangla"
fi      

多分支语句:

bash 复制代码
#!/bin/bash
read -p "请输入自己的成绩查询等级:" num
if [ $num -ge 90 ];then
        echo '成绩非常优秀'
elif [ $num -ge 80 ];then
        echo '还不错。差一点点'
elif [ $num -ge 70 ];then
        echo '成绩一般,还需要努力'
elif [ $num -ge 60 ];then
        echo '勉强及格了'
else
        echo '回家歇歇吧'
fi
 

case条件判断

bash 复制代码
#case条件判断的语法
case $变量名 in
值1)
	执行的命令;;
值2)
	执行的命令;;
*)
    执行的命令
esac




#!/bin/bash
read -p "请输入今天星期几:" num
case $num in
        1)
                echo "今天星期一";;
        2)
                echo "今天星期二";;
        3)
                echo "今天星期三";;
        *)
                echo "其他的输入"

esac




[root@localhost shelltest]# bash case_01.sh 
请输入今天星期几:3
今天星期三
[root@localhost shelltest]# bash case_01.sh 
请输入今天星期几:5
其他的输入

for循环

根据变量的取值,重复执行xx命令

for 变量名 in 值1 值2 值3 值n

do

​ 执行的命令

dine

bash 复制代码
#循环创建用户的脚本
[root@localhost shelltest]vim for_01.sh

for i in xiaoming xiaozhang xiaosan
do 
        useradd $i
        echo "123456" | passwd $i --stdin &> /dev/null
        echo "用户$i创建成功"
done



[root@localhost shelltest]# bash for_01.sh


用户xiaoming创建成功
用户xiaozhang创建成功
用户xiaosan创建成功



#测试服务器的连通性
#!/bin/bash
for i in {1..255} 
do
        ping -c2  -i0.1 -w1 192.168.115.$i

done

-c  ping次数
-i ping的延迟时间
-w 指定超时时间


#!/bin/bash
for i in {1..255} 
do
        ping -c2  -i0.1 -w1 192.168.115.$i &> /dev/null
        if [ $? -eq 0 ];then
                echo "192.168.115.$i up" >> /up.txt
        else
                echo "192.168.115.$i down" >> /down.txt
        fi

done
~   
[root@localhost shelltest]# bash for_ping.sh 
192.168.115.1 up
192.168.115.2 up
192.168.115.3 down
192.168.115.4 down
192.168.115.5 down
192.168.115.6 down
192.168.115.7 down
192.168.115.8 down
192.168.115.9 down
192.168.115.10 down
192.168.115.11 down
192.168.115.12 down
192.168.115.13 down
192.168.115.14 down
192.168.115.15 down
192.168.115.16 down
192.168.115.17 down
192.168.115.18 down
192.168.115.19 down
192.168.115.20 up

while 循环

只有条件成立时重复执行命令

bash 复制代码
while 条件判断
do
	执行的命令
done

while :

:表示的是循环

bahs 复制代码
while :
do
	echo "1111"
done

利用while循环监控网卡进出口流量

bash 复制代码
#!/bin/bash
while :
do
        clear
        ifconfig ens160 | head
 -2        ifconfig ens160 | grep
 "RX p"  #网卡入口流量
        ifconfig ens160 | grep
 "TX p"
 #网卡出口流量
        sleep 1
done    

练习:

使用while循环编写测试整个网段ip地址连通性的脚本

bash 复制代码
#!/bin/bash
i=1


while [ $i -le 254 ]
do
        IP="192.168.115.$i"

        ping  -c2 -i0.1 -w1 $IP &> /dev/null
        if [ $? -eq 0 ];then
                echo "$IP up"
        else
                echo "$IP down"
        fi
        let i++
done

shell脚本字符串处理

函数

bash 复制代码
#格式1:
function 函数名 {
命令1
命令2
命令n

}


[root@localhost shelltest]# function myFn {
> ll
> date
> ifconfig ens160
> }
[root@localhost shelltest]# myFn 



#格式2
函数名() {
执行的命令1
执行的命令2
执行的命令n
......
}



[root@localhost shelltest]# xo(){
> echo "函数"
> date
> }
[root@localhost shelltest]# xo
函数
2024年 06月 03日 星期一 05:17:12 EDT

脚本中断及退出

break 结束循环

continue 结束本次循环,立刻开始下一次循环

exit 退出脚本

bash 复制代码
#!/bin/bash
re=$[RANDOM%10]
while :
do

        read -p "请猜数字:" num
        if [ $num -eq $re ];then
                echo "猜对了"
                break
        elif [ $num -lt $re ];then
                echo "猜小了"
        else
                echo "猜大了"
        fi
done
~       

字符串的截取

bash 复制代码
[root@localhost shelltest]# phone=13028420333
[root@localhost shelltest]# echo ${#phone}
11

[root@localhost shelltest]# echo ${phone:0:3}  #从第几位开始截取:截取几位
130

[root@localhost shelltest]# echo ${phone:7:4}
0333



#shell脚本生成随机八位密码
#!/bin/bash
w="ncdcdkcskcwkdjrfioppjklmn@#4123456789ACXSHXSXJS"
for i in {1..8}
do
        re=$[RANDOM%47]
        n=${w:re:1}
        pass=$pass$n
done
echo $pass

字符串的替换

bash 复制代码
[root@localhost ~]# echo ${phone/2842/****}
130****3333
[root@localhost ~]# echo ${phone//3/g}    #能匹配到的所有的3替换成g
1g02842gggg



替换不会更改原来的变量

字符串的掐头去尾

bash 复制代码
[root@localhost ~]# echo ${phone#2}
13028423333
[root@localhost ~]# echo ${phone#*2} #从左到右最短匹配删除
8423333
[root@localhost ~]# echo ${phone##*2}   #从左到右最长匹配删除


[root@localhost ~]# echo ${phone%4}
13028423333
[root@localhost ~]# echo ${phone%4*}
13028
[root@localhost ~]# echo ${phone%%3*}

批量修改文件扩展名

bash 复制代码
#!/bin/bash
for i in `ls /shelltest/*.txt`
do
        mv $i ${i%txt}doc
done




#替换
#!/bin/bash
for i in `ls /shelltest/*.doc`
do
        mv $i ${i/doc/txt}
done

数组和正则表达式

数组

bash 复制代码
#数组的定义1
[root@localhost shelltest]# arr1=(1 2 3 4 5 zhangsan)
[root@localhost shelltest]# echo $arr1
1
[root@localhost shelltest]# echo ${arr1[0]}
1
[root@localhost shelltest]# echo ${arr1[1]}
2
[root@localhost shelltest]# echo ${arr1[2]}
3
[root@localhost shelltest]# echo ${arr1[@]}
1 2 3 4 5 zhangsan



#数组的定义方式2
数组名[下标=值]
[root@localhost shelltest]# arr2[0]=zhangsan
[root@localhost shelltest]# arr2[1]=lisi
[root@localhost shelltest]# arr2[2]=wangwu
[root@localhost shelltest]# echo ${arr2[@]}
zhangsan lisi wangwu



#通过数组#!/bin/bash
ruanjian=(vsftpd httpd)
for i in ${ruanjian[@]}
do
        yum -y install $i &> /dev/null
        echo "$i软件安装完成"
done
下载软件包
bash 复制代码
#\  :可以认为是命令不想放在一行
[root@localhost shelltest]# echo zhangsan\
> 123\
> yyy
zhangsan123yyy

正则表达式

基本正则符号

bash 复制代码
[root@localhost shelltest]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#
[root@localhost shelltest]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost shelltest]# grep nologin$ /etc/passwd


#[]  匹配当中的任意单个字符


#[^]取反

# . 匹配任意单个字符


#* 匹配前一个字符出现的任意次数
[root@localhost shelltest]# grep "[0-9]*" /etc/passwd

#{m,n}请一个字符出现n-m次

#{n} 匹配前一个字符n次

扩展正则符号

{n,m}

()

|

\b 单词边界

扩展正则在使用时有些需要用egrep

或者给grep添加选项 -E

bash 复制代码
##分组
[root@localhost ~]# echo "<a>我是一个链接标签</a>"|egrep "^<[a-z]+>.*<\/[a-z]+>$"
<a>我是一个链接标签</a>
[root@localhost ~]# echo "<a>我是一个链接标签</div>"|egrep "^<[a-z]+>.*<\/[a-z]+>$"
<a>我是一个链接标签</div>
[root@localhost ~]# echo "<a>我是一个链接标签</div>"|egrep "^<([a-z]+)>.*</\1>$"
[root@localhost ~]# echo "<a>我是一个链接标签</a>"|egrep "^<([a-z]+)>.*</\1>$"
<a>我是一个链接标签</a>



#\b :表示不允许出现字母数字下划线
搜索the时肯定会把具有there锁在的行也拽出来

[root@localhost shelltest]# grep -E "the" b.txt
the  1234
there
[root@localhost shelltest]# grep -E "the\b" b.txt
the  1234

如何匹配大范围的数字?比如250-255 200~249

shell四剑客 sed、awk

sed

grep虽然支持正则表达式,但是可以做的事情只有查找匹配,能做的事情很少

sed(流式编辑器)是非交互的文本编辑器,实现的功能和vim相同。主要是对文件的内容进行输出、删除、替换、复制、剪切、导入、导出等。

-----逐行处理,并将结果输出到屏幕。出现的年代很久远。上古神器

命令格式:

前置命令 | sed [选项] '[条件指令]' 文件名

sed [选项] '[条件指令]' 文件名

sed常用选项如下

-n 屏蔽默认输出,默认sed会输出读取文档的全部内容
-r 支持扩展正则
-i 修改源文件(练习的时候不添加)

条件可以是行号或者/正则/,没有条件时默认为所有行都执行指令.

条件时确认在哪一行执行指令

指令可以是p输出、d删除、s替换

sed默认会把处理完之后的结果再显示一遍给用户。在不需要的时候,添加上-n选项

sed逐行处理。哪行的条件满足了,就在哪一行干这个活儿。sed干活都是从头逐行看到尾

输出:

bash 复制代码
#行号案例

#查看所有行
[root@localhost shelltest]# sed -n "p" user.txt 
#查看第四行
[root@localhost shelltest]# sed -n "4p" user.txt 
[root@localhost shelltest]# sed -n "4,+1p" user.txt
#查看第四行到第六行
[root@localhost shelltest]# sed -n "4,6p" user.txt 
#输出第和第六行
[root@localhost shelltest]# sed -n "4p;6p" user.txt 
#从第一行开始每两行输出一次
[root@localhost shelltest]# sed -n "1~2p" /user.txt 
#输出具有nologin的行
[root@localhost shelltest]# sed -n '/nologin/p'user.txt 

#打印最后一行
[root@localhost ~]# sed -nr '$p' /shelltest/user.txt 

#显示行号
[root@localhost ~]# sed -nr '=' /shelltest/user.txt

[root@localhost ~]# sed -nr '/nologin$/=' /shelltest/user.txt 
#输出文件的行数
[root@localhost shelltest]# sed -n '$=' user.txt 
10


#取反
[root@localhost ~]# sed -n '1!p' /shelltest/user.txt 
[root@localhost ~]# sed -nr '/[0-9]{4}/!p' /shelltest/user.txt 


#使用正则:
[root@localhost ~]# sed -nr '/[0-9]{4}/p'/shelltest/user.txt 
user1:x:1000:1000:user1:/home/user1:/bin/bash
xiaoming:x:1001:1001::/home/xiaoming:/bin/bash
xiaozhang:x:1002:1002::/home/xiaozhang:/bin/bash
xiaosan:x:1003:1003::/home/xiaosan:/bin/bash

删除:

bash 复制代码
[root@localhost ~]# sed  '$d' /shelltest/user.txt 
[root@localhost ~]# sed  '/nologin/d' /shelltest/user.txt 

替换:

bash 复制代码
[root@localhost shelltest]# sed "s/2017/6666/" tihaun.txt 
6666 2011 2018
6666 2017 2024
6666 2017 2017

[root@localhost shelltest]# sed "2s/2017/6666/" tihaun.txt 
2017 2011 2018
6666 2017 2024
2017 2017 2017

[root@localhost shelltest]# sed "2s/2017/6666/2" tihaun.txt 
2017 2011 2018
2017 6666 2024
2017 2017 2017

[root@localhost shelltest]# sed "3s/2017/6666/2" tihaun.txt 
2017 2011 2018
2017 2017 2024
2017 6666 2017

#第三行的2017全部替换成6666
[root@localhost shelltest]# sed "3s/2017/6666/g" tihaun.txt 
2017 2011 2018
2017 2017 2024
6666 6666 6666

#将存在2024的行的2017替换为6666
[root@localhost shelltest]# sed "/2024/s/2017/6666/" tihaun.txt 
2017 2011 2018
6666 2017 2024
2017 2017 2017



#思考:如何把/bin/bash改为/sbin/sh   转义符号  \ :屏蔽一个特殊符号的特殊功能
sed "s/\/bin\/bash/\/sbin\/sh/g" /etc/passwd

#最佳方案:把s/// 替换符换了,只要分割的三个符号一样就行  s###  s@@@  都可以
[root@localhost shelltest]# sed "s#/bin/bash#/sbin/sh#" /etc/passwd

#用A作为分割符也可以
[root@localhost shelltest]# sed "sA/bin/bashA/sbin/shA" /etc/passwd
bash 复制代码
#写脚本改服务启动端口   /etc/httpd/conf/httpd.conf

#!/bin.bash
yum -y remove httpd
rm -rf /etc/httpd
yum -y install httpd >> /dev/null
echo "set-test~" > /var/www/html/index.html
sed -i  '/^Listen 80$/s/0/2/' /etc/httpd/conf/httpd.conf
setenforce 0
systemctl restart httpd
systemctl enable httpd
~




检验是否成功:
curl 127.0.0.1:82


ss -ntulp | grep httpd
bash 复制代码
 #s///p  ;p会只显示替换了的行
 [root@localhost AppStream]# sed -n '/bash$/s#:.*##p' /etc/passwd
root
user1
xiaoming
xiaozhang
xiaosan




#!/bin/bash
#grep "/bash$/" /etc/passwd | sed -rn "s#/:.*/##"
name=`sed -rn '/bash$/s/:.*//p' /etc/passwd`
for i in $name
do
        passwd=`grep "$i" /etc/shadow`
        passwd=${passwd#*:}  #掐头
        passwd=${passwd%%:*}  #去尾
        echo "${i}---------->${passwd}"
done

任务:准备新的虚拟机(4台),最小化安装方式,不带图形化

同网段之间互通,配置好yum,修改主机名。最小化中有vi,没有vim

0~199 200~249 150~255

1?\d?

bash 复制代码
[root@localhost shelltest]# echo 13 | grep -P "^1?[0-9]?[0-9]$"

[root@localhost shelltest]# echo 166|grep -P "^1?\d?\d$" 


#抓ip地址
0.0.0.0~255.255.255.255

匹配0.~255.之间的范围
25[0-5]\.|2[0-4][0-9]\.|1?[0-9]?[0-9]\.
#最终的正则
(25[0-5]\.|2[0-4][0-9]\.|1?[0-9]?[0-9]\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])
[root@localhost shelltest]# echo "121.111.121.137" | grep -P "^(25[0-5]\.|2[0-4][0-9]\.|1?[0-9]?[0-9]\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9]?[0-9])$"

grep:

  • -e 用于指定单个模式进行匹配。
  • -E 使用扩展正则表达式进行匹配。
  • -F 将模式视为固定字符串进行匹配。
  • -G 使用基本正则表达式进行匹配。
  • -P 使用 Perl 兼容的正则表达式进行匹配

() :表示保留 粘贴用\数字

bash 复制代码
[root@localhost shelltest]# echo "<div>cdncjd</a>"| grep -P "<[a-z]+>.*<\/[a-z]+>"
<div>cdncjd</a>
[root@localhost shelltest]# echo "<div>cdncjd</a>"| grep -P "<([a-z]+)>.*<\/\1>"
[root@localhost shelltest]# echo "<a>cdncjd</a>"| grep -P "<([a-z]+)>.*<\/\1>"
<a>cdncjd</a>

sed扩展

a 行下追加

i 行上添加

c 替换整行

() 除了表示一个整体外,还有保留的意思,也可以认为是复制

bash 复制代码
[root@localhost shelltest]# sed "a  新添加的" 1.txt
[root@localhost shelltest]# sed "2a  新添加的" 1.txt
[root@localhost shelltest]# sed "/^[0-5]/a  新添加的" 1.txt

#将0-5开头的行全部替换为"新添加的"
[root@localhost shelltest]# sed "/^[0-5]/c  新添加的" 1.txt


[root@localhost shelltest]# echo 123 zhangsan| sed -r "s/(123)( )(zhangsan)/\3\2\1/"
zhangsan 123

awk 精确搜索

逐行处理并输出

获取指定的数据并且对数据进行统计

awk [选项] "[条件]{[指令]}" 文件

💮-F :定义分隔符

指令 print 输出

条件 // 匹配正则表达式

bash 复制代码
[root@localhost shelltest]# awk  "/the/{print}" awktest 
hello the world


#awk存在内置变量   $1:第一列    $2:第二列    $3   ...... $0:所有列   NR :行号   NF:列号(一共有几列)
[root@localhost shelltest]# awk '{print $1}' awktest 
hello
welcome


[root@localhost shelltest]# awk '{print $1,$3,$0}' awktest 
hello world hello the world
welcome beijing welcome to beijing

#NR显示行号
[root@localhost shelltest]# awk '/the/{print NR,$0}' awktest 
1 hello the world


#awk默认是用户空格分割列的
#-F  指定分隔符
[root@localhost shelltest]# sed -n '/bash$/p' /etc/passwd | awk -F: '{print $1}'
root
user1
xiaoming
xiaozhang
xiaosan


[root@localhost shelltest]# awk -F: ' {print $1"的id号是"$3}' /etc/passwd
root的id号是0
bin的id号是1
daemon的id号是2
adm的id号是3


#多个符号做分隔符 [:/]
[root@localhost shelltest]# awk -F[:/] '{print$9}' /etc/passwd





[root@localhost shelltest]# df -h | awk '/\/$/{print "根分区剩余容量是"$4}'
根分区剩余容量是13G


[root@localhost shelltest]# ifconfig ens160 | awk '/RX p/{print "ens160网卡的接收数据量是"$5}'
ens160网卡的接收数据量是1067329

让awk处理更多的任务

{} :逐行处理的任务:读取文件时执行,执行n次

BEGIN{} :行前处理,读取文件前执行,只能执行一次

END{}:行后处理,读取文件之后执行,只执行一次

~包含

!~不包含

<

<=

==

>=

!=

<

bash 复制代码
[root@localhost shelltest]# ifconfig ens160 | awk 'BEGIN{print "文档开始读取了"}/RX p/{print "ens160网卡的接收数据量是"$5}'
文档开始读取了
ens160网卡的接收数据量是1082260


[root@localhost shelltest]# ifconfig ens160 | awk 'BEGIN{print "文档开始读取了"}/RX p/{print "ens160网卡的接收数据量是"$5}END{print "读取结束"}'
文档开始读取了
ens160网卡的接收数据量是1097544
读取结束


[root@localhost shelltest]# awk  -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}END{print "总计"NR"行"}' /etc/passwd
User	UID	Home
root	0	/root
bin	1	/bin
daemon	2	/sbin
adm	3	/var/adm
lp	4	/var/spool/lpd
sync	5	/sbin
总计:xx行



[root@localhost shelltest]# awk -F: '$6~/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


awk -F: '$6~/root/{print}' user #输出第6列包含root的行
awk -F: '$6!~/root/{print}' user #输出第6列不包含root的行



[root@localhost shelltest]# awk -F: '$3>=1000' /etc/passwd

01. awk -F: '$3<3{print}' user #输出第3列小于3的行
02. awk -F: '$3 <=3{print}' user #输出第3列小于等于3的行
03. awk -F: 'NR==2{print}' user #输出第2行
04. awk -F: 'NR>2{print}' user #输出行号大于2的行

逻辑测试条件

&&:并且

||:或者

bash 复制代码
[root@localhost shelltest]# awk -F: '$3==1000||$3==1001' /etc/passwd
user1:x:1000:1000:user1:/home/user1:/bin/bash
xiaoming:x:1001:1

[root@localhost shelltest]# awk -F: '$3>=1000&&/^xiaoming/' /etc/passwd
xiaoming:x:1001:1001::/home/xiaoming:/bin/bash
001::/home/xiaoming:/bin/bash


[root@localhost shelltest]# awk 'NR%2==0' /etc/passwd

awk处理日志:

bash 复制代码
[root@localhost httpd]# systemctl start  httpd
[root@localhost httpd]# netstat -antlp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      3128/httpd          
[root@localhost httpd]# curl 127.0.0.1
set-test~


#本机访问不到,进行如下操作

[root@localhost httpd]# systemctl stop firewalld
[root@localhost httpd]# setenforce 0
[root@localhost httpd]# systemctl restart httpd

https服务的日志文件在

/var/log/httpd/access_log

bash 复制代码
[root@localhost httpd]# awk '{print $1}' /var/log/httpd/logs/access_log 

想要简洁的显示某个ip访问了几次。不出现重复的ip

awk数组:

bash 复制代码
[root@localhost shelltest]# a=(1 2 3 4 5 6)
[root@localhost shelltest]# echo ${a[@]}
1 2 3 4 5 6

数组名[下标]=值

bash 复制代码
[root@localhost httpd]# awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'
20


#下标不一定是数字
[root@localhost shelltest]# awk 'BEGIN{a["abc"]="zhansganasjdc";a[1]="zhangsan"}{print a[1],a["abc"]}'
zhangsan zhansganasjdc

数组到文档中收集信息

bash 复制代码
[root@localhost shelltest]# vim shuzu.txt
[root@localhost shelltest]# cat shuzu.txt 
abc


root@localhost shelltest]# vim shuzu.txt 
[root@localhost shelltest]# cat shuzu.txt 
abc
xyz
abc
[root@localhost shelltest]# awk '{a[$1]++}END{print a["abc"] a["xyz"]}' shuzu.txt 
2     1




#awk  for循环可以循环显示数组的下标   for 变量名 in 数组名
[root@localhost shelltest]# awk '{a[$1]++}END{for(i in a){print i, a[i]}} ' shuzu.txt 
opt 1
abc 4
xyz 2


[root@localhost shelltest]# awk '{a[$1]++}END{for(i in a){print i, a[i]}} ' shuzu.txt 
127.0.0.1/24 2
192.168.115.20/24 4



分析地区用户的访问量。用户的恶意访问




#对访问量进行排序   awk数组加for循环 
[root@localhost shelltest]# awk '{a[$1]++}END{for(i in a){print i, a[i]}} ' shuzu.txt | sort -nr(以数字排序 r尾降序)
-k 2 (每行的第二列) 




[root@localhost log]# awk '{a[$1]++}END{for(i in a){print i, a[i]}} ' /shelltest/shuzu.txt | sort -nr -k 2
abc 4
xyz 2
opt 1

/var/log/secure安全日志

简单的脚本的编写:

1、查看根分区剩余空间

2、剩余的内存空间

3、获取cpu信息

uptime:查看瞬间的cpu使用

top是交互式的显示结果

4、服务器中账户的数量

bash 复制代码
#!/bin/bash
df -h | awk '/\/$/{print " 根分区剩余的空间是:" $4}'
free -h | awk '/^Mem/{print "内存剩余的空间是:"$4}'
uptime | awk '{print "cpu15min的平均负载
是:" $NF}'

cat /etc/passwd | awk -F: '$3>=1000{i++}END{print "user:"i }'

who | awk 'END{print "有"NR"个用户正在使用服务器"}'

#安装了多少个包
rpm -qa | awk 'END{print "安装的软件包的数量是"NR"个"}'


需要时刻关注,用循环去执行

脚本练习

案例1:系统初始化

编写一个脚本可以匹配不同系统的服务器(包含7版本与8版本的系统)实现以下需求:

1,所有服务器永久关闭防火墙服务和SELinux

2,关闭7版本系统的命令历史记录,修改8版本的命令历史记录最多保存2000条并加上时间戳

3,关闭8版本系统的交换分区

4,定义root远程登录系统后的ssh保持时间为300秒

5,设置时间同步,ntp服务器地址是192.168.88.240

nginx环境搭建

源码安装:

1、在官网下载nginx安装包

2、通过xftp上传至linux os上

3、tar -xvf 解压缩

4、cd 到目录下

bash 复制代码
#pcre-devel:让ngnix支持正则表达式。ngnix修改配置文件时
#openssh-devel:让ngnix安装加密网站    https


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


[root@localhost /]# cd nginx-1.26.1/
[root@localhost nginx-1.26.1]# ls
auto        conf       html     README
CHANGES     configure  LICENSE  src
CHANGES.ru  contrib    man



#--prefix=/usr/local/nginx  指定安装的路径
#--user=nginx --group=nginx  指定拥有nginx的最大的权限的用户和用户组。不指定的时候默认权限最大的用户是nobody
[root@localhost nginx-1.26.1]# ./configure  --prefix=/usr/local/nginx  --user=nginx --group=nginx




#让nginx可以部署加密网站
[root@localhost nginx-1.26.1]# ./configure --with-http_ssl_module 

[root@localhost nginx-1.26.1]#make
[root@localhost nginx-1.26.1]# make install


[root@localhost nginx-1.26.1]# ls -l /usr/local/nginx/
总用量 4
drwxr-xr-x. 2 root root 4096  7月  8 10:08 conf
drwxr-xr-x. 2 root root   40  7月  8 10:08 html
drwxr-xr-x. 2 root root    6  7月  8 10:08 logs
drwxr-xr-x. 2 root root   19  7月  8 10:08 sbin


#在指定的安装位置出现这四个路径即为nginx安装成功




[root@localhost nginx]# sbin/nginx
#开启nginx

#出现报错的原因可能是因为不存在用户和用户组nginx

#只是给服务使用,不能登陆,更加安全
[root@localhost nginx]useradd nginx -s /sbin/nologin




#查看是否开启 ss  那个服务开启,用的哪个窗口
[root@localhost 
nginx]# ss -ntulp | grep nginx
tcp   LISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=23458,fd=6),("nginx",pid=23457,fd=6))


[root@localhost ~]# netstat -antup| grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3058/nginx: master  
[root@localhost ~]# ss -antup | grep nginx
tcp   LISTEN 0      511                  0.0.0.0:80            0.0.0.0:*     users:(("nginx",pid=3059,fd=6),("nginx",pid=3058,fd=6)) 
bash 复制代码
#关闭nginx服务
[root@localhost nginx]# sbin/nginx -s stop


#重新加载服务的配置文件。服务必须是开启状态
[root@localhost nginx]# sbin/nginx -s reload


#查看版本及安装时添加了哪些配置
[root@localhost nginx]# sbin/nginx -V
nginx version: nginx/1.26.1
built by gcc 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC) 
built with OpenSSL 3.0.1 14 Dec 2021
TLS SNI support enabled
configure arguments: --with-http_ssl_module

查看端口所跑的服务器的信息的

ss -ntulp

ss -antup

nginx的认证功能

限制谁可以访问网站:认证功能 。用户名----密码

修改nginx配置文件 /conf/nginx.conf

定义网站的用户名密码存放处:

创建对应的密码文件:

要求密码必须是加密的形式:加密用到一个工具

bash 复制代码
[root@localhost nginx-1.26.1]# yum install httpd-tools



[root@localhost nginx-1.26.1]# htpasswd -c /usr/local/nginx/passwd tom
New password: 
Re-type new password: 
Adding password for user tom

[root@localhost nginx]# cat passwd 
tom:$apr1$RE2lbDod$xakitr8vPnZK8xHDEo42V.


[root@localhost nginx]# sbin/nginx -s reload

在创建另外一个用户:

bash 复制代码
[root@localhost nginx]# htpasswd passwd jerry
New password: 
Re-type new password: 
Adding password for user jerry
[root@localhost nginx]# cat passwd
tom:$apr1$RE2lbDod$xakitr8vPnZK8xHDEo42V.
jerry:$apr1$YuhlE1Ou$jjBV73/5tCuiYajsG79KU0

虚拟主机

搭建一个服务,开多个网站(互相之间无关联)。用虚拟主机创建三个网站,跑三个业务

回顾httpd:

nginx:

bash 复制代码
网站功能的框架:找http{
#网站相关的配置 .一个server就是一个虚拟主机
server{
listen:80;
server_name:www.a.com;
root:/usr/login/nginx/html; #目录路径
index index.html;#默认页面
}
server{
listen:80;
server_name:www.a.com;
root:/usr/login/nginx/html2; #目录路径
index index.html;#默认页面
}
}
bash 复制代码
#恢复默认的配置
[root@localhost conf]# cp nginx.conf.default nginx.conf
cp:是否覆盖'nginx.conf'? y
bash 复制代码
    server{
		listen  80;
		server_name www.b.com;
		root html_b;
		index index.html;
	}
    server {
        listen       80;
        server_name  www.a.com;

[root@localhost nginx]# sbin/nginx -s reload
[root@localhost nginx]# mkdir html_b
[root@localhost nginx]# vim index.html
#用的是域名,需要进行域名解析
[root@localhost nginx]# echo "192.168.115.139 www.a.com www.b.com" >> /etc/hosts
[root@localhost nginx]# curl www.b.com
<h1>b网站</h1>







别人想要用www.a.com访问,不行,因为没有dns对应的解析

真机是windows:C:\Windows\System32\drivers\etc\hosts

ssl+http常见https网站

末行模式:

105,122s/#//

bash 复制代码
[root@localhost nginx]# mkdir https
[root@localhost nginx]# echo "https加密网站" > https/index.html


#生成私钥
[root@localhost nginx]# openssl genrsa > conf/cert.key


#根据私钥生成公钥
[root@localhost nginx]# openssl req -x509 -key conf/cert.key > conf/cert.pem

[root@localhost nginx]# sbin/nginx -s reload



#-k忽略风险访问
[root@localhost nginx]# curl  -k https://127.0.0.1
https加密网站





[root@localhost nginx]# ss -ntulp | grep nginx
tcp   LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=22726,fd=6),("nginx",pid=12098,fd=6))                                                                                                                     
tcp   LISTEN 0      511          0.0.0.0:443        0.0.0.0:*    users:(("nginx",pid=22726,fd=10),("nginx",pid=12098,fd=10))  

真正意义上公钥和私钥不是自己搞文件的,应该在网络上进行注册。否则会有不安全提示。在网上搜索ssl证书。找一家进行注册即可。

信息摘要:MD5 、sha256

bash 复制代码
[root@localhost nginx]# md5sum conf/nginx.conf
767a31e4fc5af65d73eb26147aba6ac3  conf/nginx.conf
[root@localhost nginx]# sha256sum conf/nginx.conf
7030d85be38b7e9625d8fb8852413803c0e517f81fcef74514dedcd7665094f6  conf/nginx.conf

非域名(端口的)虚拟主机

bash 复制代码
[root@localhost nginx]# curl 192.168.115.139:8000
<h1>b网站</h1>

动态网站之部署LNMP

在ubuntu系统下,可以随意切换版本,并且安装命令稍有不同,可以搜索一下

L:linux

n:nginx

m:mysql

p:php

静态网站:html编写的用户能直接看的。内容不变

动态网站:编程语言编写(php)的,浏览器无法直接翻译的。需要进行翻译一下。内容是动态刷新的。 淘宝、京东......

1、nginx环境搭建:上面有

2、mysql服务安装

bash 复制代码
yum install mysql-server
systemctl start mysqld.service 
systemctl status mysqld.service 
systemctl enable mysqld.service 

3、下载php相关

bash 复制代码
[root@proxy ~]# yum -y install php php-mysqlnd
[root@proxy ~]# yum -y install php-fpm
[root@proxy ~]# systemctl start php-fpm #启动服务
[root@proxy ~]# systemctl status php-fpm #查看服务状态
[root@proxy ~]# systemctl enable php-fpm #设置开机启动

4、配置php-fpm and nginx

a.www.conf中:

listen=127.0.0.1:9000

b、conf/nginx.conf

bash 复制代码
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
           # fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

5、测试数据库:

mysql.php 复制代码
<?php
$host = 'localhost'; // 数据库服务器地址
$dbname = ''; // 数据库名
$user = 'root'; // 数据库用户名
$password = ''; // 数据库密码

// 创建连接
$conn = new mysqli($host, $user, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} else {
        echo "连接成功";
        echo $user;
}
?>
~         
相关推荐
vvw&35 分钟前
如何在 Ubuntu 上安装 Jupyter Notebook
linux·人工智能·python·opencv·ubuntu·机器学习·jupyter
钰爱&4 小时前
【操作系统】Linux之线程同步二(头歌作业)
linux·运维·算法
Yz98766 小时前
Hive基础
大数据·linux·数据仓库·hive·hadoop·bigdata
alibaba_张无忌7 小时前
金融学期末速成笔记
笔记·金融
Stara05117 小时前
Linux系统常用操作与命令指南
linux·vim
white.tie8 小时前
linux配置nginx
linux·运维·nginx
Komorebi.py8 小时前
【Linux】-学习笔记03
linux·笔记·学习
dessler8 小时前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
YRr YRr9 小时前
Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
linux·数据库·ubuntu
程序员劝退师_9 小时前
Kafka学习笔记
笔记·学习·kafka