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

文章目录

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

mail命令
MacOS版本

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

然后执行命令:

bash 复制代码
echo "这是邮件的正文内容" | mail -s "邮件主题" [email protected]
Linux版本

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

bash 复制代码
set smtp=smtps://smtp.gmail.com:465
set smtp-auth=login
set [email protected]
set smtp-auth-password=your_app_password
set [email protected]

然后执行命令:

bash 复制代码
echo "这是邮件的正文内容" | mail -s "邮件主题" [email protected]
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 [email protected]: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 [email protected] [email protected]
Curl命令

通过 SMTP 协议直接发送:

bash 复制代码
curl --url "smtps://smtp.163.com:465" \
     --ssl-reqd \
     --mail-from "[email protected]" \
     --mail-rcpt "[email protected]" \
     --user "[email protected]:your-code" \
     -T <(echo -e "From: [email protected]\nTo: [email protected]\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 复制代码
[email protected]
mailhub=smtp.example.com:587
[email protected]
AuthPass=your_email_password
UseTLS=YES
UseSTARTTLS=YES

发送邮件:

bash 复制代码
echo "这是邮件的正文内容" | ssmtp [email protected]
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           [email protected]
user           [email protected]
password       your_app_password

# Set a default account
account default : gmail

发送邮件:

bash 复制代码
echo "这是邮件的正文内容" | msmtp [email protected]

{
  echo "From: [email protected]"
  echo "To: [email protected]"
  echo "Subject: 邮件主题"
  echo ""
  echo "这是邮件的正文内容"
} | msmtp [email protected]

监视脚本

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

编辑 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="[email protected]"             # 通知邮件接收地址
MAIL_FROM="[email protected]"          # 发件人地址
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="[email protected]"             # 通知邮件接收地址
MAIL_FROM="[email protected]"          # 发件人地址
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 &
相关推荐
muxue1783 小时前
关于almalinux分区配置:
linux·运维·数据库
@PHARAOH4 小时前
HOW - 在 Mac 上的 Chrome 浏览器中调试 Windows 场景下的前端页面
前端·chrome·macos
独行soc5 小时前
2025年渗透测试面试题总结-某服面试经验分享(附回答)(题目+回答)
linux·运维·服务器·网络安全·面试·职场和发展·渗透测试
sunshineine5 小时前
jupyter notebook运行简单程序
linux·windows·python
O。o.尊都假都6 小时前
UDP协议
linux·服务器·网络·网络协议·udp
天夏已微凉6 小时前
1.3.1 Linux音频框架alsa详细介绍
linux·音视频
惜.己6 小时前
linux中的常用命令(一)
linux·运维·服务器
m0_593758108 小时前
系统重装之后,通过ssh无法登录
linux·运维·服务器
银河麒麟操作系统8 小时前
【银河麒麟高级服务器操作系统】服务器外挂存储ioerror分析及处理分享
linux·运维·服务器
某不知名網友8 小时前
Linux_进程退出与进程等待
linux·运维·服务器