Red Hat系统下如何将stdout输出通过mailx正常发送?
解决mailx发送脚本输出格式错乱的问题
嘿,我之前在Red Hat环境里也碰到过一模一样的问题——终端里输出整整齐齐,一用mailx发出去就面目全非,还没法改服务器配置,只能靠脚本绕。给你几个亲测有效的解决思路:
1. 强制指定纯文本格式,禁止自动折叠
mailx经常会自作主张把长行折叠、把连续空格/制表符换成单个空格,咱们直接在发送时明确告诉它要按纯文本原样输出:
# 先把脚本输出存到临时文件(避免管道可能的格式丢失) ./your_script.sh > /tmp/script_output.txt # 发送时添加Content-Type头,部分mailx版本加-E选项禁止折叠长行 mailx -E -s "脚本运行结果" -a "Content-Type: text/plain; charset=utf-8" your@mail.com < /tmp/script_output.txt
如果你的mailx版本不支持-a选项(有些老版本用-r或者直接在邮件正文里加头),可以试试这种写法:
{ echo "To: your@mail.com" echo "Subject: 脚本运行结果" echo "Content-Type: text/plain; charset=utf-8" echo "" cat /tmp/script_output.txt } | sendmail -t
(用sendmail兜底,RHEL默认一般都装了)
2. 用工具预处理输出,固定格式对齐
如果你的输出是有列的表格类内容,mailx很容易搞乱对齐,用pr或者column工具先把格式锁死:
# 用pr去掉页眉页脚,固定宽度为80列 ./your_script.sh | pr -t -w 80 | mailx -s "对齐后的脚本输出" your@mail.com # 如果是分隔符分隔的内容,用column做格式化 ./your_script.sh | column -t -s "|" | mailx -s "格式化表格" your@mail.com
3. 直接把输出当附件发送(最稳妥的方案)
要是上面的方法都搞不定,干脆把输出打包成附件,这样格式100%和终端里一致:
./your_script.sh > /tmp/script_output.txt # 用uuencode打包(RHEL默认自带) uuencode /tmp/script_output.txt script_output.txt | mailx -s "脚本输出附件" your@mail.com
收件人下载附件打开就能看到和终端完全一样的格式,绝对不会乱。
额外小提示
- 脚本里输出内容时,尽量用
printf "%s\n" "$content"代替echo,echo在处理特殊字符和换行时容易出问题; - 如果输出里有颜色码,记得先去掉(比如用
sed 's/\x1b\[[0-9;]*m//g'),不然邮件里会显示一堆乱码。
内容的提问来源于stack exchange,提问作者SSDdude
相关产品推荐
相关产品推荐

