第三周作业
1, 图文并茂说明 RAID0、RAID1、RAID10、RAID01、RAID5 等原理
1.1 RAID0 :条带卷
RAID0 需要至少 2 块硬盘组成,会将数据拆分后分别存入硬盘。
由于 RAID0 读写操作可以并行执行所以读写性能非常大的提升,同时RAID0的磁盘利用率可以达到 100% ,但是 RAID0 不具备容错能力任一硬盘损坏都会导致不可用。

1.2 RAID1 :镜像卷
RAID1 需要 2 块相同规格的硬盘组成,如果规格不相同则以规格小的为准。
RAID1 会将数据同时写入两块硬盘相当于是做了个镜像,因此磁盘利用率只有 50% ,对写性能会有些许的不良影响,但是读性能会有些许的优化。

1.3 RAID5 :带奇偶校验的条带卷
RAID5 会将拆分后的数据和一个生成的校验位分别存入硬盘,根据校验位和其他数据可以恢复损坏的数据。
RAID5 需要至少** 3 块硬盘**组成,其中校验位数据需要占用一块硬盘的容量,因此磁盘利用率为 (N-1)/N。RAID5相当于在RAID0的基础上多了根据校验恢复数据的容错能力,它是兼顾读写性能和容错能力的阵列。

1.4 RAID10
RAID10 是在将多组RAID1组成RAID0,因此至少需要 4 块硬盘组成。RAID10兼顾了RAID1的容错能力和RAID0的高性能,但是磁盘利用率依然只有 50% 。
RAID10 最多只允许每组RAID1损坏一块硬盘,如果一组RAID1的两块硬盘同时损坏则整体不可用。

1.5 RAID01
RAID01 是将两组相同规格的RAID0组合为RAID1,至少需要 4 块硬盘。RAID01 也会 RAID10 一样兼顾了RAID0和RAID1的优势和劣势,读写性能好有容错能力,但磁盘利用率只有 50%。
RAID01 允许一组RAID0损坏,也就是说不管RAID0有几块硬盘组成,只要损坏的硬盘都是同一组RAID0中的那么依然可用,如果两组RAID0都有硬盘损坏则整体不可用。

2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
环境介绍:一个磁盘 100G /dev/sdb
-
创建两个20G分区
fdisk /dev/sdbWelcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x0a7bcdbb. Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p Partition number (1-4, default 1): First sector (2048-209715199, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): +20G Partition 1 of type Linux and of size 20 GiB is set Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): Using default response p Partition number (2-4, default 2): First sector (41945088-209715199, default 41945088): Using default value 41945088 Last sector, +sectors or +size{K,M,G} (41945088-209715199, default 209715199): +20G Partition 2 of type Linux and of size 20 GiB is set Command (m for help): p Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x0a7bcdbb Device Boot Start End Blocks Id System /dev/sdb1 2048 41945087 20971520 83 Linux /dev/sdb2 41945088 83888127 20971520 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.partprobe /dev/sdb # 刷新 lsblk /dev/sdb # 查看信息确认 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 100G 0 disk ├─sdb1 8:17 0 20G 0 part └─sdb2 8:18 0 20G 0 part -
创建物理卷
pvcreate /dev/sdb1 pvcreate /dev/sdb2pvs # 查看验证 PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <199.51g 0 /dev/sdb1 lvm2 --- 20.00g 20.00g /dev/sdb2 lvm2 --- 20.00g 20.00g -
创建卷组 testvg 并指定 PE 为 16M
vgcreate -s 16 testvg /dev/sdb1 /dev/sdb2vgdisplay testvg # 查看验证 --- Volume group --- VG Name testvg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size <39.97 GiB PE Size 16.00 MiB Total PE 2558 Alloc PE / Size 0 / 0 Free PE / Size 2558 / <39.97 GiB VG UUID oRAzBU-wEF2-helu-Zknn-Os10-GS5c-jkdQ8z -
创建 5G 逻辑卷 testlv
lvcreate -L 5G -n testlv testvglvdisplay /dev/testvg/testlv # 查看验证 --- Logical volume --- LV Path /dev/testvg/testlv LV Name testlv VG Name testvg LV UUID zjkbQa-qFEe-pV1k-4dsa-mgff-opv1-0T8vRY LV Write Access read/write LV Creation host, time centos7.localhost.local, 2022-12-12 14:48:19 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 320 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:1 -
创建文件系统
mkfs.ext4 /dev/testvg/testlv -
挂载到 /users
mkdir -p /users mount /dev/testvg/testlv /users echo "/dev/testvg/testlv /users ext4 defaults 0 0" >> /etc/fstabdf -h # 查看验证 Filesystem Size Used Avail Use% Mounted on devtmpfs 979M 0 979M 0% /dev tmpfs 991M 28K 991M 1% /dev/shm tmpfs 991M 9.6M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/mapper/centos-root 200G 2.2G 198G 2% / /dev/sda1 497M 131M 367M 27% /boot tmpfs 199M 0 199M 0% /run/user/0 /dev/mapper/testvg-testlv 4.8G 20M 4.6G 1% /users
3. 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d/目录至自己的家目录
useradd -m -d /users/archlinux archlinux
su - archlinux
cp -a /etc/pam.d/* .
ls /etc/pam.d
atd chsh crond fingerprint-auth-ac other password-auth polkit-1 postlogin remote runuser-l smartcard-auth-ac smtp.postfix su sudo-i system-auth systemd-user vmtoolsd
chfn config-util fingerprint-auth login passwd password-auth-ac postgresql postlogin-ac runuser smartcard-auth smtp sshd sudo su-l system-auth-ac vlock
ls /users/archlinux
atd chsh crond fingerprint-auth-ac other password-auth polkit-1 postlogin remote runuser-l smartcard-auth-ac smtp.postfix su sudo-i system-auth systemd-user vmtoolsd
chfn config-util fingerprint-auth login passwd password-auth-ac postgresql postlogin-ac runuser smartcard-auth smtp sshd sudo su-l system-auth-ac vlock
4. 扩展testlv至7G,要求archlinux用户的文件不能丢失
-
文件备份
mkdir -p /data/backup/home/archlinux/ cp -a /users/archlinux/ /data/backup/home/archlinux/ # 生成md5值 find /users/archlinux/ -type f -exec md5sum {} > /data/backup/home/archlinux.md5 \; -
扩容
# 扩容 lvextend -L 7G /dev/testvg/testlv Size of logical volume testvg/testlv changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents). Logical volume testvg/testlv successfully resized. # 检查磁盘 e2fsck -f /dev/testvg/testlv # 查看大小 lvs /dev/testvg/testlv LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert testlv testvg -wi-ao---- 7.00g -
校验文件
# 方法一:查看目录大小是否相同 du -s /users/archlinux/ du -s /data/backup/home/archlinux/ # 方法二:校验md5值 md5sum -c /data/backup/home/archlinux.md5 # 方法三:递归比较 diff -r /data/backup/home/archlinux/ /users/archlinux/
5. 收缩testlv至3G,要求archlinux用户的文件不能丢失
-
文件备份
mkdir -p /data/backup/home/archlinux/ cp -a /users/archlinux/ /data/backup/home/archlinux/ # 生成md5值 find /users/archlinux/ -type f -exec md5sum {} > /data/backup/home/archlinux.md5 \; -
取消挂载
umount /users -
缩容
# 检查磁盘 e2fsck -f /dev/testvg/testlv # 更新逻辑卷信息 resize2fs /dev/testvg/testlv 3G # 重新设置逻辑卷大小 lvresize -L 3G /dev/testvg/testlv # 检测磁盘 e2fsck -f /dev/testvg/testlv -
重新挂载
mount /dev/testvg/testlv /users -
校验文件
# 方法一:查看目录大小是否相同 du -s /users/archlinux/ du -s /data/backup/home/archlinux/ # 方法二:校验md5值 md5sum -c /data/backup/home/archlinux.md5 # 方法三:递归比较 diff -r /data/backup/home/archlinux/ /users/archlinux/
6. 对testlv创建快照,并尝试基于快照备份数据,验正快照的功能
-
准备测试快照功能的文件
cd /users/archlinux touch test{1..3}.txt echo 1 > test1.txt -
创建快照
lvcreate -n testlv-snapshot -s -p r -L 500M /dev/testvg/testlv# 查看信息,验证 lvdisplay /dev/testvg/testlv-snapshot | grep "LV snapshot status" LV snapshot status active destination for testlv -
验证快照功能
# 挂载快照 [root@rocky8 ~]# mkdir /snapshot [root@rocky8 ~]# mount -o ro /dev/testvg/testlv-snapshot /snapshot[root@rocky8 ~]# echo 123 > /users/archlinux/test1.txt [root@rocky8 ~]# rm -f /users/archlinux/test3.txt [root@rocky8 ~]# cat /users/archlinux/test1.txt 123 [root@rocky8 ~]# cat /snapshot/archlinux/test1.txt 1 [root@rocky8 ~]# ls /snapshot/archlinux/test*.txt /snapshot/archlinux/test1.txt /snapshot/archlinux/test2.txt /snapshot/archlinux/test3.txt# 恢复快照 [root@rocky8 ~]# umount /users [root@rocky8 ~]# umount /snapshot [root@rocky8 ~]# lvconvert --merge /dev/testvg/testlv-snapshot [root@rocky8 ~]# mount /dev/testvg/testlv /users [root@rocky8 ~]# cat /users/archlinux/test1.txt 1 [root@rocky8 ~]# ls /users/archlinux/test*.txt /users/archlinux/test1.txt /users/archlinux/test2.txt /users/archlinux/test3.txt
7. 创建10G的RAID1,要求CHUNK为128K,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
# 检查命令是否安装
rpm -q mdadm || yum install -y mdadm
# 基础环境: 使用三个10G磁盘 /dev/sda /dev/sdb /dev/sdc
[root@rocky8-01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
sdb 8:16 0 10G 0 disk
sdc 8:32 0 10G 0 disk
sr0 11:0 1 10.5G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 199.5G 0 part
│ └─rl-root 253:0 0 199.5G 0 lvm /
└─nvme0n1p2 259:2 0 500M 0 part /boot
# 创建RAID0
[root@rocky8-01 ~]# mdadm -C /dev/md0 -c 128K -a yes -l 1 -n 2 -x 1 /dev/sd{a,b,c}
# 创建文件系统
mkfs.ext4 /dev/md0
# 配置挂载
mkdir /mydata
echo "/dev/md0 /backup ext4 defaults 0 0" >> /etc/fstab
mount -a
8. 创建一个可用空间为10G的RAID10设备,要求CHUNK为256K,文件系统为ext4,开机可自动挂载至/mydata目录
# 检查命令是否安装
rpm -q mdadm || yum install -y mdadm
# 基础环境: 使用四个5G磁盘 /dev/sda /dev/sdb /dev/sdc /dev/sdd
[root@rocky8-01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 5G 0 disk
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sr0 11:0 1 10.5G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 199.5G 0 part
│ └─rl-root 253:0 0 199.5G 0 lvm /
└─nvme0n1p2 259:2 0 500M 0 part /boot
# 创建RAID10
[root@rocky8-01 ~]# mdadm -C /dev/md0 -c 256K -a yes -l 10 -n 4 /dev/sd{a,b,c,d}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 查看设备信息
[root@rocky8-01 ~]# ls /dev/md0
/dev/md0
[root@rocky8-01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
sdb 8:16 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
sdc 8:32 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
sdd 8:48 0 5G 0 disk
└─md0 9:0 0 10G 0 raid10
sr0 11:0 1 10.5G 0 rom /misc/cd
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 199.5G 0 part
│ └─rl-root 253:0 0 199.5G 0 lvm /
└─nvme0n1p2 259:2 0 500M 0 part /boot
# 查看RAID信息
[root@rocky8-01 ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Dec 12 09:44:26 2022
Raid Level : raid10
Array Size : 10475520 (9.99 GiB 10.73 GB)
Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Mon Dec 12 09:45:18 2022
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 256K
Consistency Policy : resync
Name : rocky8-01.localhost.local:0 (local to host rocky8-01.localhost.local)
UUID : 6a82d2b9:14fdb82d:c54fb1e3:906dd397
Events : 17
Number Major Minor RaidDevice State
0 8 0 0 active sync set-A /dev/sda
1 8 16 1 active sync set-B /dev/sdb
2 8 32 2 active sync set-A /dev/sdc
3 8 48 3 active sync set-B /dev/sdd
# 创建文件系统
mkfs.ext4 /dev/md0
# 配置挂载
mkdir /mydata
echo "/dev/md0 /mydata ext4 defaults 0 0" >> /etc/fstab
mount -a
# 查看信息
[root@rocky8-01 ~]# df -h /dev/md0
Filesystem Size Used Avail Use% Mounted on
/dev/md0 9.8G 37M 9.3G 1% /mydata
9. 静态配置网卡IP,centos/ubuntu实现
9.1 CentOS 静态网卡配置
-
修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0 NAME=eth0 DEVICE=eth0 BOOTPROTO=none IPADDR=10.0.0.131 PREFIX=24 GATEWAY=10.0.0.2 DNS1=10.0.0.2 DNS2=223.5.5.5 -
启用配置
# 7 及 7 以前 systemctl restart network # 8 开始 nmcli connection reload nmcli connection up eth0 -
检查是否生效
ip a # 检查IP cat /etc/resolv.conf # 检查DNS信息
9.2 Ubunut 静态网卡配
-
修改配置文件
vim /etc/netplan/eth0.yaml network: version: 2 renderer: networkd ethernets: eth0: addresses: - 10.0.0.132/24 gateway4: 10.0.0.2 nameservers: search: [magedu.com] addresses: - 10.0.0.2 - 223.5.5.5 -
应用配置文件
netplan apply -
检验是否生效
ip a # 检查IP resolvectl status # 检查DNS信息
10. 图文并茂解释TCP/IP 3次握手4次断开
TCP/IP 三次握手:客户端请求建立连接 --> 服务端答应并向客户端确认 --> 客户端确认 --> 连接建立
- 客户端 将 SYN位 置1 发送序号 x 请求 握手
- 服务端 将 SYN位 和 ACK 位 置1 收到请求向客户端确认,ack=x+1 请客户端发送下一个包
- 客户端 将ACK位 置1 ,向客户端确认。至此完成了一轮双方的互相往来,连接建立。

TCP/IP四次挥手:主动方请求断开 --> 被动方接收请求,让主动方稍等 --> 被动方确认无事,表示确认断开 --> 主动方表示知情 --> 连接断开
- 主动方 FIN=1 ,表示要断开连接
- 被动方回复 ACK=1 , 表示知情,数据可能还没发送完等待一会儿
- 被动方确认数据发送完毕,回复 FIN=1 ACK=1 表示确认断开
- 主动方 表示收到,但是没有马上断连而是等待一段时间避免因为网络原因导致数据没传到
- 被动放收到主动方发送的确认,关闭连接

11. 网卡绑定bond0的实现
11.1 CentOS/Rocky 配置文件方式
# 配置 bonding
cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
NAME=bond0
TYPE=bond
DEVICE=bond0
BOOTPROTO=none
IPADDR=10.0.0.131
PREFIX=24
GATEWAY=10.0.0.2
DNS1=223.5.5.5
BONDING_OPTS="mode=1 miimon=100"
EOF
# 将 eth0 加入 bond0
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
EOF
# 将 eth1 加入 bond0
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
EOF
# 应用配置文件
nmcli con reload
nmcli con up bond0
nmcli con up eth0
nmcli con up eth1
11.2 nmcli 命令行方式
# 修改配置
nmcli con add type bond con-name bond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 10.0.0.131/24 ipv4.gateway 10.0.0.2 ipv4.dns 223.5.5.5
nmcli con add type bond-slave con-name bond0-eth0 ifname eth0 master bond0
nmcli con add type bond-slave con-name bond0-eth1 ifname eth1 master bond0
# 启用配置
nmcli con up bond0
nmcli con up bond0-eth0
nmcli con up bond0-eht1
11.3 验证方法
[05:51:37 root@rocky8-01 ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:e7:29:85
Slave queue ID: 0
Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:e7:29:8f
Slave queue ID: 0
12. 实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆
#!/bin/bash
#########################
#
# Description:实现免密登录脚本
#
#########################
#
# 为打印添加颜色
echo_color () {
# 颜色
local RED='\e[1;31m'
local GREEN='\e[1;32m'
local YELLOW='\e[1;33m'
local BLUE='\e[1;34m'
local NORMAL='\e[0m'
# 移动光标到的位置
local RES_COL=50
local MOVE_TO_COL="echo -ne \e[${RES_COL}G"
# 获取状态和信息
STATE=$1
LOWER_STATE=$(echo -n "${STATE}" | tr 'A-Z' 'a-z')
shift
case $LOWER_STATE in
success|0)
echo -ne $1
${MOVE_TO_COL}
echo -e "[${GREEN} OK ${NORMAL}]"
;;
failure|1)
echo -ne $1
${MOVE_TO_COL}
echo -e "[${RED}FAILURE${NORMAL}]"
;;
warning|255)
echo -ne $1
${MOVE_TO_COL}
echo -e "[${YELLOW}WARNING${NORMAL}]"
;;
red|红)
echo -e "${RED}$*${NORMAL}"
;;
green|绿)
echo -e "${GREEN}$*${NORMAL}"
;;
yellow|黄)
echo -e "${YELLOW}$*${NORMAL}"
;;
blue|蓝)
echo -e "${BLUE}$*${NORMAL}"
;;
*)
echo "${STATE} $*"
esac
}
# 对指定网段进行扫描
scan_host () {
local NETID=$1
echo_color green "正在扫描网段 ${NETID} ...................."
# 扫描存活的主机
local TEMP_FILE=$(mktemp /tmp/hostXXX)
for i in {1..254} ;do
local TARGET_HOST=${NETID}.${i}
ping -c1 -W1 ${TARGET_HOST} &>/dev/null && echo ${TARGET_HOST} >> ${TEMP_FILE}
done
HOST_LIST=$(cat ${TEMP_FILE})
rm -f ${TEMP_FILE}
echo "当前存活主机:${HOST_LIST}" | paste -s
echo_color green "########### 扫描完毕 ###########"
echo
}
# 检测密钥和expect工具是否存在
check_env () {
echo_color green "正在检查环境 ...................."
# 判断expect是否存在,不存在就安装
if ! `which expect &>/dev/null` ;then
echo_color yellow "expect 不存在,开始安装expect"
yum install -qy expect > /dev/null && echo_color 0 安装expect || echo_color 1 安装expect
else
echo_color 0 检测expect
fi
# 生产私钥和公钥
if [ ! -f ~/.ssh/id_rsa -o ! -f ~/.ssh/id_rsa.pub ] ;then
echo_color yellow "密钥缺失,开始生成秘钥"
rm -f ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
ssh-keygen -P "" -f ~/.ssh/id_rsa &> /dev/null && echo_color 0 生成密钥 || echo_color 1 生成密钥
else
echo_color 0 检测密钥
fi
echo_color green "########### 检查完成,进入免密登录设置 ###########"
echo
}
# 非交互式发送秘钥
send_key () {
expect &>/dev/null <<EOF
set timeout 30
spawn ssh-copy-id -f $1
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$2\n" }
"wanted were added." { exit 0 }
}
expect eof
EOF
if [ $? == 0 ] ;then
echo_color 0 $1
else
echo_color 1 $1
fi
}
# 针对单个IP发送
send_singlehost () {
# 获取主机IP和密码
read -p "请输入目标主机IP: " TARGET_HOST
read -sp "请输入密码:" PASSWD
echo
echo_color green "开始发送密钥 ...................."
# 匹配数值0-255的正则
NUM_REPX="([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
# 匹配网段的正则
NET_REPX="^(${NUM_REPX}\.){2}(${NUM_REPX})$"
# 匹配IP地址的正则
IP_REPX="^(${NUM_REPX}\.){3}(${NUM_REPX})$"
if [[ ${TARGET_HOST} =~ ${IP_REPX} ]] ;then
send_key ${TARGET_HOST} ${PASSWD}
echo_color green "########### 发送完毕,返回菜单 ###########"
else
echo_color red "${TARGET_HOST} 格式不符合,请输入IP"
fi
}
# 批量发送
send_multiplehost () {
# 获取需要发送的对象和密码
read -p "请输入 目标网段 或 多个IP(以空格间隔):" -a TARGET_OBJ
read -sp "请输入密码:" PASSWD
echo
echo_color green "开始执行 ...................."
# 遍历数组,根据类型操作,网段则扫描在发送,IP则直接发送
# 匹配数值0-255的正则
NUM_REPX="([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
# 匹配网段的正则
NET_REPX="^(${NUM_REPX}\.){2}(${NUM_REPX})$"
# 匹配IP地址的正则
IP_REPX="^(${NUM_REPX}\.){3}(${NUM_REPX})$"
for o in ${TARGET_OBJ[@]} ;do
if [[ $o =~ ${NET_REPX} ]] ;then
# 匹配网段
scan_host $o
# 对存活主机发送密钥
for i in ${HOST_LIST} ;do send_key $i $PASSWD ;done
elif [[ $o =~ ${IP_REPX} ]] ;then
# 匹配IP地址
send_key $o $PASSWD
else
echo_color red "$o 格式不符合,请输入IP或网段"
fi
done
echo_color green "########### 发送完毕,返回菜单 ###########"
}
# 设置免密登录的主函数
set_passwdless () {
# 定义菜单
declare -a MENU=( '单机设置' '批量设置' '回到上级菜单' )
# 定义循环结束标志
local FLAGE=1
# 检查环境
check_env
while [ ${FLAGE} -eq 1 ] ;do
echo "########### 免密登录设置 ###########"
PS3="请输入 【 1|2|3 】:"
select m in ${MENU[@]} ;do
case $REPLY in
1)
send_singlehost
# 结束 select
break
;;
2)
send_multiplehost
break # 结束 select
;;
3)
# 设置结束标志位为0 结束 while
local FLAGE=0
break
;;
*)
echo_color red "该选项不存在!!!"
;;
esac
done
echo
done
echo_color green "########### 已结束免密登录设置,返回上级菜单 ###########"
}
install_mysql () {
echo_color green "开始安装MySQL ...................."
echo_color 0 安装MySQL
echo_color green "########### 执行结束,返回菜单 ###########"
}
install_apache () {
echo_color green "开始安装Apache ...................."
echo_color 0 安装Apache
echo_color green "########### 执行结束,返回菜单 ###########"
}
# 主函数
main() {
# 定义菜单
declare -a MENU=( '安装MySQL' '安装Apache' '免密登录配置' '退出')
# 定义循环结束标志
local FLAGE=1
PS3="请输入 【 1|2|3|4 】:"
while [ ${FLAGE} -eq 1 ] ;do
echo "########### 系统配置 ###########"
select m in ${MENU[@]} ;do
case $REPLY in
1) install_mysql ; break ;;
2) install_apache ; break ;;
3) set_passwdless ; break ;;
4) local FLAGE=0 ; break ;;
*) echo_color red "该选项不存在!!!" ;;
esac
done
echo
done
}
trap "echo;echo_color green '########### 程序结束 ###########'" EXIT
main
脚本效果




