测试机器存活的脚本
#! /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 = '[email protected]' #发件邮箱;
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 [email protected] "邮件主题" "邮件内容"
监控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" [email protected]
#结合任务计划每分钟实施一次;
#工作量会不会很大?把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 / [email protected]:/ #做了密钥认证后,不需要输入密码;
远端:
[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 [email protected]
[email protected]'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函数;