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

文章目录

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

mail命令
MacOS版本

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

然后执行命令:

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

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

bash 复制代码
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

然后执行命令:

bash 复制代码
echo "这是邮件的正文内容" | mail -s "邮件主题" xxxx@139.com
sendmail命令(MacOS推荐)
  1. 编辑 Postfix 配置文件

    bash 复制代码
    sudo vim /etc/postfix/main.cf

    添加以下内容(以163邮箱为例,参见:网易邮箱服务器参数):

    bash 复制代码
    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. 创建认证文件

    bash 复制代码
    sudo vim /etc/postfix/sasl_passwd

    写入账户和授权码。注意:your-code替换为你的客户端授权码,不是邮箱密码!!现在包括Gmail、163等主流邮箱都已经改为使用授权码了(还有效期限制,比如3个月),具体参见说明:如何新增授权码

    bash 复制代码
    [smtp.163.com]:465 your-name@163.com:your-code

    生成数据库并设置权限:

    bash 复制代码
    sudo postmap /etc/postfix/sasl_passwd
    sudo chmod 600 /etc/postfix/sasl_passwd*
  3. 重启Postfix并测试

    bash 复制代码
    sudo postfix stop && sudo postfix start
    echo "测试正文" | sendmail -f your-name@163.com xxxx@139.com
Curl命令

通过 SMTP 协议直接发送:

bash 复制代码
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:

bash 复制代码
sudo apt-get update
sudo apt-get install ssmtp

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

bash 复制代码
root=your_email@example.com
mailhub=smtp.example.com:587
AuthUser=your_email@example.com
AuthPass=your_email_password
UseTLS=YES
UseSTARTTLS=YES

发送邮件:

bash 复制代码
echo "这是邮件的正文内容" | ssmtp recipient@example.com
msmtp

安装msmtp:

bash 复制代码
# Debian 或 Ubuntu
sudo apt-get update
sudo apt-get install msmtp msmtp-mta

# CentOS 或 RHEL
sudo yum install msmtp

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

bash 复制代码
# 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

发送邮件:

bash 复制代码
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 后,修改配置区的内容为自己需求后即可执行该脚本:

bash 复制代码
#!/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 后,修改配置区的内容为自己需求后即可执行该脚本:

bash 复制代码
#!/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脚本进行处理,注意:处理结果需要显示打印到控制台输出

bash 复制代码
# 调用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 &
相关推荐
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
AI创界者2 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫2 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++