Linux定时每月最后一天备份并发送邮件

每月需要在月初手工运行一次备份,将一台机器的文件scp到另外一台机器上,终于厌烦,写脚本布置自动运行,中间遇到:

1.文件名取月份和年份,遇到长度问题:
$(date +%y) --2位
$(date +%Y) --4位
mkdir $(date +%m) ---月份带0
mkdir $(date +%-m)---月份不带0

2.脚本运行错误
备份脚本参考网上的,修改成:
#!/usr/bin/expect
set timeout 10
set foldery [exec date +%Y]
set folderm  [exec date +%-m]
spawn scp -r /home/datafiles/$foldery/$folderm  myname@10.10.0.20:/app/datafiles/$foldery/
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes\r"
expect "password:"
send "mypassword\r"
interact

就这一段脚本遇到两个错误:
问题一:.can't read "(date +%Y)": no such variable    while executing
spawn scp -r /home/datafiles/$(date +%Y) 这种方式是不行的。
保存为backup.sh
chmod +x backup.sh 转成可执行文件

问题二.指纹的应答问题
ECDSA key fingerprint is SHA256:HIGXkqS/Ttuefp4s7gCt1hSINSt3StZzQVGI1a8i9zI.
Are you sure you want to continue connecting (yes/no)?
Please type 'yes' or 'no': y
需增加一个应答

3.设置月底自动执行crontab设置
如何设置成当月最后一天的23:55开始自动备份文件,
55 23 28-31 * *  [ 'date -d tomorrow +\%e' -eq 1 ] &&  /home/app/backfile.exp


4.备份成功后发送邮件

在Linux配置发送邮件,我通过局域网代理,所以简单
A.找到/etc/mail.rc,修改配置
set from=alert@mydomain.com
set smtp=10.0.0.100

B.发送测试
--不带内容,Ctrl+d结束
mail -s "test" mymail@outlook.com
--带文本内容
echo "test mail"| mail -s "test" mymail@outlook.com
但是放到作业里面出错:
invalid command name "echo"
    while executing
原因是作业脚本里面这一句
#!/usr/bin/expect
全部是expect,所以不用shell脚本执行了。


趁机了解一下Linux expect 脚本的使用
Expect的原理:Expect脚本语言自动提交输入到交互程序,它的工作原理是等待特定字符串,并发送或者响应相应的字符串。以下四个expect命令用于任何自动化的过程。
1、spawn:启动命令
2、expect:等待来自进程的特定的字符串
3、send:发送字符串到进程
4、interact:允许用户交互

最后修改后的脚本:
#!/bin/bash
/usr/bin/expect <<-EOF
set timeout 10
set foldery [exec date +%Y]
set folderm  [exec date +%-m]
spawn scp -r /home/datafiles/$foldery/$folderm username@10.10.0.20:/app/datafiles/$foldery/
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes\r"
expect "password:"
send "mypassword\r"
interact
expect eof;
EOF
echo "backup completely"| mail -s "backup" mymail@outlook.com

上一篇:记centos7搭建ftp服务器


下一篇:javascript中的function不存在重载的概念