60天shell脚本计划-7/12-渐入佳境

--作者:飞翔的小胖猪

--创建时间:2021年2月26日

--修改时间:2021年3月2日

说明

 每日上传更新一个shell脚本,周期为60天。如有需求的读者可根据自己实际情况选用合适的脚本,也可在评论区留言提出脚本需求,作者会尽快根据需求编写相关脚本对功能进行实现。

 每篇文章包含5个脚本。

总进度:7/12

上一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14415847.html

下一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14495999.html

主要内容

21年2月26日-mariadb忘记密码修改脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

执行脚本进行maraidb数据库root密码重置,用在普通密码忘记的情况下,在自动化环境中可以把脚本中多次确认的语句删除掉就可以实现不用确认的密码重置。

需要重启数据库哟,请谨慎使用,只适用于yum方式安装的mariadb数据库。

文件说明

forget_mysql_password.sh:脚本主体文件

脚本主体

[root@135 31_forget_mysql_password]# cat forget_mysql_password.sh 
#!/bin/bash
#判断是否有配置文件,支持手动输入和默认值
check_file(){
  #定义一个时间用来给备份的配置文件命名.
  file_name=`date +"%Y-%m-%d-%H-%M"`

  echo "判断是否有my.cnf文件"
  read -p "请输入Mysql数据库配置文件路径,默认为/etc/my.cnf: " file_dir
  if [ ! ${file_dir} ];then
    file_dir="/etc/my.cnf"
    echo -e "\033[31m用户未输入,文件路径:  \033[35m${file_dir}\033[0m"
    
  else
    echo -e "\033[32m用户已经输入,文件路径:  \033[35m${file_dir}\033[0m"
  fi

  if [ ! -f ${file_dir} ];then
    echo -e "\033[31m文件${file_dir}不存在,请确认路径是否正确,程序将退出!!!\033[0m"
    exit
  else
    echo -e "\033[32m配置文件${file_dir}路径是正确的。将对文件进行备份。\033[0m"
    cp -rp ${file_dir} ${file_dir}_${file_name}.bak &>/dev/null
    if [ -f ${file_dir}_${file_name}.bak ];then
      echo -e "\033[32m配置文件备份成功。文件名为${file_dir}_${file_name}.bak\033[0m"
    else
      echo -e "\033[31m配置文件备份失败。程序将退出。\033[0m"
    fi
  fi
}


#修改mariadb密码
edit_password_8(){
  echo "修改my.cnf文件在其中添加内容"
   
  edit_file=${file_dir} 

  #由于不确定语句是添加对了地方,起手先把对应的行给加上#
  sed  -i 's/\(skip-grant-tables*\)/#\1/g' ${edit_file}
  
  #skip-grant-tables命令只能加到[mysqld]下,使用sed在[mysqld]下一行添加数据.
  sed -i '/\[mysqld\]/a skip-grant-tables' ${edit_file}

  #重启mariadb软件。
  systemctl restart mariadb &> /dev/null
  if [ $? -eq 0 ];then
    echo -e "\033[32m添加skip-grant-tables行后,软件重启成功。\n进行密码修改。\033[0m"
  else
    echo -e "\033[31m添加skip-grant-tables行后,软件重启失败,程序将退出。\033[0m"
    exit 66
  fi

  #默认重置的密码为
  mysql -uroot mysql -e "update user set password=password("12345678") where user='root';"
  mysql -uroot mysql -e "update user set authentication_string=password("12345678") where user='root';"
    
  #删除skip-grant-tables行内容

  echo -e "root重置密码命令执行完成,现在删除skip-grant-tables行"
  sed -i  '/skip-grant-tables/d' ${edit_file}
  
  echo "开始重置密码后重启数据。"
  systemctl restart mariadb
  if [ $? -eq 0 ];then
    echo -e "\033[32mroot密码重置完成,默认密码为12345678,请手动登录尝试。\033[0m"
  else
    echo -e "\033[31m数据库启动失败,详细信息自己查谢谢。哈哈!!!!\033[0m"
    exit 66
  fi

}

#定义主函数
main(){
  echo -e "\033[36m\n--------运行一键修重置Mariadb root用户密码程序.\033[0m--------\n"
  
  read -p "重置密码需要重启数据库,请再次确认。 yes/y 继续执行,不输入或输入其他字符则退出程序: "  notarize
  a_key=${notarize:-null}
  if [ ${a_key} == "yes" ] || [ ${a_key} == "YES" ] || [ ${a_key} == "y" ]   ;then
    echo -e "\033[31m用户选择继续进行密码重置,程序继续运行。\033[0m"
  else  
    echo -e "\033[31m用户选择不继续进行密码重置,程序退出。\033[0m"
    exit 55
  fi

  check_file
  edit_password_8

  echo -e "\033[36m\n--------程序完成--------\033[0m\n"
}

#调用主函数执行
main

结果

执行结果

 

 文件备份

**************************************************************************************************************2021年2月26日脚本结束*****************************************************************************************************************

 

21年2月27日-安装mysql rpm脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

j通过互联网下载mysql软件,或者手动下载到自定义的路径,执行脚本完成安全。脚本只适用于centos及rhel系列操作系统。

文件说明

auto_install_mysql_rpm.sh:脚本主体文件

脚本主体

[root@135 32_auto_install_mysql_rpm]# cat auto_install_mysql_rpm.sh 
#!/bin/bash
#一键安装mysql数据库通过rpm的方式。该脚本使用的版本为8.0.20
download_rpm(){
  #下载mysql的rpm包。用户也可以自己手动下载放在指定路径
  mkdir /opt/auto_install_mysql/download/rpm/  -p

  for i in 'https://cdn.mysql.com/archives/mysql-8.0/mysql-community-server-8.0.20-1.el8.x86_64.rpm' 'https://cdn.mysql.com/archives/mysql-8.0/mysql-community-client-8.0.20-1.el8.x86_64.rpm' 'https://cdn.mysql.com/archives/mysql-8.0/mysql-community-devel-8.0.20-1.el8.x86_64.rpm' 'https://cdn.mysql.com/archives/mysql-8.0/mysql-community-common-8.0.20-1.el8.x86_64.rpm' 'https://cdn.mysql.com/archives/mysql-8.0/mysql-community-libs-8.0.20-1.el8.x86_64.rpm'
  do
    echo "字符串位:$i"
    soft_name=`echo "${i}" |awk -F'/' '{printf $NF}'`
    if [ -f /opt/auto_install_mysql/download/rpm/${soft_name} ];then
      echo  -e "\033[31m${soft_name}文件已经存在不用下载。\033[0m"
      continue
    else
      echo -e "\033[32m开始下载软件:${soft_name}\033[0m"
      wget ${i} -P /opt/auto_install_mysql/download/rpm/  
    fi  
    echo "开始下一次."
  done
}


install_mysql(){
  #判断是否有mysql如果有则退出不安装。
  echo -e  "\033[32m安装mysql软件\033[0m"
  #安装mysql软件,用户自己输入路径如果没输入路径则默认使用/opt/auto_install_mysql/download/rpm/路径。

  #判断是否有mariadb,如有提示用户将要删除mairadb所有的内容。写一个确认选项。
 
  dir_name=${dir_file:-/opt/auto_install_mysql/download/rpm/}
  echo -e "路径为:\033[31m${dir_name}\033[0m"  
  echo -e "\033[35m检测系统中是否存在该软件路径目录。\033[0m" 
  if [ -d $dir_name ];then
    echo -e "\033[32m接收到的路径存在于系统中,正常。\033[0m"
  else
    echo -e  "\033[31m目录不存在,请确认。程序退出!!\033[0m"
    exit 77
  fi
    
  #检测目录下是否存在对应的文件,少一个都不行。
  if ls -l ${dir_name} | grep -i 'mysql-community-client' &>/dev/null;then
    client_e=0
    echo -e "\033[36mclient文件存在可用。\033[0m"
  else
    client_e=1
    echo -e "\033[31mclient文件不存在。\033[0m"
  fi

  if ls -l ${dir_name} | grep -i 'mysql-community-common' &>/dev/null;then
    common_e=0
    echo -e "\033[36mcommon文件存在可用。\033[0m"
  else
    common_e=1
    echo -e "\033[31mcommon文件不存在。\033[0m"
  fi
  
  if ls -l ${dir_name} | grep -i 'mysql-community-devel'  &>/dev/null;then
    devel_e=0
    echo -e "\033[36mdevel文件存在可用。\033[0m"
  else
    devel_e=1
    echo -e "\033[31mdevel文件不存在。\033[0m"
  fi
  
  if ls -l ${dir_name} | grep -i 'mysql-community-libs'  &>/dev/null;then
    libs_e=0
    echo -e "\033[36mlibs文件存在可用。\033[0m"
  else  
    libs_e=1
    echo -e "\033[31mlibs文件不存在。\033[0m"
  fi

  if ls -l ${dir_name} | grep -i 'mysql-community-server' &>/dev/null;then
    server_e=0
    echo -e "\033[36mserver文件存在可用。\033[0m"
  else
    server_e=1
    echo -e "\033[31mserver文件不存在。\033[0m"
  fi

  if [ ${client_e} -eq 1 ] || [ ${common_e} -eq 1 ] || [ ${devel_e} -eq 1 ]  || [ ${libs_e} -eq 1 ] || [ ${server_e} -eq 1 ];then
    echo -e "\033[31m文件不完整,请检查后再执行,程序退出。\033[0m"
    exit 55
  fi

  #卸载mariadb相关的软件
  echo -e "\033[35m卸载系统中已存在的mariadb相关软件.\033[0m"
  yum remove mariadb* -y  &>/dev/null
  
  rm -rf /var/lib/mysql  &>/dev/null

  echo -e "\033[32m处理mariadb相关软件完成.\033[0m"
  echo -e "\033[35m进行软件安装..............\033[0m"

  yum localinstall ${dir_name}/mysql-community-common* -y  &>/dev/null
  yum localinstall ${dir_name}/mysql-community-libs* -y    &>/dev/null
  yum localinstall ${dir_name}/mysql-community-devel* -y   &>/dev/null
  yum localinstall ${dir_name}/mysql-community-client* -y  &>/dev/null
  yum localinstall ${dir_name}/mysql-community-server* -y  &>/dev/null
  echo -e "\033[32m软件安装完成..............\033[0m"
}


#初始化mysql
init_mysql(){
  #开机启动数据库
  systemctl enable mysqld &> /dev/null

  #启动数据库
  systemctl restart mysqld &> /dev/null

  #获取密码
  mysql_passwd=`awk  -F':' '/password is generated/{print $NF}'  /var/log/mysqld.log  |sed 's/\ //g'|tail -1`
  
  echo -e "\033[33m默认的密码为:\033[31m${mysql_passwd}\033[0m"
  echo -e "\033[32m安装完成。\033[0m"
}

main(){
  echo -e "\033[31m"
  read -p "选择是否需要下载软软件,输入YES/yes/y下载软件,默认不下载:" notarize
  echo -e "\033[0m"
  a_key=${notarize:-null}
  if [ ${a_key} == "yes" ] || [ ${a_key} == "YES" ] || [ ${a_key} == "y" ]   ;then
    echo -e "\033[31m进行软件下载。\033[0m"
    download_rpm
  fi  
  
  echo -ne "\033[33m"
  read  -p "不进行软件下载直接安装,请输入软件所在路径,默认在 /opt/auto_install_mysql/download/rpm/路径下: " dir_file
  echo -e "\033[0m"
  install_mysql
  init_mysql
}

main

结果

**************************************************************************************************************2021年2月27日脚本结束*****************************************************************************************************************

 

21年2月28日-显示时间脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

脚本主要展示使用tput命令定义输出格式,tput详细用法见:https://www.cnblogs.com/Pigs-Will-Fly/p/14459964.html。

文件说明

Dynamic_clock.sh:脚本主体文件

脚本主体

[root@135 33_Dynamic_clock]# cat Dynamic_clock.sh 
#!/bin/bash
tput civis
while [ 1 ]
do
   tput clear
   tput cup 3 10
   tput setb 0
   tput setf 2
   echo -e "\e[1;31m$(date "+%Y-%m-%d %H:%M:%S  %A")\e[0m"
   sleep 1
done

结果

 

**************************************************************************************************************2021年2月28日脚本结束*****************************************************************************************************************

 

21年3月1日-国际象棋棋盘打印脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

打印国际象棋方块,这个脚本是抄袭的嘻嘻。

文件说明

print_checkerboard.sh:脚本主体文件

脚本主体

[root@135 34_print_checkerboard]# cat print_checkerboard.sh 
#!/bin/bash
for i in {1..8}
do
  for j in {1..8}
  do
    sum=$[i+j]
    if [  $[sum%2] -eq 0 ];then
      echo -ne "\033[46m  \033[0m"
    else
      echo -ne "\033[47m  \033[0m"
    fi
  done
  echo
done

结果

 

**************************************************************************************************************2021年3月1日脚本结束*****************************************************************************************************************

 

21年3月2日-双色球模拟脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

模拟双色球生成号码,判断是否中奖,可以手动输入也自选数字。

自选功能还待完善,等几天加上来。顺便提一句还是安心上班吧,买彩票的机会太小。

文件说明

Lottery_generator.sh:脚本主体文件

脚本主体

[root@135 35_Lottery_generator]# cat Lottery_generator.sh
#!/bin/bash
#生成6个红色地址,1个蓝色地址。
function genNumbers() {
    #定义球池:红球为1-33、蓝球为1-16
    redballs=({1..33})
    blueballs=({1..16})

    #循环生成,6个红色号码,每生成一个不为空的数字,则从红球池数组中取消对应的下标值。
    while :
    do
        #循环判断剩余数组的个数如果等于27,表示已经生成了6个红球可以退出了。
        [ ${#redballs[@]} -eq 27 ] && break
        #使用$RANDOM函数生成一个随机数取余,得到0-32的数字。
        rindex=$[ $RANDOM%33 ]
        #因为生成的随机数可能重复,那么通过该值下标取到的数就是空值。 如果判断通过下标取到的值不为空那么输出该数字,同时取消掉对应下标的值。
        [ -n "${redballs[${rindex}]}" ] && echo -ne "\e[31m${redballs[${rindex}]}\e[0m  " && unset redballs[${rindex}]
    done
    #当6个红色号码生成过后,生成一个0-15的数。
    bindex=$[ $RANDOM%16 ]
    #通过获取到0-15的下标,带入到蓝色球池中获取数值。
    echo -e "\e[34m${blueballs[$bindex]}\e[0m"
}


#自定义彩票号码
function Custom_number(){
    n=0
    while :
    do
        #判断数组个数是否为6个,如果满足6个则退出。
        [ ${#readnum[@]} -eq 6 ]  && break
        echo -e "\e[31m"
        read -p "输入第 $[n+1] 个数: " readnum[$n]
        
        if [ ${readnum[$n]} -lt 0 ] || [ ${readnum[$n]} -gt 33 ];then
            continue 
        fi
        
        #设置下标加1
        let n=$[$n+1]
    done
    echo -e "\e[31m红色球选择完成。\e[0m"
    echo -e "\e[34m"
    
    #填入蓝色球
    while :
    do
        read -p "请输入你想要填入的蓝色球:" read_blue_i
        read_blue=${read_blue_i:-18}
        [ ${read_blue} -lt 17 ] && [ ${read_blue} -gt 0 ] && break
    done
    echo -e "\e[0m"   
      
    echo -e "\e[33m选择的球为:\e[31m ${readnum[*]} \e[34m ${read_blue}\e[0m"
}


#对比生成的数字
diff_num(){
    customers=($(genNumbers))
    backGround=($(genNumbers))
    echo "你的号码:${customers[*]}"
    if [[ ${customers[6]} == ${backGround[6]} ]];
    then
        i=0
        flag=0

        while [ $i -le 5 ]
        do
            j=0
            while [ $j -le 5 ]
            do
                c=${customers[${i}]}
                b=${backGround[${j}]}
                [[ "$c" == "$b" ]] && let flag++
                let j++
            done
            let i++
        done
    [ $flag -le 2 ] && echo "恭喜你!你中了六等奖,奖金 5元  !"
    [ $flag -eq 3 ] && echo "恭喜你!你中了五等奖,奖金 10元  !"
    [ $flag -eq 4 ] && echo "恭喜你!你中了四等奖,奖金 200元  !"
    [ $flag -eq 5 ] && echo "恭喜你!你中了三等奖,奖金 3000元  !"
    [ $flag -eq 6 ] && echo "恭喜你!!!!!!!!!!你中了一等奖,奖金 500万元  !"
    else
        i=0
        flag=0
        while [ $i -le 5 ]
        do
            j=0
            while [ $j -le 5 ]
            do
                c=${customers[${i}]}
                b=${backGround[${j}]}
                [[ "$c" == "$b" ]] && let flag++
                let j++
            done
            let i++
        done

        [ $flag -le 3 ] && echo "很遗憾!你没有中奖!!"
        [ $flag -eq 4 ] && echo "恭喜你!你中了五等奖,奖金 10元  !"
        [ $flag -eq 5 ] && echo "恭喜你!你中了四等奖,奖金 200元  !"
        [ $flag -eq 6 ] && echo "恭喜你!你中了二等奖,奖金 300万元  !"
    fi
    echo "开奖结果:${backGround[*]}"
}

diff_num

结果

**************************************************************************************************************2021年3月2日脚本结束*****************************************************************************************************************

posted @ 2021-02-26 09:40  飞翔的小胖猪  阅读(108)  评论(0编辑  收藏  举报