第三周作业

第三周作业

1, 图文并茂说明 RAID0、RAID1、RAID10、RAID01、RAID5 等原理

1.1 RAID0 :条带卷

RAID0 需要至少 2 块硬盘组成,会将数据拆分后分别存入硬盘。

由于 RAID0 读写操作可以并行执行所以读写性能非常大的提升,同时RAID0的磁盘利用率可以达到 100% ,但是 RAID0 不具备容错能力任一硬盘损坏都会导致不可用。

RAID0

1.2 RAID1 :镜像卷

RAID1 需要 2 块相同规格的硬盘组成,如果规格不相同则以规格小的为准。

RAID1 会将数据同时写入两块硬盘相当于是做了个镜像,因此磁盘利用率只有 50% ,对写性能会有些许的不良影响,但是读性能会有些许的优化。

RAID1

1.3 RAID5 :带奇偶校验的条带卷

RAID5 会将拆分后的数据和一个生成的校验位分别存入硬盘,根据校验位和其他数据可以恢复损坏的数据。

RAID5 需要至少** 3 块硬盘**组成,其中校验位数据需要占用一块硬盘的容量,因此磁盘利用率为 (N-1)/N。RAID5相当于在RAID0的基础上多了根据校验恢复数据的容错能力,它是兼顾读写性能和容错能力的阵列。

RAID5

1.4 RAID10

RAID10 是在将多组RAID1组成RAID0,因此至少需要 4 块硬盘组成。RAID10兼顾了RAID1的容错能力和RAID0的高性能,但是磁盘利用率依然只有 50% 。

RAID10 最多只允许每组RAID1损坏一块硬盘,如果一组RAID1的两块硬盘同时损坏则整体不可用。

RAID10

1.5 RAID01

RAID01 是将两组相同规格的RAID0组合为RAID1,至少需要 4 块硬盘。RAID01 也会 RAID10 一样兼顾了RAID0和RAID1的优势和劣势,读写性能好有容错能力,但磁盘利用率只有 50%。

RAID01 允许一组RAID0损坏,也就是说不管RAID0有几块硬盘组成,只要损坏的硬盘都是同一组RAID0中的那么依然可用,如果两组RAID0都有硬盘损坏则整体不可用。

RAID01

2. 创建一个至少有两个PV组成的大小为20G的名为testvg的VG,要求PE大小为16M,而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录

  1. 环境介绍:一个磁盘 100G /dev/sdb

  2. 创建两个20G分区

    fdisk /dev/sdb
    
    Welcome 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 
    
  3. 创建物理卷

    pvcreate /dev/sdb1
    pvcreate /dev/sdb2
    
    pvs # 查看验证
      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
    
  4. 创建卷组 testvg 并指定 PE 为 16M

    vgcreate -s 16 testvg /dev/sdb1 /dev/sdb2
    
    vgdisplay 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
    
  5. 创建 5G 逻辑卷 testlv

    lvcreate -L 5G -n testlv testvg
    
    lvdisplay /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
    
  6. 创建文件系统

    mkfs.ext4 /dev/testvg/testlv
    
  7. 挂载到 /users

    mkdir -p /users
    mount /dev/testvg/testlv /users
    echo "/dev/testvg/testlv /users ext4 defaults 0 0" >> /etc/fstab
    
    df -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用户的文件不能丢失

  1. 文件备份

    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 \;
    
  2. 扩容

    # 扩容
    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                                                
    
  3. 校验文件

    # 方法一:查看目录大小是否相同
    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用户的文件不能丢失

  1. 文件备份

    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 \;
    
  2. 取消挂载

    umount /users
    
  3. 缩容

    # 检查磁盘
    e2fsck -f /dev/testvg/testlv
    # 更新逻辑卷信息
    resize2fs /dev/testvg/testlv 3G
    # 重新设置逻辑卷大小
    lvresize -L 3G /dev/testvg/testlv
    # 检测磁盘
    e2fsck -f /dev/testvg/testlv
    
  4. 重新挂载

    mount /dev/testvg/testlv /users
    
  5. 校验文件

    # 方法一:查看目录大小是否相同
    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创建快照,并尝试基于快照备份数据,验正快照的功能

  1. 准备测试快照功能的文件

    cd /users/archlinux
    touch test{1..3}.txt
    echo 1 > test1.txt
    
  2. 创建快照

    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
    
  3. 验证快照功能

    # 挂载快照
    [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 静态网卡配置

  1. 修改配置文件

    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
    
  2. 启用配置

    # 7 及 7 以前
    systemctl restart network
    # 8 开始
    nmcli connection reload
    nmcli connection up eth0
    
  3. 检查是否生效

    ip a # 检查IP
    cat /etc/resolv.conf # 检查DNS信息
    

9.2 Ubunut 静态网卡配

  1. 修改配置文件

    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
    
  2. 应用配置文件

    netplan apply
    
  3. 检验是否生效

    ip a # 检查IP
    resolvectl status # 检查DNS信息
    

10. 图文并茂解释TCP/IP 3次握手4次断开

TCP/IP 三次握手:客户端请求建立连接 --> 服务端答应并向客户端确认 --> 客户端确认 --> 连接建立

  1. 客户端 将 SYN位 置1 发送序号 x 请求 握手
  2. 服务端 将 SYN位 和 ACK 位 置1 收到请求向客户端确认,ack=x+1 请客户端发送下一个包
  3. 客户端 将ACK位 置1 ,向客户端确认。至此完成了一轮双方的互相往来,连接建立。
三次握手

TCP/IP四次挥手:主动方请求断开 --> 被动方接收请求,让主动方稍等 --> 被动方确认无事,表示确认断开 --> 主动方表示知情 --> 连接断开

  1. 主动方 FIN=1 ,表示要断开连接
  2. 被动方回复 ACK=1 , 表示知情,数据可能还没发送完等待一会儿
  3. 被动方确认数据发送完毕,回复 FIN=1 ACK=1 表示确认断开
  4. 主动方 表示收到,但是没有马上断连而是等待一段时间避免因为网络原因导致数据没传到
  5. 被动放收到主动方发送的确认,关闭连接
四次挥手

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

脚本效果





最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、磁盘LVM管理,完成下面要求,并写出详细过程: 1)创建一个至少有两个PV组成的大小为20G的名为testvg...
    lomg213阅读 401评论 0赞 0
  • Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 1.chown chown将指定文件的拥...
    jyt802341阅读 392评论 0赞 0
  • 1. 公司一开发人员申请对服务器 10 天的 oldboy 普通用户权限,如何操作? useradd oldboy...
    Ambitionx丶阅读 508评论 0赞 0
  • 磁盘配额 现在有这样一个场景,当我们将一个文件系统挂载一个目录下,大小为10个G,用户都可以在这个目录下创建和删除...
    毛利卷卷发阅读 659评论 0赞 1
  • 1.公司一开发人员申请对服务器 10 天的 oldboy 普通用户权限,如何操作? useradd oldboy ...
    1340010b7af0阅读 258评论 0赞 0

友情链接更多精彩内容