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

浙公网安备 33010602011771号