1 yum私有仓库的实现及博客输出
配置环境:
server端
:10.0.0.134
;clinet端
: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
现在
Rocky8
的AppSream
和BaseOS
yum源配置完成。观看网页端:
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
下载软件测试
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=1
,ACK=0
时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1
时,表示对方同意建立连接。SYN=1
,说明这是一个请求建立连接或同意建立连接的报文。FIN
:关闭连接标识,标记数据是否发送完毕。为1
时表示发送完毕,可以释放连接。
- 第
15-16
字节:窗口大小,表示现在允许对方发送的数据量。解决流量控制的问题 - 第
17-18
字节:校验和,解决数据正确性的问题 - 第
19-20
字节:紧急指针
开始阶段客户端和服务端都处于
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