shell 脚本练习

1、实现 1到100 相加

seq -s + 1 100 | bc
awk 'BEGIN{ total=0; for(i=0; i<=100; i++){total+=i;} print total;}'
seq 100 | awk 'BEGIN{total=0}{total+=$1}END{print total}'

2、将多个二进制日志(binlog)文件输出到指定文件中

# 将/tmp目录下var.001334 var.001335 var.001336二进制日志文件输出到sql文件中。

#!/bin/bash

MYSQLBINLOG_CMD=/usr/local/mysql/bin/mysqlbinlog
BINLOG_FILE=`ls /tmp/var.*`
for i in ${BINLOG_FILE};do
    echo $i
    ${MYSQLBINLOG_CMD} $i >> all.sql
done

3、在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下。

1.备份什么?
源 /etc

2.备份到哪?
目标 /root/bak

3.使用什么方式? 
压缩 tar

4.备份的周期?
每月第一天,如何每月第一天。crond

[root@oldboyedu ~]# cat fileback
#!/usr/bin/bash
DestPath=/root/bak
Date=$(date +%Y_%m_%d)

#1.准备目标位置
[ ! -d $DestPath ] && mkdir -p $DestPath

#2.备份到目标位置
tar czf $DestPath/${Date}_etc.tar.gz /etc

[root@oldboyedu ~]# crontab -l
00 23 1 * * bash /root/fileback &>/dev/null

4、场景实践,查看内存/当前使用状态,如果使用率超过80%则报警发邮件。

    1)如何查看内存       free -m

    2)如何查看内存百分比       使用的/总的*100=使用百分比    free -m|awk '/^Mem/ {print $3/$2*100}'

# cat free_use.sh 
#!/usr/bin/bash
# 监控内存使用百分比,超过百分之80则报警

free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')

if [ ${free_use%.*} -gt 80 ];then
    echo "你的内存超过了百分之80,当前是${free_use}%"
else
    echo "你的内存正常使用,当前是${free_use}%"
fi

 5、场景实践,在/backup下创建10个.txt的文件,找到/backup目录下所有后缀为.txt的文件

1)批量修改txt为txt.bak [find]
2)把所有的.bak文件打包压缩为123.tar.gz [tar]
3)批量还原文件的名字,及把增加的.bak再删除 [find]

方法一:
# cat rename.sh 
#!/usr/bin/bash
#1.改名
find /backup -iname "*.txt"|sed -r 's#(.*)#mv \1 \1.bak#g'|bash
#2.打包
tar czf /backup/123.tar.gz $(find /backup -iname "*.bak")
#3.还原
find /backup -iname "*.bak"|sed -r 's#(.*).bak#mv \1.bak \1#g'|bash

方法二:
# cat rename.sh
#!/usr/bin/bash
#定义变量
T=txt
B=bak
#1.把backup目录下.txt结尾的文件修改成txt.bak
cd /backup && rename $T $T\.$B *.txt
#2.把所有的.bak结尾的文件打包压缩为123.tar.gz
tar czf /backup/123.tar.gz /backup/*.bak
#3.还原文件的名字
rename $T\.$B $T *

方法三:
# cat rename.sh
#!/usr/bin/bash
File_txt=$(find /backup/ -type f -iname "*.txt" | xargs >/backup/txt.tt)
for i in $(cat /backup/txt.tt)
do
    mv $i $i.bak
done
cd /backup/
tar czf /backup/123.tar.gz ./*.bak
File_bak=$(find /backup/ -type f -iname "*.bak" >/backup/tar.tt)
for j in $(cat /backup/tar.tt)
do
    mv $j ${j%.*}
done

 6、需求描述:变更string="Begdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:

    1)打印string长度;
    2)删除字符串中所有的Hadoop;
    3)替换第一个Hadoop为Linux;
    4)替换全部Hadoop为Linux;
用户请输入数字1|2|3|4|,可以执行对应用项的功能,输入q|Q则退出交互模式。

 

# cat variable.sh 
#!/usr/bin/bash
string="Bigdata process is Hadoop, Hadoop is open source project",
echo $string

cat << EOF
1)、打印string长度
2)、删除字符串中所有的Hadoop
3)、替换第一个Hadoop为Linux
4)、替换全部Hadoop为Linux
EOF

read -p "请输入数字1|2|3|4,或q|Q: " var

if [ $var -eq 1 ];then
    echo 当前string变量的长度是:${#string}
fi

if [ $var -eq 2 ];then
    echo ${string//Hadoop/}
fi

if [ $var -eq 3 ];then
    echo ${string/Hadoop/Linux}
fi

if [ $var -eq 4 ];then
    echo ${string//Hadoop/Linux}
fi

7、检测tomcat服务状态码,返回状态码为:200,显示tomcat服务正在运行,返回其它状态码,重启tomcat服务。

# cat tomcat.sh 
#!/usr/bin/bash
Tomcat_Home=/data/tomcat9/
Tomcat_Bin="/data/tomcat9/bin/catalina.sh start"
Status_Code=`/usr/bin/curl -s -o /dev/null  -w  %{http_code} -I --connect-timeout 6  http://192.168.56.101:8080/`
Tomcat_Pid=`ps -ef|grep java | grep -v grep |awk '{print $2}'`

function start_tomcat() {
    $Tomcat_Bin
}

function stop_tomcat() {
    kill -9 ${Tomcat_Pid}
}

if [ ${Status_Code} -eq 200 ];then
    echo "tomcat is running"
else
    stop_tomcat
    start_tomcat
fi

8、zabbix自定义key值,获取网站URL状态,返回0表示网站状态正常;返回1表示网站异常;

web_status_monit.sh
--------------------------
#!/usr/bin/bash
Status_Code=`curl -s -o /dev/null -w %{http_code} -I --connect-timeout 6 http://www.silubuy.cn/`
if [ ${Status_Code} -eq 200 -o ${Status_Code} -eq 302 ];then
    echo 0
else
    echo 1
fi

9、应用及配置文件定时备份,并将备份文件保存至远端服务器,删除本地7天前的备份文件;

# cat backup.sh 

#!/bin/bash
# Author: miclesvic
# mail: liuguohui@silupay.com
# data: 2016-11-24

IP=$(/sbin/ifconfig bond0|awk -F "[ :]+" 'NR==2 {print $4}')
Path=/data/backup
Time=$(date +%F -d "-1day")

if [ ! -d ${Path}/${IP} ];then
    mkdir ${Path}/${IP}/ -p
fi

# project backup
cd /home &&\
tar jcfh ${Path}/${IP}/backup_app_${Time}.tar.bz2 acompany-slt company spaytone &&\
md5sum ${Path}/${IP}/backup_app_${Time}.tar.bz2 > ${Path}/${IP}/flag_app_${Time}.log &&\

# configuration backup
cd / &&\
tar jcfh ${Path}/${IP}/backup_conf_${Time}.tar.bz2 etc/sysconfig/iptables etc/rc.local var/spool/cron/root etc/hosts root/scripts &&\
md5sum ${Path}/${IP}/backup_conf_${Time}.tar.bz2 > ${Path}/${IP}/flag_conf_${Time}.log &&\

# sync to backup server
rsync -avz ${Path}/ rsync_backup@10.12.1.202::backup/ --password-file=/etc/rsync.password

find /data/backup/ -type f -mtime +7 | xargs rm -f

10、DNS拔测Shell脚本

版本一:

#!/bin/bash
###############DNS拨测脚本      V1      20190823
###############By PlatoWG
##备份原resolv.conf文件
/bin/cp /etc/resolv.conf /etc/resolv.conf.back
##脚本主体
success=0
fail=0
read -p "请输入拨测次数:" num
echo "nameserver 202.106.0.20" > /etc/resolv.conf
for i in `seq 1 $num`  
  do        
    NO=`curl -I  http://img.chinau.com.cn/|grep -w HTTP|grep -w HTTP|awk '{print $2}'` &> /dev/null        
    clear;echo "第${i}次拨测,HTTP返回状态$NO"        
    if [ $NO -eq 200 ];then                
        let success+=1 ;
    else                
        let fail+=1        
    fi        
    sleep 0.1  
  done
clear;echo "拨测完成,拨测结果如下:"
echo 共拨测${num}次
echo 拨测成功${success}次
echo 拨测失败${fail}次
rm -rf /etc/resolv.conf
mv /etc/resolv.conf.back /etc/resolv.conf

版本二:增加回显拨测起止时间;增加自定义拨测DNSIP,拨测域名,拨测次数;增加回显拨测信息确认

#!/bin/bash
###############DNS拨测脚本      V2      20190823
###############By PlatoWG
##备份原resolv.conf文件
/bin/cp /etc/resolv.conf /etc/resolv.conf.back
##脚本主体
success=0
fail=0
read -p "请输入DNSIP:" dns
read -p "请输入拨测次数:" num
read -p "请输入拨测域名:" domain
echo "nameserver $dns" > /etc/resolv.conf
 
echo -e "请确认拨测信息:DNSIP:$dns \n拨测次数:$num \n拨测域名:$domain"
read -p "请输入y/n确认信息" confirm
if [ $confirm != "y" ];then
        exit 0
fi
 
begin_time=`date "+%F %T"`
 
for i in `seq 1 $num`
  do
        NO=`curl -I  $domain|grep -w HTTP|grep -w HTTP|awk '{print $2}'` &> /dev/null
        clear;echo "第${i}次拨测,HTTP返回状态$NO"
        if [ $NO -eq 200 ];then
                let success+=1 ;else
                let fail+=1
        fi
        sleep 0.1
  done
 
end_time=`date "+%F %T"`
 
clear;echo "拨测完成,拨测结果如下:"
echo "拨测时间:$begin_time--$end_time"
echo 共拨测${num}次
echo 拨测成功${success}次
echo 拨测失败${fail}次
rm -rf /etc/resolv.conf
mv /etc/resolv.conf.back /etc/resolv.conf

版本三:增加并发拨测功能,且支持自定义并发次数;增加日志记录,位置./log/(拨测时间).log

#!/bin/bash  
clear
###############DNS拨测脚本      V3      20190823
###############By PlatoWG  
##备份原resolv.conf文件  
/bin/cp /etc/resolv.conf /etc/resolv.conf.back
##脚本主体
if [ ! -e ./log ];then
        mkdir log
fi
touch ./log/`date +%F-%T`.log
logdir=./log/`date +%F-%T`.log
success=0
fail=0
read -p "请输入DNSIP:" dns
read -p "请输入拨测次数:" num
read -p "请输入拨测域名:" domain
read -p "请输入并发量:" concurrent
echo "nameserver $dns" > /etc/resolv.conf
 
echo -e "请确认拨测信息:DNSIP:$dns \n拨测次数:$num \n拨测域名:$domain"  
read -p "请输入y/n确认信息" confirm
if [ $confirm != "y" ];then
        exit 0
fi
 
####
trap "exec 1000>&-;exec 1000<&-;exit 0" 2
mkfifo tempfifo
exec 1000<>tempfifo
rm -rf tempfifo
 
for i in `seq 1 $concurrent`
do
        echo >&1000
done
####
 
begin_time=`date "+%F %T"`
 
for i in `seq 1 $num`
  do
        read -u1000
    {
        curl -si  $domain >> $logdir
        echo -n "#"
        echo >&1000
    } &
  done
 
wait
exec 1000>&-;exec 1000<&-
 
end_time=`date "+%F %T"`
 
####  
success=`sed -n '/HTTP\/1\.1 200 OK/p' $logdir |cut -d" " -f 2|wc -l`
fail=`expr $[num-success]`
####
 
clear;echo "拨测完成,拨测结果如下:"  
echo "拨测时间:$begin_time--$end_time"  
sed -i -e "1i拨测时间:$begin_time--$end_time\n"  $logdir
echo 共拨测成功${num}次  
echo 拨测成功${success}次  
echo 拨测失败${fail}次  
rm -rf /etc/resolv.conf
mv /etc/resolv.conf.back /etc/resolv.conf

11、expect实现免密钥连接远程主机

# cat ssh_172.31.196.85.sh
#!/usr/bin/expect

set timeout 30
spawn /usr/bin/ssh root@172.31.196.85
expect  {
    "(yes/no)" {send "yes\r"; exp_continue}
    "password:" {send "******\r"}
        }
interact

12、批量检测内网服务端口状态shell脚本

# cat monitor_port.sh ip.txt 
#!/bin/bash
# 从ip.txt文件中读取检测的ip地址及端口
CMD_NC=/usr/bin/nc
IP_PORT_LIST=/root/shell/ip.txt
while read line
do
# 循环nc检测端口状态命令3次
  fail_count=0
  for count in {1..3}
  do
    ${CMD_NC} -w 1 -z `echo $line|awk '{print $1,$2}'` > /dev/null 2>&1
# 判断nc命令是否执行成功
    if [ $? -eq 0 ];then
      echo $line ok
      break
    else
      #echo "$(date +%F-%H:%M:%S) $line Port down"
# 记录失败次数
      let fail_count++
      sleep 1
    fi
  done
# 判断失败次数是否为3    
  if [ $fail_count -eq 3 ];then
    echo "$(date +%F-%H:%M:%S) $line Port down"
  fi
done < /root/shell/ip.txt

192.168.51.102 46345 ssh
192.168.51.102 46346 ssh
192.168.51.102 80 httpd

13、shell ping 网络主机3次判断是否不通

1.问题
循环3次 ping 网络主机,判断是否不通

2.思路
通过循环 ping -c1 -W1 ip 命令来操作

3.具体脚本代码
首先将要处理的ip 地址存储在文件中,如下

[website@192 exercise]$ cat iplist
192.168.56.1
192.168.56.4
192.168.56.10
192.168.56.9

脚本解析

#!/bin/bash
#the script lib functions
#从iplist文件中读取ip 地址
while read ip
do
#循环ping 3次
    fail_count=0
    for count in {1..3}
    do
        ping -c1 -W1 $ip &>/dev/null
#判断ping 命令是否执行成功
        if [ $? -eq 0 ];then
#echo -e "\e[1;32m" 输出字体颜色为绿色,\e[0m 恢复默认字体 颜色
            echo -e "\e[1;32m ping $ip is ok \e[0m"
            break
        else
            echo -e "ping $ip is failed!:$fail_count"
#记录失败次数
           let fail_count++
        fi
    done
#判断失败次数是否为3次
    if [ $fail_count -eq 3 ];then
        echo -e "\e[1;31m ping $ip is failed! \e[0m"
    fi
done < iplist

  

  

 

 

 

 

 

 

 

 

 

 

posted @ 2019-03-14 10:14  miclesvic  阅读(233)  评论(0)    收藏  举报