shell脚本知识点8

Shell-day08

1. 昨日回顾


1. For循环的场景示例

2. 批量创建用户,要求只有root有权限执行  设置24位随机密码 将用户及其密码存放在一个密码文件中 权限只有可读

3. 批量删除用户脚本 

4. 批量探测10.0.0.0/24网段内所有主机是否存活 存活的进行探测远程连接端口是否开放

5. 随机点名的脚本   产生一个随机数  不能等于0和大于文件的总行数  求余   

6. 创建不同日期的文件  

7. 数据库的分库分表备份  通用性非常大   必须要会  
 

2. 判断数据库主从复制脚本


1. 主从复制的环境  

2. 服务器能够发邮件

#准备主从复制环境

#主库
[root@db01 ~]# netstat  -lntp | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      13646/mysqld    

[root@db01 ~]# mysqldump -uroot -pqls.123 --single-transaction -R -A  >all.sql  #导出所有的数据库文件
[root@db01 ~]# ll all.sql
-rw-r--r-- 1 root root 1219298 2020-04-28 09:13 all.sql
[root@db01 ~]# scp -rp all.sql root@10.0.0.170:

#主库开启binlog日志及server_id
[root@db01 ~]# vim /etc/my.cnf
log_bin=mysql-bin
server_id=1

[root@db01 ~]# systemctl  restart mariadb.service


[root@db01 ~]# mysql -uroot -pqls.123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#创建用户  主从复制用户
MariaDB [(none)]> grant replication slave on *.* to rep@'10.0.0.%' identified by '123';
Query OK, 0 rows affected (0.01 sec)
#查看binlog日志及所在节点
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      388 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> 



#从库
[root@db02 ~]# yum install -y mariadb-server

[root@db02 ~]# systemctl  start  mariadb.service

[root@db02 ~]# mysqladmin password 'qls.123'

#从库导入主库的数据库文件
[root@db02 ~]# mysql -uroot -pqls.123 < all.sql

[root@db02 ~]# vim /etc/my.cnf
server_id=2
[root@db02 ~]# systemctl  restart mariadb.service 

[root@db02 ~]# mysql -uroot -pqls.123 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> change master to 
    -> master_host='10.0.0.81',
    -> master_user='rep',
    -> master_password='123',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=388;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> start slave; #启动主从复制
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.81
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 388
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 388
              Relay_Log_Space: 825
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)

#从库写入报错  1007  

MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)

#尝试跳过这一次的错误
MariaDB [(none)]> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

#启动从库的主从复制
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show slave status\G

如果出现 1158 1159 1008 1007 1062错误,请跳过此错误。


[root@db01 /service/scripts/day08]# cat master_slave.sh
#!/bin/bash
#定义变量
DB_User=root
DB_Pass=qls.123
IO_Status=$(mysql -u$DB_User -p$DB_Pass  -e "show slave status\G" | awk '/Slave_IO_Running/{print $2}')
SQL_Status=$(mysql -u$DB_User -p$DB_Pass  -e "show slave status\G" | awk '/Slave_SQL_Running/{print $2}')
#判断主从复制异常情况
if [ $IO_Status == "Yes" -a $SQL_Status == "Yes" ];then
    echo "数据库主从复制正常!"
else
    #判断IO线程异常情况
    if [ $IO_Status == "Yes" ];then
        echo "数据库主从复制IO线程正常!"
    else
        echo "数据库主从复制IO线程报错!"
        IO_Error_log=/tmp/myslq_io_error.log
        echo $(date +%F"日"%H:%M"分") >$IO_Error_log
        mysql -u$DB_User -p$DB_Pass -e "show slave status\G" | grep "Last_IO" >>$IO_Error_log
        mail -s "数据库主从复制IO线程报错!"  xxxxx@qq.com < $IO_Error_log
        if [ $? -eq 0 ];then
            echo "数据库主从复制IO线程报错邮件发送成功!"
        else
            echo "数据库主从复制IO线程报错邮件发送失败!"
        fi
    fi
    #判断SQL线程异常情况
    if [ $SQL_Status == "Yes" ];then
        echo "数据库主从复制SQL线程正常!"
    else
        SQL_State=$(mysql -u$DB_User -p$DB_Pass  -e "show slave status\G" | awk '/Last_SQL_Errno/{print $2}')
        case $SQL_State in
            1007|1062|1058|1059|1008)
                echo "数据库主从复制SQL线程出现${SQL_State}报错!脚本尝试跳过这次错误!"
                mysql -u$DB_User -p$DB_Pass  -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
                sleep 3
                SQL_Status=$(mysql -u$DB_User -p$DB_Pass  -e "show slave status\G" | awk '/Slave_SQL_Running/{print $2}')
                if [ $SQL_Status == "Yes" ];then
                    echo "脚本尝试跳过一次错误之后!数据库主从复制SQL线程正常!"
                    echo "脚本尝试跳过一次错误之后!数据库主从复制SQL线程正常!$(date +%F"日"%H:%M"分")" | mail -s "数据库主从复制SQL线程现${SQL_State}报错!已解决!" xxxxx@qq.com  
                else
                    echo "脚本尝试跳过一次错误之后!数据库主从复制SQL线程还是报错!"
                    SQL_Error_log=/tmp/myslq_sql_error.log
                    echo $(date +%F"日"%H:%M"分") >$SQL_Error_log
                    mysql -u$DB_User -p$DB_Pass -e "show slave status\G" | grep "Last_SQL" >>$SQL_Error_log
                    mail -s "数据库主从复制SQL线程报错!" xxxxx@qq.com < $SQL_Error_log
                    if [ $? -eq 0 ];then
                        echo "数据库主从复制SQL线程报错邮件发送成功!"
                    else
                        echo "数据库主从复制SQL线程报错邮件发送失败!"
                    fi
                fi
                ;;
            *)
                echo "数据库主从复制SQL线程出现${SQL_State}报错!"
                SQL_Error_log=/tmp/myslq_sql_error.log
                echo $(date +%F"日"%H:%M"分") >$SQL_Error_log
                mysql -u$DB_User -p$DB_Pass -e "show slave status\G" | grep "Last_SQL" >>$SQL_Error_log
                mail -s "数据库主从复制SQL线程报错!" xxxxx@qq.com < $SQL_Error_log
                if [ $? -eq 0 ];then
                    echo "数据库主从复制SQL线程报错邮件发送成功!"
                else
                    echo "数据库主从复制SQL线程报错邮件发送失败!"
                fi
        esac
    fi
fi

3. 循环语句之while循环概述


while循环只有条件成立,则就会反复执行循环体里面的命令,直到条件为假时,才会结束

无限的循环下去,死循环。

while  条件测试
do
	循环体
done


#三种写法  

while true
do
	循环体
done


while read line
do
	循环体
done < file.txt


while 	[ 条件判断 ]
do
	循环体
done


4. while循环语法示例


#输出数字 0-9  升序 


[root@db01 /service/scripts/day08]# cat while-1.sh
#!/bin/bash
i=0
while [ $i -le 9 ]
do
    echo $i
    let i++
done
[root@db01 /service/scripts/day08]# sh while-1.sh
0
1
2
3
4
5
6
7
8
9

#降序

[root@db01 /service/scripts/day08]# cat while-2.sh
#!/bin/bash
i=9
while [ $i -ge 0 ]
do
    echo $i
    let i--
done
[root@db01 /service/scripts/day08]# sh while-2.sh
9
8
7
6
5
4
3
2
1
0

#两数相乘表

[root@db01 /service/scripts/day08]# cat while-3.sh
#!/bin/bash
a=0
b=9
while [ $a -le 9 ]
do
    echo "$a x $b = $(($a*$b))"
    let a++
    let b--
done
[root@db01 /service/scripts/day08]# sh while-3.sh
0 x 9 = 0
1 x 8 = 8
2 x 7 = 14
3 x 6 = 18
4 x 5 = 20
5 x 4 = 20
6 x 3 = 18
7 x 2 = 14
8 x 1 = 8
9 x 0 = 0


[root@db01 /service/scripts/day08]# cat while-3.sh
#!/bin/bash
a=0
b=9
while [ $a -le 9 ]
do
    echo "$a + $b = $(($a+$b))"
    let a++
    let b--
done
[root@db01 /service/scripts/day08]# sh while-3.sh
0 + 9 = 9
1 + 8 = 9
2 + 7 = 9
3 + 6 = 9
4 + 5 = 9
5 + 4 = 9
6 + 3 = 9
7 + 2 = 9
8 + 1 = 9
9 + 0 = 9


5. 创建不同日期的文件


使用while循环创建10个不同日期的文件

[root@db01 /service/scripts/day08]# cat while-4.sh
#!/bin/bash
File_Dir=/service/scripts/day08/file_dir
[ -d $File_Dir ] || mkdir -p $File_Dir
a=19
while [ $a -le 28 ]
do
    date -s "2020/04/$a" &>/dev/null && touch $File_Dir/$(date +%F).txt
    if [ $? -eq 0 ];then
        echo "$(date +%F).txt文件创建成功!"
    else
        echo "$(date +%F).txt文件创建失败!"
    fi
    a=$(($a+1)) # == let a++ 
done
ntpdate ntp.aliyun.com &>/dev/null
[root@db01 /service/scripts/day08]# sh while-4.sh
2020-04-19.txt文件创建成功!
2020-04-20.txt文件创建成功!
2020-04-21.txt文件创建成功!
2020-04-22.txt文件创建成功!
2020-04-23.txt文件创建成功!
2020-04-24.txt文件创建成功!
2020-04-25.txt文件创建成功!
2020-04-26.txt文件创建成功!
2020-04-27.txt文件创建成功!
2020-04-28.txt文件创建成功!
[root@db01 /service/scripts/day08]# date
Tue Apr 28 12:26:34 CST 2020
[root@db01 /service/scripts/day08]# ll file_dir/
total 0
-rw-r--r-- 1 root root 0 2020-04-19 00:00 2020-04-19.txt
-rw-r--r-- 1 root root 0 2020-04-20 00:00 2020-04-20.txt
-rw-r--r-- 1 root root 0 2020-04-21 00:00 2020-04-21.txt
-rw-r--r-- 1 root root 0 2020-04-22 00:00 2020-04-22.txt
-rw-r--r-- 1 root root 0 2020-04-23 00:00 2020-04-23.txt
-rw-r--r-- 1 root root 0 2020-04-24 00:00 2020-04-24.txt
-rw-r--r-- 1 root root 0 2020-04-25 00:00 2020-04-25.txt
-rw-r--r-- 1 root root 0 2020-04-26 00:00 2020-04-26.txt
-rw-r--r-- 1 root root 0 2020-04-27 00:00 2020-04-27.txt
-rw-r--r-- 1 root root 0 2020-04-28 00:00 2020-04-28.txt

6. 通过读入文件进行创建用户



[root@db01 /service/scripts/day08]# cat while-5.sh
#!/bin/bash
while read line
do
    #判断用户是否存在
    id $line  &>/dev/null
    if [ $? -eq 0 ];then
        echo "用户${line}已经存在!无需再次进行创建!"
    else
        useradd $line &>/dev/null
        if [ $? -eq 0 ];then
            echo "用户${line}创建成功!"
        else
            echo "用户${line}创建失败!"
        fi
    fi
done < user.txt
[root@db01 /service/scripts/day08]# sh while-5.sh
用户ddd1创建成功!
用户ddd2创建成功!
用户ddd3创建成功!
[root@db01 /service/scripts/day08]# sh while-5.sh
用户ddd1已经存在!无需再次进行创建!
用户ddd2已经存在!无需再次进行创建!
用户ddd3已经存在!无需再次进行创建!

7. 通过文件创建用户及其密码


[root@db01 /service/scripts/day08]# cat user.txt
dddd1:gruehgiu 
dddd2:gruehgiu
dddd3:gruehgiu
[root@db01 /service/scripts/day08]# cat while-6.sh
#!/bin/bash
while read line
do
    #User=$(echo $line | awk -F: '{print $1}')
    #Pass=$(echo $line | awk -F: '{print $2}')
    #判断用户是否存在
    id ${line%%:*} &>/dev/null
    if [ $? -eq 0 ];then
        echo "用户${line%%:*}已经存在!无需再次进行创建!"
    else
        useradd ${line%%:*} &>/dev/null && echo "${line#*:}" |passwd --stdin ${line%%:*} &>/dev/null
        if [ $? -eq 0 ];then
            echo "用户${line%%:*}创建成功!密码也设置成功!"
        else
            echo "用户${line%%:*}创建失败!"
        fi
    fi
done < user.txt
[root@db01 /service/scripts/day08]# sh while-6.sh
用户dddd1创建成功!密码也设置成功!
用户dddd2创建成功!密码也设置成功!
用户dddd3创建成功!密码也设置成功!
[root@db01 /service/scripts/day08]# sh while-6.sh
用户dddd1已经存在!无需再次进行创建!
用户dddd2已经存在!无需再次进行创建!
用户dddd3已经存在!无需再次进行创建!

8. 通过读入文件创建用户并设置随机密码


[root@db01 /service/scripts/day08]# cat user.txt
dd1 
dd2
dd3

1. 设置一个随机24位的密码  需要将用户和密码保存到一个文件中,密码文件只有管理员拥有可读权限,其他人没有权限

2. 此脚本只有管理员root才能执行

[root@db01 /service/scripts/day08]# cat while-7.sh
#!/bin/bash
#判断当前用户是否为超级管理员
if [ $USER != "root" -o $UID -ne 0 ];then
    echo "当前用户${USER}对此脚本${0}没有权限执行!"
    exit
fi
while read line 
do
    id $line &>/dev/null
    if [ $? -eq 0 ];then
        echo "用户${line}已经存在!无需再次进行创建!"
    else
        Pass=$(mkpasswd -l 24 -c 6 -C 6 -s 6 -d 6)
        useradd $line &>/dev/null && echo $Pass |passwd --stdin $line &>/dev/null
        if [ $? -eq 0 ];then
            echo "用户${line}创建成功!密码也设置成功!"
            echo -e "User: $line\tPass: $Pass" >>pass.txt
        else
            echo "用户${line}创建失败!"
        fi
    fi
done < user.txt
chmod 400 pass.txt

[root@db01 /service/scripts/day08]# sh while-7.sh
用户dd1创建成功!密码也设置成功!
用户dd2创建成功!密码也设置成功!
用户dd3创建成功!密码也设置成功!
用户及密码信息存放在pass.txt文件中!
[root@db01 /service/scripts/day08]# cat pass.txt 
User: dd1	Pass: AD#258#eD/2?8F>*A4burQom
User: dd2	Pass: Bp}We&QXcG5+(*)1Q754ex0t
User: dd3	Pass: p8B6m&(oFZgn7x5?9G.V($S8
[root@db01 /service/scripts/day08]# sh while-7.sh
用户dd1已经存在!无需再次进行创建!
用户dd2已经存在!无需再次进行创建!
用户dd3已经存在!无需再次进行创建!
用户及密码信息存放在pass.txt文件中!
[www@db01 ~]$ sh /service/scripts/day08/while-7.sh 
当前用户www对此脚本/service/scripts/day08/while-7.sh没有权限执行!

9. 批量创建用户


1. 提示用户输入创建用户的前缀  前缀必须是有字母组成

2. 提示用户输入创建用户的数量  必须为数字组成

3. 询问用户是否创建这些用户 显示用户列表

4. 只有root超级管理员才有权限执行该脚本 

5. 设置24位随机密码 需要将用户和密码保存到一个文件中,密码文件只有管理员拥有可读权限,其他人没有权限

[root@db01 /service/scripts/day08]# cat while-8.sh
#!/bin/bash
#判断当前用户是否为超级管理员
if [ $USER != "root" -o $UID -ne 0 ];then
    echo "当前用户${USER}对此脚本${0}没有执行权限!"
    exit
fi
#提示用户输入前缀
read -p "请输入你要创建用户的前缀:" Qz
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
    echo "你输入的前缀不符合要求!"
    exit
fi
#提示用户输入后缀,创建用户的数量
read -p "请输入你要创建用的数量:" Num
if [[ ! $Num =~ ^[0-9]+$ ]];then
    echo "你输入的后缀不符合要求!"
    exit
fi
echo "你接下来要创建的用户为: ${Qz}1..${Qz}${Num}"
read -p "你是否确认创建上方这些用户[y|n]:" Confirm
case $Confirm in
    y|Y|Yes|yes)
        echo "你选择了要创建这些用户!"
        a=1
        while [ $a -le $Num ] 
        do
            User=${Qz}${a}
            id $User &>/dev/null
            if [ $? -eq 0 ];then
                echo "用户${User}已经存在!"
            else
                Pass=$(mkpasswd -l 24)
                useradd $User &>/dev/null && echo $Pass |passwd --stdin $User &>/dev/null
                if [ $? -eq 0 ];then
                    echo "用户${User}创建成功!密码设置成功!密码文件存放在pass1.txt文件中!"
                    echo -e "User: $User\tPass: $Pass" >>pass1.txt && chmod 400 pass1.txt
                else
                    echo "用户${User}创建失败!"
                fi
            fi
            let a++
        done
        #设置密码文件权限
        ;;
    n|N|No|no)
        echo "你选择了不进行创建这些用户!"
        exit
        ;;
    *)
        echo "你输入的不符合要求!请输入[y|n]。"
        exit
esac


[root@db01 /service/scripts/day08]# sh while-8.sh
请输入你要创建用户的前缀:qls
请输入你要创建用的数量:5
你接下来要创建的用户为: qls1..qls5
你是否确认创建上方这些用户[y|n]:y
你选择了要创建这些用户!
用户qls1已经存在!
用户qls2创建成功!密码设置成功!密码文件存放在pass1.txt文件中!
用户qls3创建成功!密码设置成功!密码文件存放在pass1.txt文件中!
用户qls4创建成功!密码设置成功!密码文件存放在pass1.txt文件中!
用户qls5创建成功!密码设置成功!密码文件存放在pass1.txt文件中!
[root@db01 /service/scripts/day08]# cat pass1.txt 
User: qls1	Pass: sgmprevswci[2nQmadisdYg4
User: qls2	Pass: blmgecnsz~Uae4pq0cixcMtj
User: qls3	Pass: gq1cg8Ump<tsbektttdblunO
User: qls4	Pass: ebpjlk5wXawCn4t/yynqcfmh
User: qls5	Pass: a2ZhakwxqlikgWe|eoly5pzu

[www@db01 ~]$ sh /service/scripts/day08/while-8.sh 
当前用户www对此脚本/service/scripts/day08/while-8.sh没有执行权限!


posted @   zbzSH  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示