如何通过Unix Shell脚本从远程服务器向指定用户发送邮件
实现带命令行参数的远程系统监控邮件脚本
我来帮你梳理并优化这个脚本,让它更健壮、易维护,完美实现「通过命令行参数指定用户和邮箱,远程收集主机信息并发送邮件」的需求。
1. 主脚本 test.sh
这个脚本负责接收命令行参数、遍历远程主机列表,以及触发远程命令执行。我添加了参数合法性检查,避免因参数缺失导致的错误。
#!/bin/sh # 检查命令行参数是否完整 if [ $# -ne 2 ]; then echo "❌ 用法错误!正确格式: $0 <远程主机用户名> <目标邮箱地址>" exit 1 fi # 赋值命令行参数到变量 REMOTE_USER=$1 TARGET_EMAIL=$2 # 读取远程主机IP列表(ip.txt每行一个IP) REMOTE_IPS=$(cat ip.txt) # 加载远程执行的命令脚本内容 REMOTE_SCRIPT_CONTENT=$(cat remote_cmds.sh) # 遍历每个远程主机执行监控脚本 for ip in $REMOTE_IPS; do echo "=== 正在处理远程主机: $ip ===" # 远程登录并执行脚本,传递目标邮箱变量 ssh -o StrictHostKeyChecking=no -l $REMOTE_USER $ip "export TARGET_EMAIL=$TARGET_EMAIL; $REMOTE_SCRIPT_CONTENT" done
2. 远程执行脚本 remote_cmds.sh
这个脚本会在远程主机上运行,负责收集系统信息并发送邮件。我优化了信息展示格式,让邮件内容更易读。
#!/bin/sh # 收集系统核心信息 HOST_INFO=$(hostname) DISK_STATUS=$(df -h) RAM_STATUS=$(free -h) # 构造邮件内容 MAIL_BODY=" 📋 系统监控报告 - $HOST_INFO ### 主机名 $HOST_INFO ### 磁盘使用情况 $DISK_STATUS ### 内存使用情况 $RAM_STATUS " # 发送邮件到指定邮箱 echo "$MAIL_BODY" | mailx -s "【系统监控】$HOST_INFO 状态报告" $TARGET_EMAIL
3. 使用步骤
- 准备主机列表:创建
ip.txt文件,每行写入一个需要监控的远程主机IP,示例:192.168.1.20 192.168.1.21 - 设置执行权限:给两个脚本添加可执行权限
chmod +x test.sh remote_cmds.sh - 运行脚本:按照指定格式执行主脚本
./test.sh root admin@example.com
关键注意事项
- 确保远程主机已安装
mailx工具(Debian/Ubuntu用apt install mailutils,CentOS/RHEL用yum install mailx)。 - 建议配置SSH密钥免密登录远程主机,否则每次执行都会提示输入密码,影响自动化流程。
- 如果邮件发送失败,检查远程主机的邮件服务配置(比如
sendmail或postfix是否正常运行)。
内容的提问来源于stack exchange,提问作者user6690412
相关产品推荐
相关产品推荐

