第三周
  KDtCPZUvqiPd 2023年11月02日 48 0

yum私有仓库

制作yum私有仓库

#先配置好yum源
[root@Rocky01 ~]# cat /etc/yum.repos.d/cps.repo 
[AppStream]
name=AppStream
baseurl=file:///media/AppStream/
baseurl=https://mirrors.nju.edu.cn/rocky/8/AppStream/x86_64/os/
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=file:///media/BaseOS/
baseurl=https://mirrors.nju.edu.cn/rocky/8/BaseOS/x86_64/os/
enabled=1
gpgcheck=0

[EPEL]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0

[extra]
name=extra
baseurl=https://mirrors.nju.edu.cn/rocky/8/extras/x86_64/os/
enabled=1
gpgcheck=0

[root@Rocky01 ~]# yum repolist 
repo id                                  repo name
AppStream                                AppStream
BaseOS                                   BaseOS
EPEL                                     epel
extra                                    extra


#安装httpd并启用httpd
[root@Rocky01 ~]# yum -y install httpd
[root@Rocky01 ~]# systemctl enable --now httpd


#下载extra仓库的rpm包和meta数据到/var/www/html
[root@Rocky01 ~]# yum reposync --repoid=extra --download-metadata -p /var/www/html/
[root@Rocky01 ~]# tree /var/www/html/extra/
/var/www/html/extra/
├── Packages
│   ├── a
│   │   ├── anaconda-live-33.16.8.8-1.el8.rocky.0.1.x86_64.rpm
│   │   └── anaconda-live-33.16.8.9-1.el8_8.rocky.0.1.x86_64.rpm
│   ├── c
│   │   ├── centos-release-advanced-virtualization-1.0-4.el8.noarch.rpm
│   │   ├── centos-release-ansible-29-1-2.el8.noarch.rpm
│   │   ├── centos-release-ceph-nautilus-1.3-2.el8.noarch.rpm
.....


在网页上访问,能够正常访问

image-20230723143759862

在另外机器上配置yum源并测试

[root@Rocky02 yum.repos.d]# cat >> /etc/yum.repos.d/yum.repo << EOF
[Extra]
name=extra
baseurl=http://10.0.0.5/extra/
enabled=1
gpgcheck=0
EOF


[root@Rocky02 yum.repos.d]# yum list available 
Last metadata expiration check: 0:00:22 ago on Sun 23 Jul 2023 02:48:00 PM CST.
Available Packages
anaconda-live.x86_64                           rpmfusion-free-release.noarch                  8-0.1                        Extra
rpmfusion-free-release-tainted.noarch          8-0.1                        Extra

[root@Rocky02 ~]# yum -y install rpmfusion-free-release.noarch
Last metadata expiration check: 0:01:36 ago on Sun 23 Jul 2023 02:48:00 PM CST.
Dependencies resolved.
=================================================================================
 Package                       Architecture  Version          Repository    Size
=================================================================================
Installing:
 rpmfusion-free-release        noarch        8-0.1            Extra        9.7 k
Installing dependencies:
 epel-release                  noarch        8-18.el8         Extra         24 k

Transaction Summary
=================================================================================
Install  2 Packages

Total download size: 34 k
Installed size: 38 k
Downloading Packages:
(1/2): rpmfusion-free-release-8-0.1.noarch.rpm   4.6 MB/s | 9.7 kB     00:00    
(2/2): epel-release-8-18.el8.noarch.rpm          6.8 MB/s |  24 kB     00:00    
---------------------------------------------------------------------------------
Total                                            3.3 MB/s |  34 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                         1/1 
  Installing       : epel-release-8-18.el8.noarch                            1/2 
  Running scriptlet: epel-release-8-18.el8.noarch                            1/2 
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.

  Installing       : rpmfusion-free-release-8-0.1.noarch                     2/2 
  Running scriptlet: rpmfusion-free-release-8-0.1.noarch                     2/2 
  Verifying        : epel-release-8-18.el8.noarch                            1/2 
  Verifying        : rpmfusion-free-release-8-0.1.noarch                     2/2 

Installed:
  epel-release-8-18.el8.noarch        rpmfusion-free-release-8-0.1.noarch       

Complete!


TCP/IP协议和三次握手及四次挥手

image-20230723151006833

TCP/IP协议

TCP/IP是一种网络通信协议族,它是互联网的核心协议,并被广泛用于连接计算机和设备,实现数据传输和通信。TCP/IP协议族由多个协议组成,每个协议负责不同的网络功能。

TCP/IP协议族详细介绍:

  1. TCP (Transmission Control Protocol):TCP是一种面向连接的、可靠的传输层协议。它负责在网络中传输数据流,并通过数据包确认、重传机制等来确保数据的可靠传输。TCP提供了错误检测、流量控制、拥塞控制等功能,确保数据按顺序和完整性到达目的地。它被广泛用于可靠的数据传输,例如文件传输、网页浏览等。

  2. UDP (User Datagram Protocol):UDP也是一种传输层协议,但它是面向无连接的。与TCP不同,UDP不提供数据包确认和重传机制,因此传输速度较快,但数据传输不可靠。UDP通常用于实时应用,例如音频、视频流传输,以及在传输速度优先于数据完整性的情况下,例如在线游戏。

  3. IP (Internet Protocol):IP是一种网络层协议,用于在网络中寻址和路由数据包。IP协议负责将数据包从源地址发送到目标地址,并在不同的网络之间进行路由选择。IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)是IP的两个主要版本。IPv4使用32位地址,而IPv6使用128位地址,以满足互联网不断增长的地址需求。

  4. ARP (Address Resolution Protocol):ARP是用于将IP地址转换为MAC地址的协议。在局域网中,计算机使用IP地址来寻址,但在链路层(数据链路层),需要使用MAC地址来实际发送数据包。ARP协议负责将IP地址映射到相应的MAC地址,以便在局域网上进行通信。

  5. ICMP (Internet Control Message Protocol):ICMP是一种用于网络故障报告和诊断的协议。它用于发送各种类型的消息,例如网络不可达、主机不可达、超时等,以帮助网络管理员和设备发现网络问题并进行故障排除。

  6. DHCP (Dynamic Host Configuration Protocol):DHCP是一种用于动态分配IP地址和其他网络配置信息的协议。它允许计算机和设备在连接到网络时自动获取IP地址、子网掩码、默认网关和DNS服务器等信息,使得网络配置更加灵活和便捷。

  7. DNS (Domain Name System):DNS是一种用于将域名转换为IP地址的系统。在互联网中,计算机使用IP地址来寻址和通信,但用户通常使用易记的域名来访问网站和服务。DNS协议负责将域名解析为相应的IP地址,使得用户可以使用域名来访问网络资源。

TCP/IP协议族是互联网的基石,它的灵活性和可靠性使得不同类型的设备和系统可以相互通信,实现全球范围的互联网连接。无论是Web浏览、电子邮件、文件传输还是其他网络应用,都离不开TCP/IP协议。

三次握手

image-20230723150901134

TCP三次握手是TCP协议在建立连接时使用的一种握手过程。它的目的是确保客户端和服务器之间的通信路径是可用的、可靠的,并且可以开始数据传输。

image-20230724164525356

图中字符含义:

  • SYN:连接请求/接收 报文段
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号。希望收到的下一个数据的第一个字节的序号

刚开始客户端处于 Closed 的状态,而服务端处于 Listen 状态

CLOSED :没有任何连接状态

LISTEN:侦听来自远方 TCP 端口的连接请求

1. 客户端发送请求连接(SYN)

  • 客户端(主动发起连接的一方)向服务器发送一个特殊的TCP数据包,称为SYN包,其中携带一个随机生成的初始序列号seq作为起始值。这个序列号用于标识本次TCP连接的数据包顺序,确保数据包按正确的顺序传递。此时客户端处于SYN_Send 状态。

SYN-SENT :在发送连接请求后等待匹配的连接请求

2. 服务器确认连接请求(SYN + ACK)

  • 服务器接收到客户端的SYN包后,会回复一个特殊的TCP数据包,称为SYN+ACK包,其中同时携带一个随机生成的初始序列号seq作为起始值。这个序列号用于标识服务器发送给客户端的数据包顺序。
  • 服务器也会确认之前收到的客户端的SYN请求,将客户端的seq加1作为确认号ack 的值,表示收到了客户端的请求,希望收到的下一个数据的第一个字节的序号是 x + 1,此时服务器处于 SYN_REVD 的状态。

SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认

3. 客户端确认服务器的连接确认(ACK)

  • 客户端收到服务器的SYN+ACK包后,会向服务器发送一个确认数据包,称为ACK包,其中将服务器的seq加1作为确认号ack的值,表示收到了服务器的回复,希望收到的下一个数据的第一个字节的序号为y+1。
  • 指明此时客户端的序列号 seq = x + 1(初始为 seq = x,所以第二个报文段要 +1),此时客户端处于 Establised 状态。
  • 服务器收到 ACK 报文之后,也处于 Establised 状态,至此,双方建立起了 TCP 连接。

ESTABLISHED:代表一个打开的连接,数据可以传送给用户

至此,TCP三次握手完成,连接建立成功,双方可以开始传输数据。

为什么是三次握手而不是二次或四次握手?

三次握手是为了确保双方都能正确地收到对方的请求和确认,并建立可靠的连接。

  1. 确认双方的发送和接收能力

    第一次握手,客户端发送请求连接,服务器收到后能够确认客户端的发送能力。

    第二次握手,服务器发送确认连接,并回复自己的初始序列号,客户端收到后能够确认服务器的接收能力。

    第三次握手,客户端再次发送确认,服务器收到后能够确认客户端的接收能力。这样,双方都能确保对方的发送和接收能力正常,避免了无效连接的产生。

  2. 防止旧连接的干扰

    如果只有两次握手,可能会出现已经失效的连接请求到达服务器,导致服务器以为又建立了一个新连接,从而产生混乱。通过三次握手,可以避免这种情况,因为失效的连接请求不会再次发送第三次握手。

  3. 可靠性与安全性

    三次握手是TCP协议的可靠性基础,它确保了连接的稳定和可靠。同时,它还有助于防止网络中的攻击,例如SYN洪泛攻击,通过三次握手可以让服务器确认请求的有效性,避免不必要的资源浪费。

总结:TCP三次握手是建立TCP连接的可靠方式,通过三次握手可以确保双方的发送和接收能力正常,并避免旧连接的干扰,保障连接的可靠性与安全性。

四次挥手

TCP四次挥手是TCP协议在关闭连接时使用的一种挥手过程。它的目的是确保客户端和服务器之间的连接能够正常关闭,并释放相关的资源。

image-20230724164541885

四次挥手是TCP连接的终止过程

图中符号的意思:

  • FIN :连接终止位
  • seq:发送的第一个字节的序号
  • ACK:确认报文段
  • ack:确认号。希望收到的下一个数据的第一个字节的序号

刚开始双方都处于ESTABLISHED 状态,四次挥手的过程如下:

1. 客户端发送关闭连接请求(FIN)

  • 客户端(主动发起关闭连接的一方)向服务器发送一个特殊的TCP数据包,称为FIN包,其中将标志位FIN设置为1,并发送一个seq号,表示客户端不再发送数据。客户端进入FIN-WAIT-1状态,等待服务器的确认。

FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

2. 服务器确认关闭请求(ACK)

  • 服务器收到客户端的FIN包后,会回复一个ACK包,确认收到了客户端的关闭请求,并且将客户端的seq的值+1作为确认号ack的值。服务器进入CLOSE-WAIT状态,等待自己的数据发送完成。

CLOSE-WAIT - 等待从本地用户发来的连接中断请求;

此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,等待服务端发出的连接释放报文段。

FIN-WAIT-2 - 从远程TCP等待连接中断请求;

3. 服务器发送关闭连接请求(FIN)

  • 服务器在发送完所有的数据后,也向客户端发送一个FIN包,将标志位FIN设置为1,表示服务器不再发送数据。服务器进入LAST-ACK状态,等待客户端的确认。

LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认

4. 客户端确认关闭请求(ACK)

  • 客户端收到服务器的FIN包后,会回复一个ACK包,确认收到了服务器的关闭请求。客户端进入TIME-WAIT状态,在此状态下等待一段时间(通常为2倍的报文最大生存时间MSL),确保最后一个ACK能够到达服务器。
  • 服务器在收到客户端的ACK包后,会关闭连接,并进入CLOSED状态。客户端在等待时间结束后,也会关闭连接并进入CLOSED状态。
  • 如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文给服务端)。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。

TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;

CLOSED :没有任何连接状态

至此,TCP四次挥手完成,连接彻底关闭,双方释放了相关的资源。

为什么是四次挥手而不是三次或五次握手?

TCP四次挥手是为了确保双方能够完整地关闭连接,并在确认对方收到关闭请求后再进行最终的关闭。

  1. 双方还可能有数据未传输完成

    在三次挥手时,服务器收到客户端的关闭请求后回复了ACK,表示自己没有数据要发送了。

    但此时客户端可能还有数据未发送完成,因此需要等待一段时间,确保所有数据都被接收。

  2. 服务器需要确认客户端的关闭请求

    在四次挥手时,服务器在发送自己的关闭请求后,需要等待客户端的确认。客户端收到服务器的关闭请求后,回复了ACK,确认服务器的关闭请求已收到。这样,服务器可以安心地关闭连接,不会丢失客户端的任何数据。

  3. 避免服务器处于半连接状态

    在三次挥手时,如果服务器直接关闭连接而不等待客户端的确认,可能会导致服务器处于半连接状态。这是因为服务器已经关闭了连接,但客户端还没有关闭,导致服务器不能再接收来自其他客户端的连接,浪费资源。

  4. MSL的影响

    在四次挥手中,客户端在TIME-WAIT状态等待一段时间(通常为2倍的MSL),确保服务器收到了ACK。这是为了避免在网络中延迟的数据包到达服务器,被错误地当作新连接的请求,从而避免了连接混乱。

总结:TCP四次挥手是确保连接正常关闭的过程,通过四次挥手可以保证双方都能完整地关闭连接,并释放相关资源。四次挥手的设计考虑了数据传输可能未完成、服务器需要确认客户端的关闭请求以及避免服务器处于半连接状态等问题,因此被广泛使用。

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

centos

编辑网络配置文件 /etc/sysconfig/network-scripts/ifcfg-<interface>。其中<interface>是你要配置的网卡接口名称,通常是eth0enp0s3

网络配置项解读

TYPE=xx        #网卡类型
DEVICE=ethx        # 设备名
name=ethx           #应用到的设备
BOOTPROTO=none|dhcp     # 设置为静态或dhcp获取地址
ONBOOT=yes         # 网卡在系统启动时自动启用
IPADDR=x.x.x.x  # 设置静态IP地址
NETMASK=255.255.255.0 | PREFIX=24    # 设置子网掩码
GATEWAY=x.x.x.x    # 设置网关地址
DNS1=8.8.8.8       # 设置首选DNS服务器
DNS2=8.8.4.4       # 设置备用DNS服务器(可选)
...
[root@Rocky02 network-scripts]# cat ifcfg-eth1 
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=10.0.0.20
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254

#编辑后保存退出
[root@Rocky02 network-scripts]# nmcli connection reload 
[root@Rocky02 network-scripts]# nmcli connection up eth1 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
[root@Rocky02 network-scripts]# ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.20  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe84:429e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:84:42:9e  txqueuelen 1000  (Ethernet)
        RX packets 288  bytes 21804 (21.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 121  bytes 10390 (10.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@Rocky02 network-scripts]# ping -I 10.0.0.20 10.0.0.5
PING 10.0.0.5 (10.0.0.5) from 10.0.0.20 : 56(84) bytes of data.
64 bytes from 10.0.0.5: icmp_seq=9 ttl=64 time=0.567 ms
64 bytes from 10.0.0.5: icmp_seq=10 ttl=64 time=0.229 ms
64 bytes from 10.0.0.5: icmp_seq=11 ttl=64 time=0.642 ms
^C

#另外一种方式
[root@Rocky02 ~]# ls /etc/sysconfig/network-scripts/
[root@Rocky02 ~]# nmcli connection add type ethernet ifname eth1 con-name eth1 ipv4.addresses 10.0.0.20/24 ipv4.gateway 10.0.0.254 ipv4.dns 10.0.0.254 autoconnect yes
Connection 'eth1' (48cf7e0c-02fa-49b5-88b3-32a3ec39b43f) successfully added.
[root@Rocky02 ~]# ls /etc/sysconfig/network-scripts/
ifcfg-eth1
[root@Rocky02 ~]# nmcli connection reload 
[root@Rocky02 ~]# nmcli connection up  eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11)
[root@Rocky02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
IPADDR=10.0.0.20
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth1
UUID=48cf7e0c-02fa-49b5-88b3-32a3ec39b43f
DEVICE=eth1
ONBOOT=yes
[root@Rocky02 ~]# ping -I 10.0.0.20 10.0.0.5
PING 10.0.0.5 (10.0.0.5) from 10.0.0.20 : 56(84) bytes of data.
64 bytes from 10.0.0.5: icmp_seq=10 ttl=64 time=0.455 ms
64 bytes from 10.0.0.5: icmp_seq=11 ttl=64 time=0.806 ms
64 bytes from 10.0.0.5: icmp_seq=12 ttl=64 time=0.308 ms
^C
--- 10.0.0.5 ping statistics ---
12 packets transmitted, 3 received, 75% packet loss, time 11233ms
rtt min/avg/max/mdev = 0.308/0.523/0.806/0.208 ms
[root@Rocky02 ~]# 



ubuntu

编辑网络配置文件/etc/netplan/xx.yaml

root@ubuntu01:~# 
root@ubuntu01:~# cat /etc/netplan/01-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  ethernets:
    ens37:
      addresses: [10.0.0.30/24]      
      dhcp4: false
      gateway4: 10.0.0.254
  version: 2
root@ubuntu01:~# netplan apply
root@ubuntu01:~# ifconfig ens37
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.30  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fec9:e34  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c9:0e:34  txqueuelen 1000  (Ethernet)
        RX packets 232  bytes 20147 (20.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 160  bytes 17445 (17.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@ubuntu01:~# ping -I 10.0.0.30 10.0.0.5
PING 10.0.0.5 (10.0.0.5) from 10.0.0.30 : 56(84) bytes of data.
64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=0.215 ms
64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=0.380 ms

脚本题

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

  1. 通过shift读取脚本参数

  2. 通过select来选择功能.例如功能有

    安装mysql

    安装apache

    免密钥登陆主机

  3. 通过函数封装每个功能

  4. 将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。

  5. 支持输入一批主机免密钥,使用数组 实现"

实现脚本

yum -y install expect &> /dev/null

#设置输出字体颜色
function 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 
}

#设置ssh免密有登录
function ssh_host(){
    
    function execute(){
        password="redhat"
        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 }
                "password" { send "$password\n" }
            }       
            expect "#" { send "exit\n" }
            expect eof
EOF
            color $1 0
            shift

        done
    
    }
    
    while true ;do
    declare -a ips  
        while true ;do
            read -p "输入IP,q/Q退出:" ip
            [[ $ip =~ ^(q|Q)$  ]]&&break
            [[ $ip =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]]&&ips[${#ips[*]}]=$ip||{ echo "IP不合法,请重新输入";continue ; }
                        
        done        
    execute ${ips[*]}       
    read -p "是否继续远程主机,输入q/Q退出,其他任意键继续!: " var 
    [[ $var =~ ^q|Q$  ]]&&break
done
    
}

#$1:ID,$2:softname
function soft_install(){
    if [ $1 = 'rocky' -o $1 = "centos" ] ;then
        yum  -y install $2&&color "$1" 0||color "$1" 1
        
    elif [ $1 = 'ubuntu' ] ;then
        apt update
        apt -y install $2&&color "$1" 0||color "$1" 1
        
    else 
        echo "不支持此系统"
        
    fi
}

#自动化菜单
function autoscript (){
. /etc/os-release
sum=0
PS3="请选择(1-5): "
select MENU in 安装mysql 安装apache  安装nginx 免密远程登录主机传输秘钥 退出;do
case $REPLY in
1)  
    soft_install $ID "mysql"    
;;
2)
    soft_install $ID "httpd"
;;
3)
    soft_install $ID "nginx"
;;
4)
    ssh_host
;;
5)
    echo "退出"
    break
;;
*)
    echo "选择有误,重新选择"
;;
esac
done

}

autoscript

测试结果

[root@Rocky01 ~]# bash expect.sh 
1) 安装mysql		     4) 免密远程登录主机传输秘钥
2) 安装apache		     5) 退出
3) 安装nginx
请选择(1-5): 1
Last metadata expiration check: 0:17:53 ago on Mon 24 Jul 2023 09:53:26 PM CST.
Package mysql-8.0.32-1.module+el8.8.0+1283+4b88a3a8.0.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
rocky                                                      [  OK  ]
请选择(1-5): 2
Last metadata expiration check: 0:17:55 ago on Mon 24 Jul 2023 09:53:26 PM CST.
Package httpd-2.4.37-56.module+el8.8.0+1284+07ef499e.6.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
rocky                                                      [  OK  ]
请选择(1-5): 3
Last metadata expiration check: 0:17:58 ago on Mon 24 Jul 2023 09:53:26 PM CST.
Package nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
rocky 														[  OK  ]

#测试免密远程登录主机传输秘钥
请选择(1-5): 4
输入IP,q/Q退出:10.0.0.3
输入IP,q/Q退出:10.0.0.6
输入IP,q/Q退出:10.0.0.256
IP不合法,请重新输入
输入IP,q/Q退出:10.0.277.5
IP不合法,请重新输入
输入IP,q/Q退出:q
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.3

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.3's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.0.0.3'"
and check to make sure that only the key(s) you wanted were added.

expect: spawn id exp6 not open
    while executing
"expect eof"
10.0.0.3                                                   [  OK  ]
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.6

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)

expect: spawn id exp6 not open
    while executing
"expect "#" { send "exit\n" }"
10.0.0.6                                                   [  OK  ]
是否继续远程主机,输入q/Q退出,其他任意键继续!: q
请选择(1-5): 5
退出
请选择(1-5): 4
输入IP,q/Q退出:10.0.0.3
输入IP,q/Q退出:10.0.0.6
输入IP,q/Q退出:10.0.0.256
IP不合法,请重新输入
输入IP,q/Q退出:10.0.277.5
IP不合法,请重新输入
输入IP,q/Q退出:q
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.3

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.3's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.0.0.3'"
and check to make sure that only the key(s) you wanted were added.

expect: spawn id exp6 not open
    while executing
"expect eof"
10.0.0.3                                                   [  OK  ]
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.6

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)

expect: spawn id exp6 not open
    while executing
"expect "#" { send "exit\n" }"
10.0.0.6                                                   [  OK  ]
是否继续远程主机,输入q/Q退出,其他任意键继续!: q
请选择(1-5): 5
退出

验证主机上是否获取到ssh公钥

[root@Rocky01 ~]# hostname -I
10.0.0.5
[root@Rocky01 ~]# cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCdeQW9Eic5JE3csHvGnS32BuWsNgJ3bcETT7+jLw2fUVpTlVZGgjgKyF0IGcaXLihmLGjI6lP8J8PGtxyoTvtv/xgR+GL5PuiqFsOChgdKJ6KhmSZfbkPR0Hjz2HMieGh8PkzVu+YFOugQhT8U//+5a8KYY7zuIF7Wc+T3FwuXtHTOOs4r7cpldgm9SbV4/ryKjxDhU2KZhB9f72mFg7xCMVK/IT9iYVk5py9t2SfNf85TARWitgR8/Esqtj1f7gnvLEsIZNhWqOMeU3TZxkOphw6VRH+6JwcEcm8N3ITB7MBbocQenLZ0UBUTN49MdktwE6R/33UOVqGTuetPiIIJxzfcVUQLMPYa5wovnLo7/eknJYW7Co/F/xmlaVGTEqEmb9oRcbHNpCzTiTBniB44qZ1I87wk3k1epLnznCNDLMRoFgSeuHvmCq8djTBtFGdsQg70Qoo5b/qYmarr+szPWoiSEChGsopa/gW/lIxsKYP8jxrPBmTIjmSGZMFfNWU= root@Rocky01


[root@Rocky02 ~]# hostname -I
10.0.0.6 10.0.0.20 10.0.0.7 
[root@Rocky02 ~]# cat ~/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCdeQW9Eic5JE3csHvGnS32BuWsNgJ3bcETT7+jLw2fUVpTlVZGgjgKyF0IGcaXLihmLGjI6lP8J8PGtxyoTvtv/xgR+GL5PuiqFsOChgdKJ6KhmSZfbkPR0Hjz2HMieGh8PkzVu+YFOugQhT8U//+5a8KYY7zuIF7Wc+T3FwuXtHTOOs4r7cpldgm9SbV4/ryKjxDhU2KZhB9f72mFg7xCMVK/IT9iYVk5py9t2SfNf85TARWitgR8/Esqtj1f7gnvLEsIZNhWqOMeU3TZxkOphw6VRH+6JwcEcm8N3ITB7MBbocQenLZ0UBUTN49MdktwE6R/33UOVqGTuetPiIIJxzfcVUQLMPYa5wovnLo7/eknJYW7Co/F/xmlaVGTEqEmb9oRcbHNpCzTiTBniB44qZ1I87wk3k1epLnznCNDLMRoFgSeuHvmCq8djTBtFGdsQg70Qoo5b/qYmarr+szPWoiSEChGsopa/gW/lIxsKYP8jxrPBmTIjmSGZMFfNWU= root@Rocky01

root@ubuntu01:~# hostname -I
10.0.0.3 10.0.0.30 
root@ubuntu01:~# cat ~/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCdeQW9Eic5JE3csHvGnS32BuWsNgJ3bcETT7+jLw2fUVpTlVZGgjgKyF0IGcaXLihmLGjI6lP8J8PGtxyoTvtv/xgR+GL5PuiqFsOChgdKJ6KhmSZfbkPR0Hjz2HMieGh8PkzVu+YFOugQhT8U//+5a8KYY7zuIF7Wc+T3FwuXtHTOOs4r7cpldgm9SbV4/ryKjxDhU2KZhB9f72mFg7xCMVK/IT9iYVk5py9t2SfNf85TARWitgR8/Esqtj1f7gnvLEsIZNhWqOMeU3TZxkOphw6VRH+6JwcEcm8N3ITB7MBbocQenLZ0UBUTN49MdktwE6R/33UOVqGTuetPiIIJxzfcVUQLMPYa5wovnLo7/eknJYW7Co/F/xmlaVGTEqEmb9oRcbHNpCzTiTBniB44qZ1I87wk3k1epLnznCNDLMRoFgSeuHvmCq8djTBtFGdsQg70Qoo5b/qYmarr+szPWoiSEChGsopa/gW/lIxsKYP8jxrPBmTIjmSGZMFfNWU= root@Rocky01


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jnZtF7Co41Wg   2023年12月11日   31   0   0 nginx客户端服务端
  jnZtF7Co41Wg   2023年12月09日   28   0   0 客户端服务端数据
  4Txe79BjyroE   2023年12月08日   30   0   0 TCP
  Yoru5qB4TSKM   2023年12月10日   39   0   0 服务器重启IP
  jnZtF7Co41Wg   2023年12月10日   22   0   0 nginx客户端服务端NFS
  pfb3gDAOHucg   2023年12月09日   42   0   0 TCP网络层协议UDP
  aYmIB3fiUdn9   2023年12月08日   50   0   0 客户端IPNATlvs