当前位置: 首页 > news >正文

终端的命令行发送邮件的方式和监视脚本

文章目录

      • 终端的命令行发送邮件的方式
        • mail命令
          • MacOS版本
          • Linux版本
        • sendmail命令(MacOS推荐)
        • Curl命令
        • ssmtp
        • msmtp
      • 监视脚本
        • 所有白名单关键字都存在、且所有黑名单关键字都不存在时触发报警
        • 任意白名单关键字存在、或任意黑名单关键字不存在时触发报警
      • 命令文件的典型应用场景
        • 监视单个接口返回值
        • 多命令形式
        • 更复杂的处理逻辑
      • 更多细节

终端的命令行发送邮件的方式

mail命令
MacOS版本

需要先在MacOS系统的邮件应用配置默认账户。(在「启动台」中可以找到「邮件」应用)

然后执行命令:

echo "这是邮件的正文内容" | mail -s "邮件主题" xxxx@139.com
Linux版本

如果是Linux终端的版本,则使用要简单得多,直接配置好 ~/.mailrc (类似下文的服务器参数):

set smtp=smtps://smtp.gmail.com:465
set smtp-auth=login
set smtp-auth-user=your_email@gmail.com
set smtp-auth-password=your_app_password
set from=your_email@gmail.com

然后执行命令:

echo "这是邮件的正文内容" | mail -s "邮件主题" xxxx@139.com
sendmail命令(MacOS推荐)
  1. 编辑 Postfix 配置文件
    sudo vim /etc/postfix/main.cf
    
    添加以下内容(以163邮箱为例,参见:网易邮箱服务器参数):
    relayhost = [smtp.163.com]:465
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_security_options = noanonymous
    smtp_tls_wrappermode = yes  # 163邮箱使用SSL加密的465端口
    smtp_tls_security_level = encrypt
    
  2. 创建认证文件
    sudo vim /etc/postfix/sasl_passwd
    
    写入账户和授权码。注意:your-code替换为你的客户端授权码,不是邮箱密码!!现在包括Gmail、163等主流邮箱都已经改为使用授权码了(还有效期限制,比如3个月),具体参见说明:如何新增授权码:
    [smtp.163.com]:465 your-name@163.com:your-code
    
    生成数据库并设置权限:
    sudo postmap /etc/postfix/sasl_passwd
    sudo chmod 600 /etc/postfix/sasl_passwd*
    
  3. 重启Postfix并测试
    sudo postfix stop && sudo postfix start
    echo "测试正文" | sendmail -f your-name@163.com xxxx@139.com
    
Curl命令

通过 SMTP 协议直接发送:

curl --url "smtps://smtp.163.com:465" \
     --ssl-reqd \
     --mail-from "your-name@163.com" \
     --mail-rcpt "xxxx@139.com" \
     --user "your-name@163.com:your-code" \
     -T <(echo -e "From: your-name@163.com\nTo: xxxx@139.com\nSubject:测试邮件\n\n这是邮件的正文内容")

参数说明
smtps:// 表示使用 SSL 加密(对应465端口)。
your-code 需替换为163邮箱的客户端授权码(非登录密码),参见上文说明。

ssmtp

安装ssmtp:

sudo apt-get update
sudo apt-get install ssmtp

编辑/etc/ssmtp/ssmtp.conf文件,按如下内容进行配置:

root=your_email@example.com
mailhub=smtp.example.com:587
AuthUser=your_email@example.com
AuthPass=your_email_password
UseTLS=YES
UseSTARTTLS=YES

发送邮件:

echo "这是邮件的正文内容" | ssmtp recipient@example.com
msmtp

安装msmtp:

# Debian 或 Ubuntu
sudo apt-get update
sudo apt-get install msmtp msmtp-mta

# CentOS 或 RHEL
sudo yum install msmtp

msmtp 的配置文件通常位于 ~/.msmtprc(用户级配置)或 /etc/msmtprc(系统级配置):

# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# Gmail account
account        gmail
host           smtp.gmail.com
port           587
from           your_email@gmail.com
user           your_email@gmail.com
password       your_app_password

# Set a default account
account default : gmail

发送邮件:

echo "这是邮件的正文内容" | msmtp recipient@example.com

{
  echo "From: your_email@gmail.com"
  echo "To: recipient@example.com"
  echo "Subject: 邮件主题"
  echo ""
  echo "这是邮件的正文内容"
} | msmtp recipient@example.com

监视脚本

所有白名单关键字都存在、且所有黑名单关键字都不存在时触发报警

编辑 vi monitor_and_version.sh 并输入以下内容,添加可执行属性 chmod +x monitor_and_version.sh 后,修改配置区的内容为自己需求后即可执行该脚本:

#!/bin/bash
# 配置区(按需修改以下参数)
INTERVAL=10               # 循环间隔时间(秒)
COMMAND_FILE="./commands"  # 待执行的命令文件路径
WHITE_KEYWORDS_FILE="./white_keywords"  # 白名单关键字文件路径
BLACK_KEYWORDS_FILE="./black_keywords"  # 黑名单关键字文件路径
MAIL_TO="your-name@139.com"             # 通知邮件接收地址
MAIL_FROM="your-name@163.com"          # 发件人地址
LOG_LEVEL=2                             # 日志级别: 1-调试, 2-信息, 3-警告, 4-错误

# 日志函数(带颜色分级)
log() {
    local level=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local color_code=""

    case $level in
        "DEBUG") [[ $LOG_LEVEL -ge 2 ]] && return ;;  # 当LOG_LEVEL≥1时跳过DEBUG
        "INFO")  [[ $LOG_LEVEL -ge 3 ]] && return ;;
        "WARN")  [[ $LOG_LEVEL -ge 4 ]] && return ;;
        "ERROR") : ;;  # ERROR始终输出
    esac

    if [[ $LOG_COLOR == true ]]; then
        echo -e "${color_code}[${timestamp}] [${level}] ${message}\033[0m"
    else
        echo "[${timestamp}] [${level}] ${message}"
    fi
}

# 邮件发送函数(中文标题和内容)
send_alert() {
    local subject=$1
    local body=$2

 (
  echo "Subject: =?UTF-8?B?$(echo "$subject" | base64)?="  # 编码处理
  echo "MIME-Version: 1.0"
  echo "Content-Type: text/plain; charset=utf-8"
  echo
  echo "$body"
) | /usr/sbin/sendmail -t -f $MAIL_FROM $MAIL_TO


}

# 主程序
log "INFO" "启动监控脚本,命令文件: $COMMAND_FILE"

while true; do
    # 检查命令文件
    if [ ! -f "$COMMAND_FILE" ]; then
        log "ERROR" "命令文件不存在: $COMMAND_FILE"
        send_alert "[紧急] 命令文件缺失" "检测到命令文件不存在!\n路径: $COMMAND_FILE"
        exit 1
    fi

    # 执行命令文件
    log "INFO" "开始执行命令文件"
    output=$(bash "$COMMAND_FILE" 2>&1)
    exit_code=$?

    # 处理执行结果
    if [[ $exit_code -ne 0 ]]; then
        log "ERROR" "命令执行失败,退出码: $exit_code"
        send_alert "[故障] 命令执行异常" "错误代码: $exit_code\n错误详情:\n$output"
    else
        log "INFO" "命令执行成功,输出长度: ${#output} 字符"
        log "DEBUG" "命令执行成功,输出内容: ${output} "


        # 初始化触发标志
        white_trigger=false
        black_trigger=false

        # 白名单文件存在性判断
        white_file_exists=false
        if [ -f "$WHITE_KEYWORDS_FILE" ]; then
            white_file_exists=true
            log "DEBUG" "检测到白名单文件,开始校验"
        else
            log "WARN" "白名单文件未找到,忽略白名单检查"
        fi

        # 白名单检测(仅当文件存在时)
        if $white_file_exists; then
            white_trigger=true  # 预设为满足条件
            while IFS= read -r keyword; do
                if [[ -n "$keyword" ]]; then
                    if ! grep -iqF "$keyword" <<< "$output"; then
                        white_trigger=false
                        log "DEBUG" "白名单关键字缺失: $keyword"
                    fi
                fi
            done < <(grep -v '^#' "$WHITE_KEYWORDS_FILE")
        fi

        # 黑名单文件存在性判断
        black_file_exists=false
        if [ -f "$BLACK_KEYWORDS_FILE" ]; then
            black_file_exists=true
            log "DEBUG" "检测到黑名单文件,开始校验"
        else
            log "WARN" "黑名单文件未找到,忽略黑名单检查"
        fi

        # 黑名单检测(仅当文件存在时)
        if $black_file_exists; then
            black_trigger=true  # 预设为满足条件
            while IFS= read -r keyword; do
                if [[ -n "$keyword" ]] && grep -iqF "$keyword" <<< "$output"; then
                    black_trigger=false
                    log "DEBUG" "黑名单关键字存在: $keyword"
                fi
            done < <(grep -v '^#' "$BLACK_KEYWORDS_FILE")
        fi

        # 组合触发条件
        if ($white_file_exists && $white_trigger) || ! $white_file_exists; then
            if ($black_file_exists && $black_trigger) || ! $black_file_exists; then
                log "WARN" "触发报警条件:白名单全匹配且黑名单全不匹配"
                send_alert "[复合告警] 关键字规则触发" \
                    "触发条件满足:\n白名单全存在: $white_trigger\n黑名单全不存在: $black_trigger\n完整输出:\n$output"
            fi
        fi


    fi

    # 睡眠日志记录
    log "INFO" "等待下次执行,间隔: ${INTERVAL}秒"
    sleep $INTERVAL
done
任意白名单关键字存在、或任意黑名单关键字不存在时触发报警

编辑 vi monitor_or_version.sh 并输入以下内容,添加可执行属性 chmod +x monitor_or_version.sh 后,修改配置区的内容为自己需求后即可执行该脚本:

#!/bin/bash
# 配置区(按需修改以下参数)
INTERVAL=10               # 循环间隔时间(秒)
COMMAND_FILE="./commands"  # 待执行的命令文件路径
WHITE_KEYWORDS_FILE="./white_keywords"  # 白名单关键字文件路径
BLACK_KEYWORDS_FILE="./black_keywords"  # 黑名单关键字文件路径
MAIL_TO="your-name@139.com"             # 通知邮件接收地址
MAIL_FROM="your-name@163.com"          # 发件人地址
LOG_LEVEL=2                             # 日志级别: 1-调试, 2-信息, 3-警告, 4-错误

# 日志函数(带颜色分级)
log() {
    local level=$1
    local message=$2
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    local color_code=""

    case $level in
        "DEBUG") [[ $LOG_LEVEL -ge 2 ]] && return ;;  # 当LOG_LEVEL≥1时跳过DEBUG
        "INFO")  [[ $LOG_LEVEL -ge 3 ]] && return ;;
        "WARN")  [[ $LOG_LEVEL -ge 4 ]] && return ;;
        "ERROR") : ;;  # ERROR始终输出
    esac

    if [[ $LOG_COLOR == true ]]; then
        echo -e "${color_code}[${timestamp}] [${level}] ${message}\033[0m"
    else
        echo "[${timestamp}] [${level}] ${message}"
    fi
}

# 邮件发送函数(中文标题和内容)
send_alert() {
    local subject=$1
    local body=$2

 (
  echo "Subject: =?UTF-8?B?$(echo "$subject" | base64)?="  # 编码处理
  echo "MIME-Version: 1.0"
  echo "Content-Type: text/plain; charset=utf-8"
  echo
  echo "$body"
) | /usr/sbin/sendmail -t -f $MAIL_FROM $MAIL_TO


}

# 主程序
log "INFO" "启动监控脚本,命令文件: $COMMAND_FILE"

while true; do
    # 检查命令文件
    if [ ! -f "$COMMAND_FILE" ]; then
        log "ERROR" "命令文件不存在: $COMMAND_FILE"
        send_alert "[紧急] 命令文件缺失" "检测到命令文件不存在!\n路径: $COMMAND_FILE"
        exit 1
    fi

    # 执行命令文件
    log "INFO" "开始执行命令文件"
    output=$(bash "$COMMAND_FILE" 2>&1)
    exit_code=$?

    # 处理执行结果
    if [[ $exit_code -ne 0 ]]; then
        log "ERROR" "命令执行失败,退出码: $exit_code"
        send_alert "[故障] 命令执行异常" "错误代码: $exit_code\n错误详情:\n$output"
    else
        log "INFO" "命令执行成功,输出长度: ${#output} 字符"
        log "DEBUG" "命令执行成功,输出内容: ${output} "

        # 白名单检测
        if [ -f "$WHITE_KEYWORDS_FILE" ]; then
            log "DEBUG" "启动白名单关键字扫描"
            while IFS= read -r keyword; do
                if [[ -n "$keyword" ]] && grep -iqF "$keyword" <<< "$output"; then
                    log "WARN" "检测到白名单关键字: $keyword"
                    send_alert "[预警] 白名单关键字触发" "匹配关键字: $keyword\n完整输出:\n$output"
                    break
                fi
            done < <(grep -v '^#' "$WHITE_KEYWORDS_FILE")
        fi

        # 黑名单检测
        if [ -f "$BLACK_KEYWORDS_FILE" ]; then
            log "DEBUG" "启动黑名单关键字扫描"
            missing_black=false
            while IFS= read -r keyword; do
                if [[ -n "$keyword" ]] && ! grep -iqF "$keyword" <<< "$output"; then
                    missing_black=true
                    break
                fi
            done < <(grep -v '^#' "$BLACK_KEYWORDS_FILE")

            if $missing_black; then
                log "WARN" "缺少黑名单关键字"
                send_alert "[异常] 黑名单关键字缺失" "未检测到以下必需关键字:\n$(grep -v '^#' "$BLACK_KEYWORDS_FILE")\n完整输出:\n$output"
            fi
        fi
    fi

    # 睡眠日志记录
    log "INFO" "等待下次执行,间隔: ${INTERVAL}秒"
    sleep $INTERVAL
done

命令文件的典型应用场景

监视单个接口返回值
  1. 打开 Chrome 浏览器,访问包含目标接口请求的网页。
  2. 按下键盘快捷键 F12 或者 Ctrl + Shift + I(适用于 Windows/Linux 系统),也可以使用 Cmd + Opt + I(适用于 Mac 系统),以此调出开发者工具。
  3. 在开发者工具顶部的标签页里,选择 Network 标签。
  4. 若有需要,点击 Preserve log(保留日志)按钮,从而保证刷新页面后请求不会被清空。
  5. 刷新当前页面,或者执行页面操作,比如点击按钮、提交表单等,让目标接口的请求显示在 Network 列表中。
  6. 在左侧的 Name 列找到目标请求,还能通过筛选 TypeXHR/Fetch 或者依据 URL 关键词进行过滤查找。
  7. 右键点击目标请求,接着选择 Copy,再从下拉菜单中选择 Copy as cURL
  8. 把复制的 curl 命令粘贴到 commands 文件中即可。
多命令形式

简单的获取多个接口的请求Curl命令。并每个一行放入 commands 文件中即可。

更复杂的处理逻辑

直接在 commands 文件中调用Python脚本进行处理,注意:处理结果需要显示打印到控制台输出

# 调用Python脚本
python myscript.py

更多细节

  1. 使用Windows或MacOS执行脚本时,可以将系统设置为充电状态下不休眠,以可以长时间不间断保持运行监视脚本。
  2. 139邮箱可以在收到新邮件时发送短信通知。但默认只是在8点-22点才会通知,如有需要,在139邮箱的配置中可修改为24小时通知。
  3. 如果需要脚本打印日志到本地文件,可以使用 ./monitor_and_version.sh | tee -a ./monitor.log 命令执行。
  4. 如果需要静默执行,可以执行命令:nohup ./monitor_and_version.sh > monitor.log 2>&1 &

相关文章:

  • windows专用网路的共享文件配置
  • EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级
  • 高频GNSS同震形变计算方法
  • 可发1区的超级创新思路:基于注意力机制的DSD-CNN时间序列预测模型(功率预测、交通流量预测、故障检测)
  • Python学习第二十二天
  • 智能体开发革命:灵燕平台如何重塑企业AI应用生态
  • Lineageos 22.1(Android 15)应用双开
  • 图解AUTOSAR_CP_EEPROM_Abstraction
  • Nordic nRF528xxx Beacon功能开发学习方案总结
  • Metasploit 跳板攻击
  • doris:负载均衡
  • centos 9 编译安装 rtpengine
  • 【WebGL】texImage2D函数
  • 1.5.7 掌握Scala内建控制结构 - 变量作用域
  • 虚拟机的三种 Linux 网络配置原理图解读
  • 在Fedora-Workstation-Live-x86_64-41-1.4中使用最新版本firefox和腾讯翻译插件让英文网页显示中文翻译
  • Linux C/C++ 程序的内存泄漏定位方法
  • k8s中service概述(二)NodePort
  • 奇迹科技:蓝牙网关赋能少儿篮球教育的创新融合案例研究
  • SOFAStack-00-sofa 技术栈概览
  • 五一假期上海推出首批16条“市民健康路线”,这些健康提示请收好
  • 女乘客遭顺风车甩客、深夜丢高速服务区,滴滴霸道回应:赔五百元
  • 中央纪委办公厅公开通报3起整治形式主义为基层减负典型问题
  • 俄罗斯称已收复库尔斯克州,普京发表讲话
  • “70后”通化市委书记孙简已任吉林省政府领导
  • 美称中美芬太尼问题谈判但中方不够真诚,外交部回应