SSH登录配置Email通知

Email客户端配置

No.1: 概述

  1. 告警通知是大多数监控软件或运维工具都有的功能,但对于云主机,资源本身就不足,并且还要开相应的服务端口,这里我介绍一种简单的通过脚本实现ssh登录主机邮件通知的方法。

  2. 关于邮件报警,有很多方案,这里使用稳定性较好的msmtp+mutt方案。原本打算用mailx的,可发送邮件老出问题(可能是我配置问题),弃之。

  3. msmtp

    • msmtp 是一个SMTP 客户端。
    • 在默认情况下,它把邮件送给负责发邮件的SMTP 服务器(如:免费邮箱供应商)。
    • 你需要手工建立一个含邮件账号信息的配置文件,并且让MUA(邮件客户端)启用msmtp 而不是/usr/sbin/sendmail ,这样才能使邮件客户端软件与msmtp 更好的协同工作。
  4. mutt

    • mutt是linux下的一个email程序。
    • mutt是一个MUA(邮件用户代理),它跟一般的 Windows 邮件程序不同,它不是一个包罗万象的大杂烩。你甚至会发现它根本不直接发出邮件,它从来不自己编辑邮件,它从来不自己对邮件进行加密和数字签名……
    • Mutt 更像一个文件管理器,只不过它管理的是email。它的功能是借助各个最强大的程序来实现的。这符合 UNIX 的设计思想。

No.2: 安装配置

我们只用到发送邮件的功能,其他的功能有兴趣可以自己研究下,这里不做说明

  1. 安装
    • RHEL/CentOS:# yum install msmtp mutt
    • Debian/Ubuntu:# apt install msmtp mutt
  2. msmtp配置
    • 默认没配置文件,在/usr/share/doc/msmtp-1.4.32/目录(CentOS7)下有msmtprc-system.examplemsmtprc-user.example模板
    • 手动创建配置文件,全局配置在/etc/msmtprc或某个用户配置在~/.msmtprc,这里做全局配置(每个用户登录都有提示)
    • 建议配置文件权限:
      /etc/msmtprc:644
      ~/.msmtprc:600
  3. msmtprc文件配置示例

    • 中文注释部分最好删除,我原本把注释放在各参数后面,结果报错了,另起一行就不报错
    • msmtp -S:打印有关服务器的信息(可检查SMTP服务器配置是否正确)
    • 日志文件权限问题
      # chmod 666 /var/log/msmtprclog
    # Set default values for all following accounts.
    defaults
    #使用TLS加密
    tls on
    tls_starttls off
    tls_certcheck off
    #tls_trust_file /etc/ssl/certs/ca-certificates.crt
    logfile /var/log/msmtprclog
    
    # A freemail service
    account qq
    #SMTP主机地址
    host smtp.exmail.qq.com
    # SMTP主机端口
    port 465
    auth login
    # 由于是企业邮箱,这里就用XXX表示了
    from wangxd@mooXXX.com 
    user wangxd@mooXXX.com
    #有的邮箱是开启SMTP时的授权码;有的是邮箱账号密码;qq企业邮箱用的是密码
    password xxxxxxxx
    
    # Set a default account
    account default : qq
  4. 测试,邮箱本身可以给自己账号发送邮件,这里用接收通知的邮箱也设置成我的企业邮箱
    $ echo '告警'|msmtp -v wangxd@mooXXX.com
    loaded system configuration file /etc/msmtprc
    略......
    <-- 354 End data with <CR><LF>.<CR><LF>
    --> 告警
    --> .
    <-- 250 Ok: queued as 
    --> QUIT
    <-- 221 Bye
  5. mutt配置
    /etc/Muttrc.local中添加一下内容

    set sendmail="/usr/bin/msmtp"
    set use_from=yes
    set realname="dream"
    set from=wangxd@mooXXX.com

No.3: 故障处理

  1. 异常:msmtp: the server sent an empty reply
    解决方法:tls_starttls off

  2. 异常:msmtp: TLS certificate verification failed: the certificate hasn’t got a known issuer
    解决方法:证书有误,tls_certcheck off,或者重新创建证书,然后配置证书。

  3. 异常:msmtp: account zlebank from /usr/local/mutt/etc/msmtprc: tls requires either tls_trust_file (highly recommended) or tls_fingerprint or a disabled tls_certcheck
    解决方法:tls_certcheck off,或者创建证书,然后配置证书:
    tls_trust_file [你的证书路径]

  4. 异常:msmtp: support for TLS is not compiled in
    解决方法:yum -y install gcc gcc-c++ gnutls gnutls-devel gnutls-utils openssl openssl-devel libidn libidn-devel

SSH登录Email提醒

No.1: 获取主机信息

  1. 获取登录IP:
    echo ${SSH_CONNECTION} | awk '{print$1}'

    • 可以从"$SSH_CLIENT"变量获取
  2. 获取登录IP端口:
    echo ${SSH_CONNECTION} | awk '{print$2}'

    • 可以从"$SSH_CLIENT"变量获取
  3. 获取服务器的IP:
    echo ${SSH_CONNECTION} | awk '{print$3}'
  4. 获取服务器端口
    echo ${SSH_CONNECTION} | awk '{print$4}'
  5. 获取登录用户:
    echo ${LOGNAME}
  6. 获取登录主机名:
    echo ${HOSTNAME} "(" $server_ip ")"
  7. 获取时间并指定输出格式
    echo $(date +"%Y-%m-%d %R")

No.2: 脚本

  1. 测试OS:RHEL/CentOS 6/7

  2. 创建脚本

    $ cat /etc/ssh/ssh_email.sh
    #! /bin/bash
    #-----------------------------------------------------#
    #                                                     #
    #     Author: xingdp                                   #
    #     Time:2017-10-12 13:50:07                        #
    #     Name:ssh_email.sh                               #
    #     Version: V1.0                                   #
    #     Description:SSH remote online mail reminder     #
    #                                                     #
    #-----------------------------------------------------#
    if [ -z "${SSH_CONNECTION}" ];then
        echo '$SSH_CONNECTION:not exists'
        exit 1
    fi
    
    # 定义变量  
    from_ip=`echo ${SSH_CONNECTION} | awk '{print$1}'`
    from_port=`echo ${SSH_CONNECTION} | awk '{print$2}'`
    server_ip=`echo ${SSH_CONNECTION} | awk '{print$3}'`
    user=`echo ${LOGNAME}`
    hostname_1=`echo ${HOSTNAME} "(" $server_ip ")"`
    server_time=`echo $(date +"%Y-%m-%d %R")`
    e_mail=xxxxxx@qq.com
    
    # 某IP段不需要提醒
    #ip_exit=`echo ${from_ip}|cut -d "." -f 1,2,3`
    #if [ "${ip_exit}" == "192.168.1" ];then
    #exit 1
    #fi
    
    # 某用户不需要提醒
    if [ "${user}" == "git" ];then
    exit 1
    fi
    
    # 发送邮件
    echo -e "
    *********** 服务器登录提醒 ***********\n
    
        登录主机:  ${hostname_1}\n
        登录用户:  ${user}\n
        登录时间:  ${server_time}\n
        登录IP地址:${from_ip}\n
        登录IP端口:${from_port}\n
        登录IP区域:\n
    
    **************************************"|mutt -s "服务器登录提醒" ${e_mail}
  3. 创建/etc/ssh/sshrc文件

    # cat /etc/ssh/sshrc 
    bash /etc/ssh/ssh_email.sh

No.2: 测试

  1. 测试结果:ssh登录主机后,自动发送邮件
  2. 除了ssh登录邮件通知,还可以配置定时任务执行结果通知、git提交更新通知等,配置方法可以借鉴ssh登录通知。

微信扫一扫,分享到朋友圈

SSH登录配置Email通知
0
别把想做的事情,留给遥不可及的未来!
上一篇

IBM DS4/5000系列存储维护手册

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部