shell脚本案例(三)


 1  检测httpd端口

是否存在 如果不存在就发送邮件并重启服务

#!/bin/bash
#检测httpd80端口服务

email=tffsndbb@163.com
line=`netstat -lntp|grep ':80'|grep 'httpd'|wc -l`
if [ $line -ne 0 ]

then
echo "this is no  problem"

else
echo "httpd端口出现问题,请及时解决" | mail -s "httpd端口问题" $email
/usr/bin/systemctl restart httpd.service

sleep 5

line=`netstat -lntp|grep ':80'|grep 'httpd'|wc -l`
if [ $line -ne 0 ]

then
echo "httpd端口问题已经解决了" | mail -s "httpd端口问题" $email

fi

fi

 2   检测主机磁盘使用率

如果超过90%就发送邮件

#!/bin/bash
email=tffsndbb@163.com

ip=`ifconfig ens32|grep "inet"|awk '{print $2}'|head -n 1`
space=`df -h|grep ""/dev/mapper/centos-root|awk '{print int($5)}'`

#echo "$ip"
#echo "$space"

if [ $space -gt 90 ]

then
        echo "$ip 服务器磁盘空间使用率已经超过90%,请及时处理"| mail -s "$ip使用率" $email

else
        exit 0
fi

 3  获取随机数字或字符串

8位随机数字
8位随机数字

#利用date函数输出纳秒获得随机数
date +%N |cut -c 1-8

echo $RANDOM |cksum |cut -c 1-8

8位随机字符串
8位随机字符串
echo $RANDOM|md5sum|cut -c 3-11
echo $RANDOM|md5sum|cut -c 4-12

8位随机数和字符串
8位随机数和字符串
cat /dev/urandom | head -n 10 | md5sum | head -c 8
cat /proc/sys/kernel/random/uuid|cut -d "-" -f 5|cut -c 1-8
mkpasswd -s 0 -l 8

 4  检测主机存活情况

第一种读取文件ip

#!/bin/bash

ipfile=/root/shell/ip.txt
upfile=/root/shell/up.txt
downfile=/root/shell/down.txt

for i in `cat $ipfile`

do
        ping -c 3 $i &>/dev/null
if [ $? -eq 0 ]
then
        echo "$i is up" >> $upfile

else

        echo "$i is down" >> $downfile
fi

done

 第二种范围ip

#!/bin/bash

ip=192.168.64.

for i in ${ip}{135..140}

do

        ping -c 3 $i &>/dev/null

if [ $? -eq 0 ]
then
        echo "$i is up" 

else

        echo "$i is down"
fi

done

第三种定义函数

#!/bin/bash

tffping(){

ping -c 3 $1 &>/dev/null

        if [ $? -eq 0 ]
        then
                echo "$1 is up" 

        else

                echo "$1 is down"
        fi



}

ip=192.168.64.

for i in ${ip}{135..140}

do

        tffping $i &
done

& 后台运行

$1 第一个参数

 5  批量创建用户

1 固定用户

#!/bin/bash
#创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字,最后需要把每个用户的密码存在指定文件中

for i in `seq 01 10`
do
        useradd user$i
        pwd=`mkpasswd -s 0 -l 10`
        echo "$pwd" | passwd --stdin  user$i
        echo "user$i $pwd" >> /tmp/userpassword
        echo "$i"
done

 mkpasswd 需要安装 百度一下

 2 读取用户文件 创建用户 赋予密码

[root@docker135 shell]# cat user.txt 
lyf
wyf
cxk
wrz
ndy
[root@docker135 shell]# pwd

/usr/local/shell

#!/bin/bash
#创建个用户,并分别设置密码,密码要求8位且包含大小写字母以及数字,最后需要把每个用户的密码存在指定文件中

passwdfile=/tmp/passwdfile/file
chmod 400 $passwdfile
userfile=/usr/local/shell/user.txt

for i in `cat $userfile`

do

id $i &>/dev/null

if [ "$?" == "0" ]
then
        echo "用户已经存在"
        userdel -r "$i" &>/dev/null #如果不想删除用户 就注释一下吧
else
#       echo "用户不存在"
        useradd $i
        passwd=`mkpasswd -s 0 -l 8`
#       echo "$passwd"
        echo $passwd |passwd --stdin $i &>/dev/null
        echo "用户名:$i  密码:$passwd" >> $passwdfile
        echo "$i用户创建成功"
fi

done

3 读取用户和密码文件 

[root@docker135 shell]# cat user_passwd.txt 
lhn lhnqqq
wex wexqqq
wgz wgzqqq
[root@docker135 shell]# 

#!/bin/bash

file=/root/shell/user_passwd.txt

while read line 

do

user=`echo "$line"|awk '{print $1}'`
passwd=`echo "$line"|awk '{print $2}'`
 if [[ `cat $file | wc -l` -eq 0 ]];then
      echo "文件是空的"
   else
      useradd $user
      echo $passwd | passwd --stdin $user &>/dev/null

      if [ $? -eq 0 ];then
          echo "user is create"
      fi
 fi

done<$file

6  检测内存使用率

#!/bin/bash
ip=`ifconfig ens32|grep "inet"|awk '{print $2}'|head -n 1`
email=tffsndbb@163.com
total=$(free -m | sed -n '2p' | awk '{print $2}')
used=$(free -m | sed -n '2p' | awk '{print $3}')
free=$(free -m | sed -n '2p' | awk '{print $4}')
shared=$(free -m | sed -n '2p' | awk '{print $5}')
buff=$(free -m | sed -n '2p' | awk '{print $6}')
cached=$(free -m | sed -n '2p' | awk '{print $7}')

rate=`echo "scale=2;$used/$total" | bc | awk -F. '{print $2}'`
echo -e "total\tused\tfree\tshared\tbuffer\tavailable"
echo -e "${total}M\t${used}M\t${free}M\t${shared}M\t${buff}M\t${cached}M\nrate:${rate}%"

if [ $rate -ge 80 ]

then    echo "$ip 物理内存超过80%,请马上处理"  | mail -s "$ip 物理内存" $email

    ps aux | grep -v USER | sort -rn -k4 | head
fi

scale=2 设小数位,2 代表保留两位:

bc 命令可以很方便的进行浮点运算

 7 mysql分库分表备份

#!/bin/bash
user="root"
passwd="tffnbb"

mysql_cmd="mysql -u$user -p$passwd"
mydump="mysqldump -u$user -p$passwd --lock-tables=0"

for dbname in `$mysql_cmd  -e "show databases;"|grep -Ev "Database|schema"`

do
        #echo "$dbname"
[ -d /opt/$dbname ] || mkdir -p /opt/$dbname

for tabname in `$mysql_cmd -e "show tables from $dbname"|sed 1d`

do
        #echo "$tabname"
        $mydump $dbname $tabname > /opt/$dbname/${tabname}_$(date +%F).sql
done


done

使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作 。

mysql  -hhostname -Pport -uusername -ppassword  -e  相关mysql的sql语句,不用在mysql的提示符下运行mysql,即可以在shell中操作mysql的方法。