Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用crontab job send mail,电子邮件文本将变成名为ATT00001.bin的附加文件_Linux_Shell_Email_Crontab - Fatal编程技术网

Linux 使用crontab job send mail,电子邮件文本将变成名为ATT00001.bin的附加文件

Linux 使用crontab job send mail,电子邮件文本将变成名为ATT00001.bin的附加文件,linux,shell,email,crontab,Linux,Shell,Email,Crontab,我想在一台linux服务器上分析一些数据,然后将其作为电子邮件文本发送到我的电子邮件帐户,但是当我在shell命令中执行这个shell脚本时,它工作得很好,奇怪的是,当我将所有过程放入crontab作业中时,电子邮件文本将变成一个附加文件,有人可以帮助吗 #* * * * * sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1 /* exec.sh */ #/bin/sh cd /opt/bin ./analysis.s

我想在一台linux服务器上分析一些数据,然后将其作为电子邮件文本发送到我的电子邮件帐户,但是当我在shell命令中执行这个shell脚本时,它工作得很好,奇怪的是,当我将所有过程放入crontab作业中时,电子邮件文本将变成一个附加文件,有人可以帮助吗

#* * * * * sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1

/* exec.sh */
#/bin/sh
cd /opt/bin
./analysis.sh > test
mail -s "Today's Weather" example@example.com < test
***sh-x/opt/bin/exec.sh>/opt/bin/mailerror 2>&1
/*exec.sh*/
#/垃圾箱/垃圾箱
cd/opt/bin
./analysis.sh>测试
邮件-s“今日天气”example@example.com<测试

但是,当我直接在shell命令行中执行exec.sh时,电子邮件将收到文本,有人能为我解释一下吗,谢谢。

请确保在脚本中更改此内容。

#/bin/sh
取而代之

#!/bin/sh
来解决问题

脚本假定它是从特定目录运行的(请注意,几乎每个路径都是相对路径,而不是绝对路径)。cron恰好从另一个目录运行它

对出现在电子邮件上的文本的修复

mydir=$(dirname "$0") && cd "${mydir}" || exit 1
./opt/bin/analysis.sh > test 
mail -s "Today's Weather" example@example.com < /opt/bin/test

我自己也遇到了同样的问题,只是我正在将文本输出传送到
mailx
-heriglom mailx 12.4 7/29/08

在命令行上运行脚本时,电子邮件显示为带有文本正文的普通电子邮件。
然而,当我通过
crontab
运行完全相同的脚本时,电子邮件的正文作为附件出现——ATT00001.BIN(Outlook)、application/octet-stream(mutt)或“noname”(Gmail)

我做了一些研究来弄清楚这一点,但下面是:

问题

如果Mailx在文本输入中遇到未知/控制字符,它会将其转换为设置了application/octet stream mime类型的附件

从手册页:

对于包含除换行符和水平制表符以外的格式字符的任何文件

因此,您需要删除这些控制字符,这可以通过
tr

echo "$Output" | /usr/bin/tr -cd '\11\12\15\40-\176' | mail ...
但是,因为我有挪威UTF8字符:æå-列表将展开,您不想维护这样的列表,我需要挪威字符

检查附件时,我发现只有范围为32-176的“常规”ASCII字符\r\n-所有字符都可打印184和195-->UTF8

解决方案

在脚本中显式设置区域设置:

LANG="en_US.UTF8" ; export LANG
在shell中运行
export
,如果运行
csh
tcsh
来确定您的语言环境设置为什么,则运行
setenv

解释

Mailx-在shell中运行时-LANG设置为.UTF8,将正确识别UTF8字符并继续

crontab
LANG中运行时,未设置LANG,默认为LANG=C,因为默认情况下,crontab将只运行一组受限的环境变量(取决于系统)

然后,mailx(或其他程序)将无法识别UTF8字符,并确定输入包含未知的控制字符

我的问题是UTF8字符,你的可能是输入中的其他控制字符。通过
hextump
od-c
运行它,但是由于它在常规shell中工作正常,我怀疑会出现LANG问题

参考文献:


我也有同样的问题,但上述问题都没有解决。在文件中移动额外的报税表为我解决了这个问题:

cat logfile | tr -d \\r | mailx -s'the logfile' to-me@.....
感谢本论坛:


嘿,伙计,我尝试了每一种方法,但都失败了,我不知道该怎么办。请发布uname输出和完整的脚本输出。你能给我一封电子邮件吗,我会将所有文件发送给你。你尝试了后续答案吗??请在这里发布修改后的脚本。如果您需要帮助,请发布uname输出和完整的脚本输出。您的回答对我帮助很大。(我已经导出LANG=“ko_KR.utf8”)感谢您的回答。在脚本中设置语言为我解决了这个问题。
LANG="en_US.UTF8" ; export LANG
cat logfile | tr -d \\r | mailx -s'the logfile' to-me@.....