测试机器存活的脚本, 交互式备份压缩脚本, mysqldump每天双备份压缩删除脚本, python使用163发邮件,监控web日志502, rsync代码上线

测试机器存活的脚本

#! /bin/bash
while :;
do
   lose=`ping -c4 192.168.87.149 |tail -2| head -1|awk -F 'transmitted, | received' '{print $2}'`  #ping 4次,看接收包的数量,是否少于等于2个,丢失了2个或以上报警;
   if [ $lose -le 2 ]
        then
           echo "computer ID 149" | mail -s "computer may down" ***@163.com    #mail命令另外配置;
   fi
sleep 30
done

交互式备份压缩脚本

#! /bin/bash
#test input #检查输入的目录是否存在,是否目录;
while :
        do
           read -p "please input a directory (absolutePath):" n
           if [ ! -d "$n" ];
                then
                   continue;
           fi
           break
        done
echo "back up in $n"
cd $n
#input the backup file last name    #输入要备份文件的后缀名,没有后缀名就很难区分文件;
read -p "please input the backup file last name ex:"txt":" m
#create the list    #创建文件名字列表;
find "$n" -name "*.$m" > name.log
#check zero or not   #检查是否有文件要备份;
#if [ -s name.log ]    #写的时候不知道有-s可以使用;
ko=`ls -l name.log| awk '{print $5}'`
if [ $ko -eq 0 ]
        then
           echo "no file to backup"
           exit
        else
           echo "files to backup"
fi
echo "backup file name is:"
cat name.log
dir=$m_`date +%Y%m%d%H%M%S`   #使用日期作为备份目录名;
echo "create backup dir $dir"
mkdir ./"$dir"
for i in `cat name.log`;
        do
           cp "$i" "$dir";					#把文件逐个复制到目录里;便用复制比移动好,有问题全部删掉就可以;
        done
tar -zcf "$dir".tar.gz $dir			#压缩目录;
rm -rf "$dir"								#删除目录;
echo "backup file is "$dir".tar.gz in $n"     #最终信息;

mysqldump每天双备份压缩删除脚本

  • 变量会跟_符号连结在一起,因为_可以用于定义变量,斜杠/,:,.是不怕的;
  • 每天备份数据库
  • 每天把备份文件同度到rsync服务端
  • 每天把前天的文件压缩
  • 每天把七天前的文件删除
#! /bin/bash
#define db name      #数据库名定义;
db1=mysql
db2=zabbix
#db3=
#define variables, command, farend ip, last name , active dir;   #定义一些变量
dump=/usr/local/mysql/bin/mysqldump
user=dumper
pw=password
tip=192.168.87.149
la=`date +%Y-%m-%d`    #使用日期区分备份文件;
dir=/data/backup

#local backup    #主要备份语句,库的个数多可以放在for循环里;
$dump -u$user -p$pw $db1 > $dir/"$db1"_$la.sql
$dump -u$user -p$pw $db2 > $dir/"$db2"_$la.sql
#$dump -u$user -p$pw $db3 > $dir/"$db3"_$la.sql

#far end backup, module file     #同步到远端;
rsync -av $dir/ $tip::file/
#compress
zdate=`date -d "-2day" +%Y-%m-%d`    #使用时间区分要压缩的文件;
gzip /data/backup/*$zdate.sql     #gzip可以将每个文件单独压缩;
#del
ddate=`date -d "-7day" +%Y-%m-%d`    #使用时间区分要删除的文件;
if [ ! -d "/data/backup/del" ]
        then 
	   mkdir /data/backup/del
fi	
mv $dir/*$ddate* $dir/del/      #先移动到目录,后删除,更安全;
rm -rf $dir/del/*
更新上面脚本的上半部分
#! /bin/bash
#daily backup part
dump=/usr/local/mysql/bin/mysqldump
user=dumper
pw=password
tip=192.168.87.149
la=`date +%Y-%m-%d`
sdate=`date +%d`
dir=/data/backup

#local backup
for db in mysql zabbix;      #使用了for 语句,确实简单很多;
   do
        $dump -u$user -p$pw $db > $dir/"$db"_$la.sql
        sleep 2
        rsync -av $dir/"$db"_$la.sql $tip::file/"$db"_$sdate.sql   #rsync同步同时修改名字可以让远端保留30天的文件;
   done

python使用163发邮件

 #!/usr/bin/python
#coding:utf-8
import smtplib    
from email.mime.text import MIMEText 
import sys
mail_host = 'smtp.163.com'     #发件服务器;
mail_user = 'test@163.com' 		#发件邮箱;
mail_pass = 'your_mail_password'    #登陆密码;
mail_postfix = '163.com'     
def send_mail(to_list,subject,content):      #函数?;
me = "zabbix 监控告警平台"+"<"+mail_user+"@"+mail_postfix+">"    #显示的发件人信息,可以修改;
msg = MIMEText(content, 'plain', 'utf-8')     #内容与格式;
msg['Subject'] = subject    #赋值;
msg['From'] = me   #赋值;
msg['to'] = to_list   #赋值;
try:
s = smtplib.SMTP() 
s.connect(mail_host)        #发信程序?使用服务器;
s.login(mail_user,mail_pass)     #使用用户名和密码;
s.sendmail(me,to_list,msg.as_string())     #我,发给谁,内容;
s.close()
return True 
except Exception,e:
print str(e)
return False
if __name__ == "__main__":
send_mail(sys.argv[1], sys.argv[2], sys.argv[3])     #主程序,获取参数给函数;

说明:该脚本会调用第三方的邮箱账户,需要你填写正确的mail_host, mail_user以及 mail_pass。假如脚本名字为mail.py,则发邮件的命令为:

python mail.py aming@aminglinux.com "邮件主题" "邮件内容"

监控web日志502

#!/bin/bash
 t=`date -d "-1 min" +"%Y:%H:%M:[0-5][0-9]"` log="/data/logs/access.log" #假设mail.py已经写好,并放在/usr/local/sbin/下 mail_script="/usr/local/sbin/mail.py" mail_user=aming@aminglinux.com
#结合任务计划每分钟实施一次;
#工作量会不会很大?把60个搜索目标搜索出来;
#要在日志切割的前提下,要不然会搜索到其他日子的行;
n=`grep $t $log|grep -c " 502 "`
if [ $n -gt 50 ]
then
python $mail_script $mail_user "网站有502" "1分钟内出现了$n次" 
fi

rsync代码上线

  • rsync命令在没有配置服务模块,启动服务进程时,是使用22端口通信的;
  • 所以如果发起端对远端做过密角认证的话,那使用rsync命令是不需要输入密码的
  • 另外试用一下使用目录列表的方式同步两台机器的相同目录
上传端:
[root@second ~]# ls -ld  /root/synt /tmp/syna /usr/local/synn /data/syny
drwxr-xr-x 2 root root 6 11月 22 12:36 /data/syny
-rw-r--r-- 1 root root 0 11月 22 12:34 /root/synt
drwxr-xr-x 2 root root 6 11月 22 12:35 /tmp/syna
-rw-r--r-- 1 root root 0 11月 22 12:36 /usr/local/synn
[root@second ~]# vi ./syn.txt   #文件内容如下;
/root/synt
/tmp/syna
/usr/local/synn
/data/syny

远端:
[root@draft rsync]# ls -ld  /root/synt /tmp/syna /usr/local/synn /data/syny
ls: 无法访问/root/synt: 没有那个文件或目录
ls: 无法访问/tmp/syna: 没有那个文件或目录
ls: 无法访问/usr/local/synn: 没有那个文件或目录
ls: 无法访问/data/syny: 没有那个文件或目录

上传端:
[root@second ~]# rsync -av --files-from=./syn.txt / root@192.168.87.149:/   #做了密钥认证后,不需要输入密码;

远端:
[root@draft rsync]# ls -ld  /root/synt /tmp/syna /usr/local/synn /data/syny
drwxr-xr-x 2 root root 6 11月 22 12:36 /data/syny
-rw-r--r-- 1 root root 0 11月 22 12:34 /root/synt
drwxr-xr-x 2 root root 6 11月 22 12:35 /tmp/syna
-rw-r--r-- 1 root root 0 11月 22 12:36 /usr/local/synn

试用expect ssh

#!/usr/bin/expect

set login_name  "root"
set login_host  "192.168.87.149"
set password    "******"

spawn ssh $login_name@$login_host
expect {     #检查到远端需要什么,就给什么;
        "(yes/no)" { send "yes\r"; exp_continue }
        "password:" { send "$password\r" }
}
#expect $login_name@*   {send "ls\r" }  ;
interact      #保持交互;

[root@second yum.repos.d]# yum install -y expect
[root@second ~]# expect ssh.expect 
spawn ssh root@192.168.87.149
root@192.168.87.149's password: 
Last login: Fri Nov 22 13:40:29 2019 from 192.168.87.150

expect & rsync

 #!/usr/bin/expect
set passwd "SGs2ox6uj"
set host "192.168.1.180"
spawn rsync -a user01@$host:/tmp/test.txt /tmp/ expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"} }
expect eof   #expect -timeout -1 eof   使用这个语句防止,还没传完文件中断;

expect 传递参数

 #!/usr/bin/expect
set passwd "SGs2ox6uj"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -a --files-from=$file / user01@$host:/ expect {
"yes/no" {send "yes\r"}
"password:" {send "$passwd\r"} }
expect eof

命令格式:
expect ***.exp host file

代码上线脚本:

#! /bin/bash
# code syn to different server
#reminder
read -p "你是否已经更新了文件列表/root/synfile.list?确认请输入y或者Y,否则按其他任意键退出脚本。" c
if [ -z "$c" ]      #没有输入退出;
	then
   	   exit 1
fi
if [ $c == "y" -o $c == "Y" ]     #输入Y or y继续执行,否则退出;
	then
	   echo "脚本将在2秒后,继续执行。"
	   for i in 1 2       #延时功能;
		do
		   echo -n "."
		   sleep 1				
		done
	   echo
	else
	   exit 1
fi
#clean the /root/rsync.exp file      #主同步expect函数,只执行一次,完成后删除,以免错误执行;
[ -f /root/rsync.exp ] && rm -f /root/rsync.exp    #检查有没有同名称文件残留,删除;

#create the rsync.exp
cat > /root/rsync.exp <<EOF				#新建一个脚本文件,EOF结束;

#expect interact function      #开始输入;
# /usr/bin/expect
set passwd "password" 
set host [lindex \$argv 0]     #参数1赋给expect函数;
set file [lindex \$argv 1]        #参数2赋给expect函数;
spawn rsync -av --files-from=\$file / root@\$host:/     #使用获取到的文件列表,和IP同步到指定服务器;
expect {
"yes/no" {send "yes\r"}
"password:" {send \$passwd\r} 
}
expect eof 
EOF

chmod a+x /root/rsync.exp      #./rsync.exp这样运行时要做这个操作;

#function to check whether a file exist
if_file_exist()
{
if [ ! -f $1 ]
   then
	echo "文件$1不存在,请检查。"
	exit 1
fi
}

if_file_exist /root/ip.list
if_file_exist /root/synfile.list

for ip in `cat /root/ip.list`     #读取ip.list把ip逐个实施;
   do
	expect /root/rsync.exp $ip /root/synfile.list    
   done

rm -f /root/rsync.exp      #删除expect函数;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值