第三周作业

1 yum私有仓库的实现及博客输出

配置环境:server端10.0.0.134clinet端10.0.0.139

网页服务:httpd

1.1 安装httpd服务

[15:54:54 root@rocky ~]$ yum -y install httpd
[15:54:54 root@rocky ~]$ systemctl enable --now httpd #开启服务
  • httpd安装启动后会会创建/var/www/html目录文件,在改目录下添加一个index.html文件,然后再浏览器中输入10.0.0.134查看时候服务启动成功。

1.2 根据挂载的镜像文件来构建基于Base的yum 源

[15:58:12 root@rocky ~]$ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0          11:0    1   10G  0 rom  
nvme0n1     259:0    0  200G  0 disk 
├─nvme0n1p1 259:1    0    1G  0 part /boot
└─nvme0n1p2 259:2    0  199G  0 part 
  ├─rl-root 253:0    0   80G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
nvme0n2     259:3    0   20G  0 disk 
├─nvme0n2p1 259:4    0    1G  0 part 
└─nvme0n2p2 259:5    0    2G  0 part 
nvme0n3     259:6    0   20G  0 disk 
├─nvme0n3p1 259:7    0    5G  0 part 
└─nvme0n3p2 259:8    0   15G  0 part 
  └─rl-root 253:0    0   80G  0 lvm  /
nvme0n4     259:9    0   10G  0 disk 
nvme0n5     259:10   0   20G  0 disk 
[15:58:16 root@rocky ~]$ mount /dev/sr0 /mnt/
mount: /mnt: WARNING: device write-protected, mounted read-only.

##3.将/mnt/目录下的关于仓库的文件拷贝至网站服务对应的/var/www/html/对应文件目录下
[15:59:59 root@rocky /mnt]$ cp -a -r AppStream/ BaseOS/ /var/www/html/rocky
  • 现在Rocky8AppSreamBaseOSyum源配置完成。观看网页端:

1.3 下载阿里云的epel源

[16:30:42 root@rocky /var/www/html]$ dnf reposync --repoid=epel --download-metadata -p /var/www/html/rocky

1.4 在客户端配置yum配置文件

[15:41:30 root@rocky8 /etc/yum.repos.d]$ cat base.repo 
[baseOS]
name=CentOS-$releasever - BaseOS
baseurl=http://10.0.0.134/rocky/BaseOS/
gpgcheck=0i

[AppStream]
name=appstream
baseurl=http://10.0.0.134/rocky/AppStream/
gpgcheck=0

[epel]
name=epel
baseurl=http://10.0.0.134/rocky/epel/
gpgcheck=0
  • 下载软件测试

    AppStream源测试

BaseOS源测试

2 TCP协议和三次握手及四次挥手

2.1 TCP协议

  • 特点:

    • 提供面向连接的,可靠的字节流服务
    • 为上层应用层提供服务,不关心具体传输的是什么,也不知道是二进制流还是ascii字符
  • 分层

    • 应用层:对应OSI七层模型的应用层、表示层、会话层
    • 传输层:对应传输层
    • 互联网层:对应网络层
    • 链路层:对应物理层、数据链路层
  • TCP报头结构

    • TCP首部数据通常包含20个字节
    • 1-2字节:源端口号
    • 3-4字节:目标端口号
    • 5-8字节:32位序号,表示本报文段所发送数据的第一个字节的编号。解决数据包乱序的问题
    • 9-12字节:32为确认号,表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号。解决丢包的问题。
    • 13字节:首部长度
    • 6bite:保留
    • 随后6bite:标识位。控制各种状态
      • URG:表示本报文段中发送的数据是否包含紧急数据。只有为1时才有效
      • ACK:确认标识,连接成功后,总为1,为1时才有效
      • PSH:提示接收端应立即从TCP缓冲区中读取走数据,为接收后续数据腾出空间。为1有效。
      • RST:复位标识,为1时表示与主机的连接出现严重错误,必须释放连接,重新建立连接。
      • SYN:建立连接时使用,用来同步序号。当SYN=1ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。
      • FIN:关闭连接标识,标记数据是否发送完毕。为1时表示发送完毕,可以释放连接。
    • 15-16字节:窗口大小,表示现在允许对方发送的数据量。解决流量控制的问题
    • 17-18字节:校验和,解决数据正确性的问题
    • 19-20字节:紧急指针
  1. 2.2 三次握手

    三次握手过程

  • 开始阶段客户端和服务端都处于CLOSE状态,客户端主动打开连接,服务端被动打开,结束CLOSE状态,开始监听某个端口,进入LISTEN状态

    • 第一次握手:客户端向服务店发送连接请求报文,在报文里,SYN=1,初始序列号seq=x,此时,客户端进入SYS_SENT同步已发送状态
    • 第二次握手:服务端接收到请求报文后,若同意连接的话,会向客户端发送确认报文,指定自己的初始序列号seq=y。同时设置确认号ack=x+1,表示已经收到客户端的SYN,此时服务端进入SYS_RCVD同步收到状态
    • 第三次握手:客户端收到确认报文后,再发送一个ACK报文,向服务端传递已经收到确认报文了,此时客户端进入ESTABLISHED状态。服务器接收到ACK报文后也进入ESTABLISHED状态,此时双方就建立了联系。在ACK报文中,ACK=1,确认号ack=y+1,序号seq=x+1。此次握手可以携带数据。

2.3 四次挥手

四次挥手过程

  • 数据传输完毕后,双方都处于ESTABLISHED状态,任何一方都可以终止连接。假如客户端先发起关闭请求

    • 第一次挥手:客户端向服务端发送一个连接释放报文段FIN=1,seq=u,停止数据发送,主动关闭TCP连接,之后客户端进入FIN_WAIT_1终止等待1状态
    • 第二次挥手:服务端收到FIN报文后,会发出确认报文段ACK=1,确认号ack=u+1,序号seq=v,之后服务端进入CLOSE_WAIT关闭等待状态。TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的报文后,进入FIN_WAIT_2终止等待2状态,等待服务端发送的连接释放报文段。
    • 第三次挥手:若服务器已没有要想客户端发送的数据了,服务端也会发送释放连接报文FIN=1,ACK=1,序号seq=w,确认号ack=u+1,此时服务端进入LAST_ACK最后确认状态,等待客户端的确认。
    • 第四次挥手:客户端收到服务端的连接释放报文后,对此发出确认报文段ACK=1,seq=u+1,ack=w+1,客户端此时进入TIME_WAIT时间等待状态。在服务端收到ACK报文后进入CLOSED状态,完成连接的关闭。但是客户端还需要经过2MSL时长后才进入CLOSE状态。

3 静态配置网卡IP,centos/ubuntu实现

3.1 Centos网卡配置

3.1.1 配置文件

  • 文件路径

    /etc/sysconfig/network-scripts/ifcfg-xxx
  • 配置文件参数详解:

    参数 说明
    TYPE 接口类型
    NAME 配置文件应用到的设备
    DEVICE 设备名
    HWADDR 对应设备的MAC地址
    UUID 设备的唯一标识
    BOOTPROTO 激活此设备时使用的地址协议,常用dhcp,static,none,bootp
    IPADDR IP地址
    NETMASK 子网掩码
    PREFIX 网络ID的位数
    GATEWAY 默认网关
    DNS1 第一个DNS服务器
    DNS2 第二个DNS服务器
    DOMAIN 主机不完整是,自动搜索的域名后缀
    ONBOOT 在系统引导时是否激活此设备
    USERCTL 普通用户时候可控制次设备

3.1.2 网卡IP配置

#1 首先在/etc/sysconfig/network-scripts配置ifcfg-eth0文件
[23:20:57 root@rocky /etc/sysconfig/network-scripts]$ cat ifcfg-eth0
DEVICE=eth0
NAME=eth0 
BOOTPROTO=static
IPADDR=10.0.0.134
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=180.76.76.76

#2 针对不同版本的centos系统执行不同的命令,使网卡配置文件生效
## centos6
[22:24:29 root@centos6 ~]$ service network start
## centos7
[22:26:09 root@centos7 ~]$ systemctl restart network
## centos8
[22:27:29 root@rocky ~]$ nmcli c reload
[22:27:29 root@rocky ~]$ nmcli c up eth0

网卡验证:

3.2 Ubuntu网卡配置

3.2.1 配置文件

  • 文件路径:

    #Ubuntu18版本之后
    /etc/netplan/01-netcfg.yaml 
    #Ubuntu18版本之前
    /etc/network/interfaces

3.2.2 静态网卡IP配置

#首先确认网卡名
[18:05:56 root@ubuntu2004 netplan]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:db:8e:62 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.128/24 brd 10.0.0.255 scope global dynamic ens33
       valid_lft 1467sec preferred_lft 1467sec
    inet6 fe80::20c:29ff:fedb:8e62/64 scope link 
       valid_lft forever preferred_lft forever
#修改网卡名为eth0
[18:09:22 root@ubuntu2004 netplan]# sed -i.bak '/^GRUB_CMDLINE_LINUX=/s#"$#net.ifnames=0"#' /etc/default/grub
[18:09:34 root@ubuntu2004 netplan]# grub-mkconfig -o /boot/grub/grub.cfg
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.4.0-124-generic
Found initrd image: /boot/initrd.img-5.4.0-124-generic
Found linux image: /boot/vmlinuz-5.4.0-121-generic
Found initrd image: /boot/initrd.img-5.4.0-121-generic
done
[18:10:22 root@ubuntu2004 ~]# sed -i.bak 's/ens33/eth0/g' /etc/netplan/00-installer-config.yaml
[18:10:40 root@ubuntu2004 ~]# reboot
[18:39:30 root@ubuntu2004 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.128  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fedb:8e62  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:db:8e:62  txqueuelen 1000  (Ethernet)
        RX packets 6796  bytes 9280791 (9.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1537  bytes 178437 (178.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#配置静态IP
[18:41:09 root@ubuntu2004 netplan]# vi /etc/netplan/00-installer-config.yaml
[18:45:40 root@ubuntu2004 netplan]# cat /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    eth0:
      addresses:
        - 10.0.0.128/24
      gateway4: 10.0.0.2
      nameservers:
        addresses: [180.76.76.76, 8.8.8.8]
  version: 2
#使配置生效
[18:45:57 root@ubuntu2004 netplan]# netplan apply
  • 验证配置是否生效

4 实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。

4.1 脚本

#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-15
#FileName:          week3work.sh
#Description:        
#实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
#1)通过shift读取脚本参数
#2)通过select来选择功能.例如功能有
#- 安装mysql
#- 安装apache
#- 免密钥登陆主机
#当前我们只实现免密钥登陆主机
#3)通过函数封装每个功能
#4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功>能。
#5)支持输入一批主机免密钥,使用数组 实现
#***********************************************************

. /etc/os-release
COLOR='echo -e \033[36m'
END='\033[0m'

#安装软件
software_inst(){
    if [ $ID = "rocky" -o $ID = "centos" ];then
        yum -y install $1 && ${COLOR}"\n${1}安装成功!!\n"${END} || ${COLOR}"\n${1}安装出错!请检查\n"${END}
    elif [ $ID = "ubuntu" ];then
        apt update
        apt -y install $1 && ${COLOR}"\n${1}安装成功!!\n"${END} || ${COLOR}"\n${1}安装出错!请检查\n"${END}
    else
        ${COLOR}"\n${1}不支持此系统\n"${END}
    fi
}

#利用expect实现免密登录
EXPECT(){
yum -y install expect
passwd='lgq123'
if [ ! -f /root/.ssh/id_sra.pub ];then                                                                 
    ssh-keygen -t rsa
else
    ${COLOR}"\nid_sra.pub already exists!\n"${END}
fi

while [ "$1" ];do
    expect <<EOF
set timeout 30
spawn ssh-copy-id -i /root/.ssh/id_sra.pub root@${1}
expect {
    "yes/no" {send "yes\n";exp_continue }
    "password" {send "${passwd}\n" }
}
expect eof
EOF
    shift
done
}

PS3="请选择{1-4}:"
select MENU in 安装mysql 安装apache 免密登录 退出;do
case $REPLY in
1)
    software_inst "mysql"
    ;;
2)
    software_inst "httpd"
    ;;
3)
    while :;do
        declare -a IPs
        while :;do
            read -p "$(${COLOR}'请输入远程主机IP:'${END})" ip
            if [[ ${ip} =~ ^(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))$ ]];then
                IPs+=(${ip})
            else
                ${COLOR}"IP不合法,请输入正确的IP!"${END}
                continue
            fi
            read -p "$(${COLOR}'若远程主机IP输入完毕请输入q:'${END})" quit
            [[ ${quit} =~ "q" ]] && break
        done
        EXPECT ${IPs[*]}
        read -p "$(${COLOR}'继续执行还是退出?退出请输入exit:'${END})" option
        if [[ ${option} =~ "exit" ]];then
            break
        fi
    done
    ;;
4)
    break
    ;;
*)
  ${COLOR}"输入错误!"${END}
esac
done

4.2 脚本测试结果

4.2.1 mysql安装测试

4.2.2 apache安装测试

4.2.3 免密登录测试


  转载请注明: 焱黎的博客 第三周作业

  目录