一.yum私有仓库的实现
注:保证客户端与服务器能够相互ping通
仓库服务器配置: (IP:10.0.0.131)
#安装httpd服务
[root@Server ~]# yum install httpd
#设置httpd服务开机自启动
[root@Server ~]# systemctl enable --now httpd
#创建目录用于后续仓库
[root@Server ~]# mkdir -pv /var/www/html/rocky/8
#挂载本地光盘
[root@Server ~]# mount /dev/sr0 /mnt
仓库客户端配置:(IP:10.0.0.130)
#进入原有仓库目录,删除所有以.repo的文件
[root@client ~]# cd /etc/yum.repo/ && rm -rf *
#创建一个新的以repo为后缀的文件
[root@client ~]# cat /etc/yum.repos.d/Rocky-Loacl.repo
[BaseOS]
name=BaseOS
baseurl=http://10.0.0.131/rocky/8/BaseOS
gpgcheck=0
enabled=1
[Appstream]
name=Appstream
baseurl=http://10.0.0.131/rocky/8/AppStream
gpgcheck=0
enabled=1
场景:公司内网一台可以上网,另一台无法上网,但是需要用到extras源,这里以阿里云为例
注:保证本地能上网的那台配置了extras源
服务器端配置:
[root@Server ~]# yum repolist
Failed to set locale, defaulting to C.UTF-8
repo id repo name
Appstream appstream
BaseOS baseos
PowerTools PowerTools - mirrors.aliyun.com
epel epel
extras extras
#下载元数据到指定文件夹
[root@Server ~]# yum reposync --repoid=extras --download-metadata -p /var/www/html/rocky/
#查看元数据repodata是否已经下载
[root@Server ~]# ll /var/www/html/rocky/extras/
drwxr-xr-x. 2 root root 4096 Nov 2 04:29 Packages
drwxr-xr-x. 2 root root 4096 Nov 2 04:29 repodata
客户端仓库配置:
[root@client ~]# cat /etc/yum.repos.d/Rocky-Loacl.repo
[extras]
name=Appstream
baseurl=http://10.0.0.131/rocky/extras
gpgcheck=0
enabled=1
二、画图TCP协议和三次握手及四次挥手
1.1 TCP特性
- TCP提供一种面向连接的、可靠的字节流服务在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。
- TCP使用校验和,确认和重传机制来保证可靠传输。
- TCP给数据分节(给每一个传送的数据字节都编号)进行排序,并使用累积确认保证数据的顺序不变和非重复。
- TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制。
1.2 TCP包头结构
包头各个字段介绍:
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口
某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通
信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536。
序号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0开始。
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号。
数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节。
URG: 表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只
有当URG=1时才有效。
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
PSH: 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如
果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到
的数据读走,就会一直停留在TCP接收缓冲区中。
PST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志
的TCP报文段称为复位报文段。
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报
文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的
数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段。
窗口:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方
发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据。
检验和:提供额外的可靠性。
紧急指针:标记紧急数据在数据字段中的位置。
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
2.1 TCP三次握手的简介
- TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。
- 客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。
- TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Handshaking)
2.2 三次握手过程
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口(请求同步),并选择序号 seq=x,表明传送数据时的第一个数据字节的序号是 x。(seq是个随机值)。发送完毕后,客户端进入 SYN_SEND 状态。
第二次握手(SYN=1, ACK=1, seq=y, ack=x+1):
服务器的TCP收到连接请求报文段后,如同意,则发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号(随机值y),放到seq 域里,同时将确认序号ack设置为客户的 ISN 加1,即 x+1(即回复对方确认收到了序列号为x开始的包,且希望下次的数据从x+1的位置开始)。发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ack=y+1,seq=x+1):
客户端收到此报文段后再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段ack中发送给对方,并且告诉服务器自己的seq=x+1.
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP握手结束。
3.1 TCP四次挥手简介
所谓四次挥手(Four-Way Wavehand)即终止 TCP 连接,就是指数据传送完毕需要断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开。在 socket 编程中,这一过程由客户端或服务端任一方执行`close`来触发。
由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
3.2 TCP四次挥手过程
第一次挥手(FIN=1,seq=u)
- 假设客户端想要关闭连接,客户端发送一个FIN标志位置为 1 的包,表示自己已经没有数据可以发送了,但是仍然可以接受数据。因为有可能服务器还要发送数据,所以发送自己的序列号seq=u,等待服务器确认。
- 发送完毕后,客户端进入FIN_WAIT_1状态。
第二次挥手(ACK=1,seq=v,ack=u+1)
- 服务器端确认客户端的FIN包,发送一个确认包(ACK=1(确认),seq=v(自己的序列号),ack=u+1(确认收到序列号u以前的包,并希望下次发送数据从 u+1 开始)),表明自己接受到了客户端关闭连接的请求,但还没有准备好关闭连接(可能有数据发送)。
- 发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后,进入FIN_WAIT_2状态,等待服务器端关闭连接。
- 在这过程中 TCP 服务器进程会通知高层应用进程。然后从客户端到服务器这个方向的连接就释放了,TCP 连接处于半关闭状态。但是服务器 若发送数据,客户端仍要接收。
第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1)
- 若服务器已经没有要向客户端发送的数据,其应用进程就通知 TCP 释放连接。
- 服务器端准备好关闭连接时,向客户端发送结束连接请求FIN置为 1,ACK=1,seq=w(有数据发送过),ack=u+1。
- 发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,seq=u+1,ack=w+1)
- 客户端接收到来自服务器端的关闭请求,发送一个确认包(在确认报文段中ACK=1,确认号ack=w+1,自己的序号seq=u+1),并进入TIME_WAIT状态,等待可能出现的要求重传的ACK包。(这个确认包是内核进行发送的,上面不能发数据的是客户端的send函数)
- 服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。
- 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。
三、静态配置网卡IP,centos/ubuntu实现
centos:
[root@centos ~]#ifconfig [网卡名] [IP地址] netmake [子网掩码]
如:[root@centos ~]#ifconfig eth0 10.1.1.1 netmake 255.0.0.0
注:该命令使用需要安装net-tools这个包,地址系统重启后失效。
启用和禁用网卡,up表示开启,down表示关闭
[root@centos ~]#ifconfig eth0 up/down
查看网卡流量
[root@centos ~]#ifconfig -s
临时配置IP地址还可以通过ip命令实现
[root@centos ~]#ip address add 10.1.1.1/8 dev eth0
想要永久生效还需要把相关文件写到配置文件中
[root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
ens33:一般指网卡名
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #dhcp表示动态获取地址,static/none表示静态配置地址
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens33
UUID=4f6691c5-a12b-4960-bbdc-1e47bfa8f5b3
DEVICE=ens33
ONBOOT=yes #表示网卡开机自启动
IPADDR=10.0.0.130 #配置IP地址
PREFIX=24 #配置子网掩码
GATEWAY=10.0.0.1 #配置网关
DNS1=114.114.114.114 #配置DNS
DNS2=8.8.8.8
centos 6使配置文件生效的方法:service network restart
centos 7使配置文件生效的方法:systemctl restart network
centos 8使配置文件生效的方法:nmcli connection reload;nmcli connection up ens33(这里指网卡名)
ubuntu
vim /etc/netplan/00-installer-config.yaml
network:
ethernets:
eth0:
dhcp4: true #代表自动获取地址
addresses: [10.1.1.1/24,192.168.1.10/24] #或者用下面两行,两种格式不可混用
- 10.1.1.1/24
- 192.168.1.10/24
gateway4:10.1.1.254
nameservers:
search: [loongson.com,loongson.cn]
address: [111.207.111.194,36.33.26.144]
version: 2
使配置文件生效的方法:
root@ubuntu20:~# netplan apply
四、实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有
- 安装mysql
- 安装apache
- 免密钥登陆主机
当前我们只实现免密钥登陆主机
3)通过函数封装每个功能
4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
5)支持输入一批主机免密钥,使用数组实现
#!/bin/bash #设置输出字体颜色 color () { RES_COL=60 MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_WARNING="echo -en \\033[1;33m" SETCOLOR_NORMAL="echo -en \E[0m" echo -n "$1"&& $MOVE_TO_COL echo -n "[" if [ $2 = "success" -o $2 = "0" ] ;then ${SETCOLOR_SUCCESS} echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE} echo -n $"FAILED" else ${SETCOLOR_WARNING} echo -n $"WARNING" fi ${SETCOLOR_NORMAL} echo -n "]" echo } #判断操作系统平台然后进行软件的安装 judge_os_install (){ if [ $1 = 'rocky' -o $1 = "centos" ] ;then yum -y install $2 && color "$2" 0 || color "$2" 1 elif [ $1 = 'ubuntu' ] ;then apt update apt -y install $2 && color "$2" 0 || color "$2" 1 else echo "不支持此系统" fi } #设置SSH免密登录 ssh_login (){ public_key_put (){ rpm -qa expect || judge_os_install $ID "expect" pw="rocky" [ ! -f ~/.ssh/id_rsa ] && ssh-keygen -P "" -f ~/.ssh/id_rsa while [ "$1" ] ;do expect <<EOF set timeout 20 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$1\n expect { "yes/no" { send "yes\n";exp_continue } "pw" { send "$pw\n" } } expect "#" { send "exit\n" } expect eof EOF shift done } ip_input (){ declare -a IPADDRS IP="" i=0 while read -p "请添加IP地址,输入quit结束:" IP && [ "$IP" != "quit" ] do IPADDRS[$i]="$IP" let i++ done public_key_put ${IPADDRS[*]} } ip_input } #功能菜单 use_menu(){ . /etc/os-release PS3="请选择(1-5): " select MENU in 安装mysql 安装apache 安装nginx 免密远程登录主机传输秘钥 退出;do case $REPLY in 1) judge_os_install $ID "mysql" ;; 2) judge_os_install $ID "httpd" ;; 3) judge_os_install $ID "nginx" ;; 4) ssh_login ;; 5) echo "退出" break ;; *) echo "选择有误,请重新选择1-5的数字" ;; esac done } use_menu