• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Shell脚本编程学习——For循环简单脚本案例【显哥出品,必为精品】

Shell编程 lixian 5年前 (2020-04-27) 1840次浏览 2个评论 扫描二维码
文章目录[隐藏]

一、批量创建用户脚本

1.业务需求

1. 必须是root超级管理员才能执行这个脚本

2. 设置24位随机密码,最后将用户和密码信息保存到一个文件中 User: xxx Pass: xxxxx

3. 密码文件权限只有管理员可读,其他人没有任何权限

2.脚本代码

[root@xian /server/scripts]# cat useradd.sh 
#!/bin/bash
# File Name: useradd.sh
# Author: lixian
#######################
#调用函数
[ -f /etc/init.d/functions ] && source /etc/init.d/functions 
#判断用户是否是超级管理员
if [ ! $USER == "root" ] && [ ! $UID -eq 0 ];then
    action "您不是超级管理员,没有权限执行脚本!" /bin/false
    exit
fi
#提示用户输入创建用户的前缀
read -p "请输入你要创建用户的前缀(必须为字母):" Qz
#判断用户输入的前缀是否为字母
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
    action "错误:您输入的内容不符合要求!" /bin/false
    exit
fi
#提示用户输入创建用户的数量
read -p "请输入创建用户的数量:" Num
#判断用户输入的数量是否为数字
if [[ ! $Num =~ [0-9]+$ ]];then
    action "错误:您输入的数字不符合要求" /bin/false
    exit
fi
#提示用户需要创建用户列表
echo "你创建用户为:${Qz}1..${Qz}${Num}"
read -p "你是否要创建这些用户?[yes/no]:" Confirm
#判断用户输入的选择
case $Confirm in
    Yes|yes|Y|y)
        action "收到指令!即将为您创建用户!" /bin/true
        for i in $(seq $Num)
        do
            User=${Qz}${i}
            id $User &>/dev/null
            if [ $? -eq 0 ];then
                action "用户${User}已经存在!" /bin/false
            else
                useradd $User &>/dev/null
                Password=$(echo $((RANDOM))|md5sum |cut -c 1-8)
                echo "$Password" | passwd --stdin $User &>/dev/null
                if [ $? -eq 0 ];then
                    action "${User}用户创建成功!" /bin/true
                    echo "User: $User Pass: $Password" >> user_password.txt
                else
                    action "${User}用户创建失败!" /bin/false
                fi
            fi
        done
        ;;
    No|no|N|n)
        action "收到指令!拒绝创建用户!" /bin/true
        exit
        ;;
    *)
        action "错误:您输入的内容不符合要求!" /bin/false
        exit
esac
chmod 400 user_password.txt &>/dev/null

3.执行结果

Shell脚本编程学习——For循环简单脚本案例【显哥出品,必为精品】

二、批量删除用户脚本

1.脚本代码

[root@xian /server/scripts]# cat userdel.sh 
#!/bin/bash
# File Name: userdel.sh
# Author: lixian
#######################
if [ ! $UID -eq 0 ] && [ ! $USER == "root" ];then
    echo "无权限执行此脚本!"
    exit
fi


read -p "请输入你要删除的用户前缀: " del_qz
if [ -z $del_qz ];then
    echo "输入的内容不正确!"
    exit
fi


read -p "请输入你要删除的用户数量: " user_num
if [[ ! $user_num =~ ^[0-9]+$ ]];then
    echo "请输入整数"
    exit
fi


echo "你删除的用户是 ${del_qz}1 ..${del_qz}${user_num}"
read -p "你确定要删除以上用户吗?[ y/n ] " readly


case $readly in
    y|yes|YES)
        for i in $(seq $user_num)
        do
            user=${del_qz}${i}
            id $user &>/dev/null
            if [ $? -eq 0 ];then
                userdel -r $user
                echo "$user 用户删除成功!"
            else
                echo "$user 用户不存在!"
            fi
        done
        ;;
    n|no|NO)
        echo "你选择了不删除!"
        exit
        ;;
    *)
        echo "输入内容不正确!"
        exit
esac

2.执行结果

[root@xian /server/scripts]# sh userdel.sh 
请输入你要删除的用户前缀: lx
请输入你要删除的用户数量: 5
你删除的用户是 lx1 ..lx5
你确定要删除以上用户吗?[ y/n ] y  
lx1 用户删除成功!
lx2 用户删除成功!
lx3 用户删除成功!
lx4 用户删除成功!
lx5 用户删除成功!
[root@xian /server/scripts]# sh userdel.sh 
请输入你要删除的用户前缀: lx
请输入你要删除的用户数量: 5
你删除的用户是 lx1 ..lx5
你确定要删除以上用户吗?[ y/n ] y
lx1 用户不存在!
lx2 用户不存在!
lx3 用户不存在!
lx4 用户不存在!
lx5 用户不存在!

三、批量探测10.0.0.0/24网段主机

1.业务需求

批量的进行探测10.0.0.0/24网段内的所有主机的存活状态

存活的主机,在进行判断远程连接端口是否开放

1. 使用循环进行批量探测 254 1 ..254

2. 怎么进行探测 ping 通则说明主机存活 不通说明主机不存活

3. 存活的主机再进行探测远程连接端口是否开放

4. 将探测结果进行返回

2.脚本代码

[root@xian /server/scripts]# cat tance.sh 
#!/bin/bash
# File Name: tance.sh
# Author: lixian
#######################
#引用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
>ip.log
>ip_err.log
#批量探测
echo "-------------存活扫描--------------"
action "开始对IP1-254范围进行存活扫描...请稍后..." /bin/true
for i in $(seq 254) 
do
    {
    IP=10.0.0.$i
    ping -c1 -W1 $IP &>/dev/null
    if [ $? -eq 0 ];then
        action "主机-$IP-是存活的!" /bin/true
        echo "主机-$IP-是存活的!" >>ip.log
    else
        echo "主机-$IP-是死的!" >>ip_err.log
    fi
}&
sleep 0.1
done

#端口扫描
>port.log
ip_live=$(cat ip.log |wc -l)
ip_dead=$(cat ip_err.log |wc -l)
action "IP地址扫描完毕,共有${ip_live}台主机存活!${ip_dead}台主机死的!" /bin/true
echo "-------------端口扫描--------------"
action "开始对存活的主机进行端口扫描...请稍后..." /bin/true
for j in $(awk -F- '{print $2}' ip.log)
do 
    {
    Status=$(nmap -p22 $j | awk '/22/{print $2}')
    if [ $Status == "open" ];then
       action "$j 端口是开放的!" /bin/true
       echo "$j 端口是开放的!" >>port.log
   else
       action "$j 端口是关闭的!" /bin/false
    fi
}&
sleep 0.5
done

3.执行结果

Shell脚本编程学习——For循环简单脚本案例【显哥出品,必为精品】

四、随机点名脚本

 
[root@xian /server/scripts]# ls -d stdent.txt  #名单文件
stdent.txt
[root@xian /server/scripts]# cat stdent.sh 
#!/bin/bash
# File Name: stdent.sh
# Author: lixian
#######################
Count=$(cat stdent.txt |wc -l)
read -p "请输入需要循环名单的次数:" Num
#判断输出的次数是否为整数
if [[ ! $Num =~ ^[0-9]+$ ]];then
    echo "你输入的不正确"
    exit
fi
for i in $(seq $Num)
do
    Ran=$(( $RANDOM % $Count + 1 ))
    #循环打印人员名单
    sed -n "${Ran}p" stdent.txt
    sleep 0.5
done
Name=$(sed -n "${Ran}p" stdent.txt)
echo -e "幸运儿:\033[42;37m $Name \033[0m"

五、批量创建不同日期的文件

1.脚本代码

[root@xian /server/scripts/mkdir_date]# cat mkdir_date.sh 
#!/bin/bash
# File Name: mkdir_date.sh
# Author: lixian
#######################
for i in {1..10}
do
    Date=$(date +%F)
    touch ${Date}.txt 
    date -s "+1 day" +%F &>/dev/null
    echo "创建${Date}.txt 成功"
done
ntpdate  ntp.aliyun.com &>/dev/null

2.执行结果

[root@xian /server/scripts/mkdir_date]# sh mkdir_date.sh 
创建2020-04-27.txt 成功
创建2020-04-28.txt 成功
创建2020-04-29.txt 成功
创建2020-04-30.txt 成功
创建2020-05-01.txt 成功
创建2020-05-02.txt 成功
创建2020-05-03.txt 成功
创建2020-05-04.txt 成功
创建2020-05-05.txt 成功
创建2020-05-06.txt 成功
[root@xian /server/scripts/mkdir_date]# ls -l
total 4
-rw-r--r-- 1 root root   0 Apr 27 22:46 2020-04-27.txt
-rw-r--r-- 1 root root   0 Apr 28  2020 2020-04-28.txt
-rw-r--r-- 1 root root   0 Apr 29  2020 2020-04-29.txt
-rw-r--r-- 1 root root   0 Apr 30  2020 2020-04-30.txt
-rw-r--r-- 1 root root   0 May  1  2020 2020-05-01.txt
-rw-r--r-- 1 root root   0 May  2  2020 2020-05-02.txt
-rw-r--r-- 1 root root   0 May  3  2020 2020-05-03.txt
-rw-r--r-- 1 root root   0 May  4  2020 2020-05-04.txt
-rw-r--r-- 1 root root   0 May  5  2020 2020-05-05.txt
-rw-r--r-- 1 root root   0 May  6  2020 2020-05-06.txt

六、数据库的分库分表备份

1.脚本思路

1. 数据库如何备份

mysqldump -uroot -pqls.123 –single-transaction -R -B world >world.sql

2. 如何备份数据库表

mysqldump -uroot -pqls.123 –single-transaction -R wordpress wp_users >wordpress_wp_users.sql

3. 备份到哪里

/data/backup/datebases 每个库的目录

4. 备份周期 定时任务

5. 不能手动的输入数据库名,如何获取到所有的数据库名称 表的名称

mysql -uroot -pqls.123 -e “show databases;” | sed 1d | grep -v ‘.*_schema’

mysql -uroot -pqls.123 -e “use world; show tables;” | sed 1d

2.脚本代码

[root@xian /server/scripts]# cat mysql_backup.sh 
#!/bin/bash
# File Name: mysql_backup.sh
# Author: lixian
#######################
#引用函数
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#定义变量
Date=$(date +%F)
Db_User=root
Db_Pass=123456
#编写循环
for Db_Name in $(mysql -u$Db_User -p$Db_Pass -e "show databases;" | sed 1d |grep -v '.*_schema')
do
    #准备备份目录
    Db_Dir=/data/backup/$Db_Name
    [ -d $Db_Dir ] || mkdir -p $Db_Dir
    #备份数据库
    mysqldump -u${Db_User} -p${Db_Pass} --single-transaction -R -B $Db_Name >$Db_Dir/${Date}_${Db_Name}.sql
    if [ $? -eq 0 ];then
        action "数据库${Db_Name}备份成功!" /bin/true
    else
        action "数据库${Db_Name}备份失败!" /bin/false
    fi
    #备份数据库中的表
    for Table_Name in $(mysql -u$Db_User -p$Db_Pass -e "use $Db_Name;show tables;" | sed 1d)
    do
        #备份表
        mysqldump -u${Db_User} -p${Db_Pass} --single-transaction -R $Db_Name >$Db_Dir/${Dtae}_${Db_Name}_${Table_Name}.sql
        if [ $? -eq 0 ];then
            action "数据库${Db_Name}中的${Table_Name}表备份完成!" /bin/true
        else
            action "数据库${Db_Name}中的${Table_Name}表备份失败!" /bin/false
        fi
    done
done

3.执行结果

Shell脚本编程学习——For循环简单脚本案例【显哥出品,必为精品】


本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Shell脚本编程学习——For循环简单脚本案例【显哥出品,必为精品】
喜欢 (0)

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽
  1. 写得不错
    匿名2020-10-11 00:01