shell脚本:
#!/bin/bash
#通过shell查询数据信息并保存在excel中,并记录日志
#Data:2018-06-14
#Name:Zhang
#数据库连接地址
DBServer=
#数据库用户名
DBUserName=
#数据库密码
DBPasswd=
###########################################################
#选择数据库
Use_Cmd="use 数据库名称"
#查询数据库信息Sql语
Select_Cmd="select * from ap_vb where ap='1';"
###########################################################
#保存路径
Payment_DataDir="/opt/dingshi/backup"
#日志保存路径
LogDir="/opt/dingshi/log"
#数据导出时间
backtime=`date +%Y%m%d%H%M`
#保存文件名称
DataName="申请"
###########################################################
MKDIR="/bin/mkdir"
#########################################################
echo "##################判断备份路径 #############################"
test ! -d $Payment_DataDir && $MKDIR -p $Payment_DataDir
test ! -w $Payment_DataDir && echo "Error: $Payment_DataDir is un-writeable." && exit 0
test ! -d $LogDir && $MKDIR -p $LogDir
test ! -w $LogDir && echo "Error: $LogDir is un-writeable." && exit 0
echo "######################备份开始 #############################"
echo "" >> $LogDir/$DataName.log
echo -e "\033[44;32m-------------------------分割线-----------------------\033[0m \n" >> $LogDir/$DataName.log
echo "导出时间为$backtime,导出${DataName}文件开始" >> $LogDir/$DataName.log
/usr/bin/mysql(MySQL命令绝对路径) -u$DBUserName -h$DBServer -p$DBPasswd -e "$Use_Cmd;$Select_Cmd" > $Payment_DataDir/$DataName-$backtime.xls
#sed -i 's/^/`&/g' $Payment_DataDir/$DataName-$backtime.xls
#使用iconv转换编码格式,把linux的utf8转换成windows的gbk
iconv -f "utf-8" -t "gbk" $Payment_DataDir/$DataName-$backtime.xls > $Payment_DataDir/Orders.xls
#因第一列数据超过18位,excel中使用了科学计数法,所以把第一列加了“`”转换成文本格式
sed -i 's/^/`&/g' $Payment_DataDir/Orders.xls
if [ "$?" == 0 ];then
echo "导出时间为$backtime,导出$DataName文件结束!!!" >> $LogDir/$DataName.log
echo "Mysql-$DataName数据导出成功!!!" >> $LogDir/$DataName.log
else
echo "导出时间为$backtime,导出$DataName文件结束!!!" >> $LogDir/$DataName.log
echo "Mysql-$DataName数据导失败!!!" >> $LogDir/$DataName.log
fi
echo "######################导出数据结束,时间为:$backtime#####"
注意:若提示脚本不能有MySQL密码 可以直接将错误提示重定向到系统文件中
/usr/bin/mysql(MySQL命令绝对路径) -u$DBUserName -h$DBServer -p$DBPasswd -e "$Use_Cmd;$Select_Cmd"
2>/dev/null > $Payment_DataDir/$DataName-$backtime.xls
---------------------------------------------------------------------------------------------------------------------
由于阿里云不开放25端口,所以使用加密端口对外发送邮件
1、关闭其它的邮件工具
1 2 3 4 |
service sendmail stop chkconfig sendmail off service postfix stop chkconfig postfix off |
2、安装mailx
1 |
yum install mailx |
3、首先在邮箱中开启smtp,开启后会得到一个授权码,这个授权码就代替了密码(自行去邮箱开启)。
4、请求数字证书(这里用的qq邮箱,所以向qq请求证书)
1 2 3 4 5 6 |
mkdir -p /root/.certs/ echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt ###执行这个命令后提示:Notice: Trust flag u is set automatically if the private key is present. (为了信任证书) certutil -L -d /root/.certs |
5、配置/etc/mail.rc
1 2 3 4 5 6 7 |
set [email protected] #之前设置好的邮箱地址 set smtp=smtps://smtp.qq.com:465 #邮件服务器 set [email protected] #之前设置好的邮箱地址 set smtp-auth-password=xxxx #授权码 set smtp-auth=login #默认login即可 set ssl-verify=ignore #ssl认证方式 set nss-config-dir=/root/.certs #证书所在目录 |
6、发送邮件测试
1 |
echo "邮件正文" | mail -s "邮件主题" [email protected] |
注意:
centos6上没有certutil命令,从虚拟机上执行完后生成秘钥 把秘钥拷到centos6上即可
带附件发送:
mail -s "邮件主题" -a 附件路径 收件人邮箱 < 邮件正文路径
****如果在执行邮件发送命令后报(证书不被信任)
Error in certificate: Peer's certificate issuer is not recognized.
则优先执行certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt
###执行这个命令后提示:Notice: Trust flag u is set automatically if the private key is present. (为了信任证书)
如果执行以上命令还是失败,则在邮件发送语句后添加2>/dev/null(忽略错误)
eg:mail -s "job" -a /home/amp/jobs/data/$DataName-$time.xls ****@qq.com 2>/dev/null
mail -s "测试" -a /home/factory/factory-sqlsh/dingshi/backup/测试.xls [email protected] < /home/factory/factory-sqlsh/dingshi/111.txt
-------------------------------------------------------------------------------------------------------------------------
使用linux自带的定时任务crontab,添加到定时即可,这里不再多说。