3、yum私有仓库及网卡配置

yum私有仓库的基本配置

创建本地挂在目录/media/cdrom,并挂在光盘镜像

[root@rocky8 ~]#mkdir /media/cdrom
[root@rocky8 ~]#mount /dev/cdrom /media/cdrom/
[root@rocky8 ~]# df -TH
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  2.0G     0  2.0G   0% /dev
tmpfs               tmpfs     2.0G     0  2.0G   0% /dev/shm
tmpfs               tmpfs     2.0G  9.0M  2.0G   1% /run
tmpfs               tmpfs     2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/rl-root xfs        69G  2.5G   66G   4% /
/dev/sda2           xfs       1.1G  216M  848M  21% /boot
/dev/sda1           vfat      628M  6.1M  622M   1% /boot/efi
/dev/mapper/rl-home xfs        34G  268M   33G   1% /home
tmpfs               tmpfs     392M     0  392M   0% /run/user/0
/dev/sr0            iso9660    12G   12G     0 100% /media/cdrom

进入到/etc/yum.repos.d/目录备份原文件

[root@rocky8 ~]# cd /etc/yum.repos.d/
[root@rocky8 yum.repos.d]# ls
Rocky-AppStream.repo  Rocky-Devel.repo             Rocky-Media.repo  Rocky-PowerTools.repo        Rocky-Sources.repo
Rocky-BaseOS.repo     Rocky-Extras.repo            Rocky-NFV.repo    Rocky-ResilientStorage.repo
Rocky-Debuginfo.repo  Rocky-HighAvailability.repo  Rocky-Plus.repo   Rocky-RT.repo
[root@rocky8 yum.repos.d]# mkdir bak
[root@rocky8 yum.repos.d]# mv Rocky-* bak/
[root@rocky8 yum.repos.d]# ls
bak

创建localsource.repo本地仓库

[root@rocky8 yum.repos.d]# vim localsource.repo
[BaseOS]
name=BaseOS
baseurl=file:///media/cdrom/BaseOS
        https://mirror.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/
        https://mirrors.huaweicloud.com/centos/8/BaseOS/x86_64/os/
        https://mirrors.cloud.tencent.com/centos/8/BaseOS/x86_64/os/
        https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0

[AppStream]
name=AppStream
baseurl=file:///media/cdrom/AppStream
        https://mirror.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/
        https://mirrors.huaweicloud.com/centos/8/AppStream/x86_64/os/
        https://mirrors.cloud.tencent.com/centos/8/AppStream/x86_64/os/
        https://mirrors.aliyun.com/centos/8/AppStream/x86_64/os/
gpgcheck=0


[epel]
name=EPEL
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch
        https://mirrors.cloud.tencent.com/epel/$releasever/Everything/$basearch
        https://mirrors.huaweicloud.com/epel/$releasever/Everything/$basearch
        https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1

[extras]
name=extras
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/os
        https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/os
        https://mirrors.huaweicloud.com/centos/$releasever/extras/$basearch/os 
        https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os	
gpgcheck=0
enabled=1

测试验证repo源是否可用

[root@rocky8 yum.repos.d]# yum repolist all
repo id                                                         repo name                                                        status
AppStream                                                       AppStream                                                        enabled
BaseOS                                                          BaseOS                                                           enabled
epel                                                            EPEL                                                             enabled
extras                                                          extras                                                           enabled

安装服务进行测试验证

[root@rocky8 ~]# yum -y install  httpd
BaseOS                                                                                                  9.7 MB/s | 2.6 MB     00:00    
AppStream                                                                                                27 MB/s | 7.8 MB     00:00    
EPEL                                                                                                     14 kB/s | 4.7 kB     00:00    
extras                                                                                                  6.0 kB/s | 1.5 kB     00:00    
Dependencies resolved.
========================================================================================================================================
 Package                        Architecture        Version                                                Repository              Size
========================================================================================================================================
Installing:
 httpd                          x86_64              2.4.37-47.module+el8.6.0+823+f143cee1.1                AppStream              1.4 M
Installing dependencies:
 apr                            x86_64              1.6.3-12.el8                                           AppStream              128 k
 apr-util                       x86_64              1.6.1-6.el8.1                                          AppStream              104 k
 httpd-filesystem               noarch              2.4.37-47.module+el8.6.0+823+f143cee1.1                AppStream               40 k
 httpd-tools                    x86_64              2.4.37-47.module+el8.6.0+823+f143cee1.1                AppStream              107 k
 mailcap                        noarch              2.1.48-3.el8                                           BaseOS                  38 k
 mod_http2                      x86_64              1.15.7-5.module+el8.6.0+823+f143cee1                   AppStream              153 k
 rocky-logos-httpd              noarch              85.0-4.el8                                             BaseOS                  22 k
Installing weak dependencies:
 apr-util-bdb                   x86_64              1.6.1-6.el8.1                                          AppStream               23 k
 apr-util-openssl               x86_64              1.6.1-6.el8.1                                          AppStream               26 k
Enabling module streams:
 httpd                                              2.4                                                                                

Transaction Summary
========================================================================================================================================
Install  10 Packages

Total size: 2.0 M
Installed size: 5.5 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                1/1 
  Installing       : apr-1.6.3-12.el8.x86_64                                                                                       1/10 
  Running scriptlet: apr-1.6.3-12.el8.x86_64                                                                                       1/10 
  Installing       : apr-util-bdb-1.6.1-6.el8.1.x86_64                                                                             2/10 
  Installing       : apr-util-openssl-1.6.1-6.el8.1.x86_64                                                                         3/10 
  Installing       : apr-util-1.6.1-6.el8.1.x86_64                                                                                 4/10 
  Running scriptlet: apr-util-1.6.1-6.el8.1.x86_64                                                                                 4/10 
  Installing       : httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64                                                    5/10 
  Running scriptlet: httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch                                               6/10 
  Installing       : httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch                                               6/10 
  Installing       : rocky-logos-httpd-85.0-4.el8.noarch                                                                           7/10 
  Installing       : mailcap-2.1.48-3.el8.noarch                                                                                   8/10 
  Installing       : mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64                                                         9/10 
  Installing       : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64                                                         10/10 
  Running scriptlet: httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64                                                         10/10 
  Verifying        : mailcap-2.1.48-3.el8.noarch                                                                                   1/10 
  Verifying        : rocky-logos-httpd-85.0-4.el8.noarch                                                                           2/10 
  Verifying        : apr-1.6.3-12.el8.x86_64                                                                                       3/10 
  Verifying        : apr-util-1.6.1-6.el8.1.x86_64                                                                                 4/10 
  Verifying        : apr-util-bdb-1.6.1-6.el8.1.x86_64                                                                             5/10 
  Verifying        : apr-util-openssl-1.6.1-6.el8.1.x86_64                                                                         6/10 
  Verifying        : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64                                                          7/10 
  Verifying        : httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch                                               8/10 
  Verifying        : httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64                                                    9/10 
  Verifying        : mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64                                                        10/10 

Installed:
  apr-1.6.3-12.el8.x86_64                                          apr-util-1.6.1-6.el8.1.x86_64                                        
  apr-util-bdb-1.6.1-6.el8.1.x86_64                                apr-util-openssl-1.6.1-6.el8.1.x86_64                                
  httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64             httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch      
  httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64       mailcap-2.1.48-3.el8.noarch                                          
  mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64            rocky-logos-httpd-85.0-4.el8.noarch                                  

Complete!

TCP/IP相关笔记

协议由谁规定

ISO(International Organization for Standards)国家标准化组织

OSI(Open System Interconnection)开放式通信系统互联参考模型

Internet Engineering Task Force非国家或国际机构等公共机构所制定的标准,但属于业界公认的标准

协议分层与 OSI 参考模型

功能概览
7应用层针对对特定应用的协议电子邮件 --> 电子邮件协议 远程登录 --> 远程登录协议 文件传输 --> 文件传输协议
6表示层设备固有数据格式和网络标准数据格式的转换接收不同表现形式的信息,如文字流、图像、声音等
5会话层通信管理。负责建立和断开通信连接(数据流动的逻辑通路)。管理传输层以下的分层何时建立连接、何时断开连接以及保持多久的连接
4传输层管理两个节点之间数据传输。负责可靠传输(确保数据被可靠地传输到目的地址)是否有数据丢失
3网络层地址管理和路由选择经过哪个路由传递到目的地址
2数据链路层互联设备之间传送和识别数据帧数据帧与比特流之间转换
1物理层以‘0’、‘1’ 代表电压的高低、灯光的闪灭。界定连接器和网线的规格比特流和电子信号的切换 连接器与网线的规格
7应用层应用层 DNS、HTML、HTTP、TLS/SSL、SMTP、POP、IMAP、TELNET、SSH、FTP、SNMP、MIB、SIP、RTP、LDAP应用程序
6表示层
5会话层
4传输层传输层 TCP、UDP、UDP-Lite、SCTP、DCCP操作系统
3网络层互联网层 ARP、IP、ICMP、IPsec
2数据链路层网卡层设备驱动程序与网络接口
1物理层硬件

区别:OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。

  • 硬件(物理层)
    TCP/IP的最底层是负责数据传输的硬件。
  • 网络接口层(数据链路层)
    网络接口层利用以太网中的数据链路层进行通信,因此属于接口层。
  • 互联网层(网络层)
    互联网层使用IP协议,它相当于OSI模型中的第3层网络层。IP协议基于IP地址转发分包数据。所有连接互联网的主机和路由器都必须实现IP的功能,其他连接互联网的网络设备(如网桥、中继器或集线器)就没必要一定实现IP或TCP的功能。
    IP
    IP是跨域网络传送数据包,使整个互联网都能够收到数据的协议。
    虽然IP也是分组交换的一种协议,但是它不具有重发机制。即使分组数据包未能到达对端主机也不会重发。因此,属于非可靠性传输协议。
    ICMP
    IP数据包在发送途中一旦发生异常导致无法到达对端目的地址时,需要给发生端发送一个异常的通知。ICMP就是为这一功能而制定的。它有时也被用来诊断网络的健康状态。
    ARP
    从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议。
  • 传输层
    传输层最主要的功能就是能够让应用程序之间实现通信。
    TCP
    TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况,。此外,TCP还能够有效利用带宽,缓解网络拥堵。
    UDP
    UDP是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的数据。
    UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
  • 应用层(会话层以上的分层)
    浏览器与服务端之间通信所用的协议是HTTP。所传输数据的主要格式是HTML。WWW中的HTTP属于OSI应用层的协议,而HTML属于表示层的协议。
    电子邮件(E-Mail)
    发送电子邮件时用到的协议叫做SMTP(Simple Mail Tranfer Protocol)。
    文件传输(FTP)
    在FTP中进行文件传输时会建立两个TCP连接,分别是发出传输请求时所要用到的控制连接与实际传输数据时所要用到的数据连接。
    远程登录(TELNET 与 SSH)
    网络管理(SNMP)
    在TCP/IP中进行网络管理时,采用SNMP协议。使用SNMP管理的主机、网桥、路由器等称作SNMP代理(Agent),而进行管理的那一段叫做管理器。

MAC地址和IP地址

MAC虽然具体设置制作商编号、内部编号,但是在实际寻址时却是没用的,而IP的层次性才是有用的,IP=网络号+主机号

理解:

  • 网络传输中,每个节点会根据分组数据的地址信息,来判断该报文应该由哪个网卡发送出去,因此,每个地址会参考一个发出接口列表。
  • MAC寻址-地址转发表:MAC地址转发表记录的是实际的MAC地址本身
  • IP寻址-路由控制表:路由控制表记录的IP地址则是集中了之后的网络号
  • 实际的地址转发表与路由控制表获取的信息并不是具体的目标地址,而是该数据应该被发送出去的网卡信息

Mac地址

mac地址长48比特,全世界唯一

注意:

  • 物理机硬件唯一:硬件厂家出厂的mac地址是唯一的,可在互联网中进行通信
  • 虚拟机可不唯一:比如虚拟网卡,没有硬件,mac地址是自己给的,那么会重复的,但是只要不是出现在同一个数据链路就不会出现问题
1单播地址0/多播地址1
2全局地址0/本地地址1
3~24由 IEEE 管理并保证各家厂家不重复
25~48由厂家管理并保证产品之间不重复

IP地址的分类

  • A:0开头,8位网络位+24位主机位,范围 0.0.0.0~127.0.0.0,一个网段可容纳 224-2=16 777 214个主机
  • B:10开头,16+16,范围 128.0.0.1~191.255.0.0,一个网段可容纳 216-2=65 534个主机
  • C:110开头,24+8,192.168.0.0~239.255.255.0,一个网段可容纳 28-2=254个主机
  • D:1110开头,32+2,224.0.0.0~239.255.255.0,无主机地址,常用作多播

全是0:表示网路地址或IP地址不可获知的情况

全是1:表示广播地址

图解TCP协议的三次握手及四次挥手

TCP 连接建立—三次握手

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图

image-20221107115520249

  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态
  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYNACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

为什么是三次握手?不是两次、四次?

常见回答是:“因为三次握手才能保证双方具有接收和发送的能力。”这回答是没问题,但这回答是片面的,并没有说出主要的原因。

什么是 TCP 连接

  • 用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。

所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。

三次握手的原因:

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费

TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。

不使用「两次握手」和「四次握手」的原因:

  • 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
  • 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

TCP 连接断开—四次挥手

image-20221107115823383

  • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
  • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
  • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
  • 等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
  • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
  • 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
  • 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。

你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手

这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。

为什么挥手需要四次?

再来回顾下四次挥手双方发 FIN 包的过程,就能理解为什么需要四次了。

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACKFIN 一般都会分开发送,从而比三次握手导致多了一次。

一键shell脚本实现网卡配置

注意:此脚本目的是快速配置网卡配置文件;执行脚本之后,需要根据不同操作系统手动进行网卡重启进行验证

#!/bin/bash

echo "(1)检查网卡名称,请先使用ip address show进行查看"
read -p "(2)请输入您的网卡名称:" ENS_NAME
#查看IP地址
#NET_IP=`ifconfig ${ENS_NAME}|grep "inet"|grep -v 'inet6'|awk '{print $2}'`
NET_IP=`ip address show ens192| sed -n 3p | awk '{print $2;}' | cut -d '/' -f1`
echo "您现在的ip是:"${NET_IP}

read -p "(3)请输入修改的ip地址:" IP
read -p "(4)请输入修改的netmask:" NETMASK
read -p "(5)请输入修改的gateway网关:" GATEWAY
mv /etc/sysconfig/network-scripts/ifcfg-${ENS_NAME} /tmp/ifcfg-${ENS_NAME}_bak.`date +%Y%m%d%H%M`

echo "(6)正在配置中,请稍后..."
#将网卡的配置信息输出到ifcfg-${ENS_NAME}
cat>>/etc/sysconfig/network-scripts/ifcfg-${ENS_NAME} <<EOF
TYPE=Ethernet
BOOTPROTO=static
IPADDR=${IP}
NETMASK=${NETMASK}
GATEWAY=${GATEWAY}
DNS1=114.114.114.114
NAME=${ENS_NAME}
DEVICE=${ENS_NAME}
ONBOOT=yes
EOF

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

目标实现:

1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有

  • 安装mysql
  • 安装apache
  • 免密钥登陆主机
    当前我们只实现免密钥登陆主机
    3)通过函数封装每个功能
    4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
    5)支持输入一批主机免密钥,使用数组 实现

前提条件:必须先安装expect工具:

 yum  -y  install  expect 

脚本实现:

#!/bin/bash


#实现ssh自动登录
ssh_host() {
while true;do
        read -p "请输入ip(q退出):" IP
                [[ $IP =~ ^(q|Q)$  ]] && exit;
                [[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "IP不合法,请重新输入";continue; }
                break;
done
#set timeout 10
expect <<EE
spawn ssh $IP
expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" {send  "$PASSWORD\n" }

}
#expect eof
interact
EE
read -p "是否继续登录$IP(y/q):" Y
[[ $Y =~ y|Y ]] && ssh $IP || continue;
[[ $Q =~ q|Q ]] && break;
 

}

install_mysql(){
        yum install -y mysql
}
install_apache(){
        yum install -y httpd
}
#菜单
menu() {
while true;do
        PS3="请输入对应的指令:"
        select MENU in  免密登录远程主机 安装mysql 安装apache  退出脚本;do
                case $REPLY in
                        1)
                                ssh_host
                                break
                                ;;
                        2)
                                install_mysql
                                break
                                ;;
                        3)
                                install_apache
                                break
                                ;;
                        *)
                                echo 退出!
                                exit
                                ;;
        esac
        done
done
}
menu

优化2:

#!/bin/bash

#判断系统类型
os_type(){
        if grep -i -q ubuntu /etc/os-release;then
            echo ubuntu
        elif grep -i -q centos /etc/os-release;then
            echo centos
        else
            echo "os can not be supported!"
        fi
}

#实现ssh自动登录
ssh_host() {
while true;do
        read -p "请输入ip(q退出):" IP
                [[ $IP =~ ^(q|Q)$  ]] && exit;
                [[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "IP不合法,请重新输入";continue; }
                break;
done
#set timeout 10
expect <<EE
spawn ssh $IP
expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" {send  "$PASSWORD\n" }

}
#expect eof
interact
EE
read -p "是否继续登录$IP(y/q):" Y
[[ $Y =~ y|Y ]] && ssh $IP || continue;
[[ $Q =~ q|Q ]] && break;
 

}

install_mysql(){
if [ `os_type` = centos ] ;then
        yum install mysql -y
elif [ `os_type` = ubuntu ] ;then
        apt install mysql -y
else
        echo "os can not be supported"
fi
}
remove_mysql(){
if [ `os_type` = centos ] ;then
        yum remove mysql -y
elif [ `os_type` = ubuntu ] ;then
        apt remove mysql -y
else
        echo "os can not be supported"
fi
}

install_apache(){
if [ `os_type` = centos ] ;then
        yum install httpd -y
elif [ `os_type` = ubuntu ] ;then
        apt install  httpd -y
else
        echo "os can not be supported"
fi
}
remove_apache(){
if [ `os_type` = centos ] ;then
        yum remove httpd -y
elif [ `os_type` = ubuntu ] ;then
        apt remove  httpd -y
else
        echo "os can not be supported"
fi
}
#菜单
menu() {
while true;do
        PS3="请输入对应的指令:"
        select MENU in  免密登录远程主机 安装mysql 卸载mysql  安装apache  卸载apache  退出脚本;do
                case $REPLY in
                        1)
                                ssh_host
                                break
                                ;;
                        2)
                                install_mysql
                                break
                                ;;
                        3)
                                remove_mysql
                                break
                                ;;
                        4)
                                install_apache
                                break
                                ;;
                        5)
                                remove_apache
                                break
                                ;;
                        *)
                                echo 退出!
                                exit
                                ;;
        esac
        done
done
}
menu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fqssl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值