uuencode mail 发送附件(由格式错误引发的思考)
问题场景:测试环境需要将测试报告打包发送出来,构建jenkins job。
1. mac机器,测试报告为多份文件构成的文件夹;
2. mail 命令可发送邮件,无参数直接添加附件发送;
3. google 知道命令uuencode
4. 使用 uuencode xxx.tar.gz | mail -s "subject" xxx@xxx.com ,发出邮件,windows上附件xxx.tar.gz无法打开,解压显示文件受到损坏,回到mac执行机器上xxx.tar.gz可见可打开;
调试使用 uuencode xxx.html | mail -s "subject" xxx@xxx.com 发出其中一份文件,发出邮件,windows上附件xxx.html可打开
原因分析:
由于发送单个文件是成功的,一直纠结在uuencode后的文件在windows和mac上的区别,没有怀疑uuencode命令的使用方式;
实际是uuencode使用错误,当仅有1个参数时,默认为outputfile,所以“uuencode xxx.tar.gz”时将标准输入编码到uuencode xxx.tar.gz。
若直接执行uuencode xxx.tar.gz | mail -s "subject" xxx@xxx.com,shell中会一直等待标准输入。
具体使用如下:uuencode命令
uuencode [ -m ] [ SourceFile ] OutputFile
OutputFile | 指定解码文件的名称。通过将 /dev/stdout 指定为 OutputFile,可以将 uuencode 命令的输出指向标准输出。 |
SourceFile | 指定将要转换的二进制文件的名称。缺省值为标准输入。 |
-m | 使用 MIME Base64 算法对输出进行编码。如果没有指定 -m,那么会使用旧的 uuencode 算法 |
解决方法:
uuencode xxx.tar.gz xxx.tar.gz | mail -s "subject" xxx@xxx.com
分析:一切根源来源于不熟悉原理。
uuencode "Unix-to-Unix encoding", binary-to-text encoding 。
不同机器的字符集不一定相同,若邮件直接传递二进制文件,可能导致传输到后无法正确打开,或将二进制文件当作某种特殊命令处理。uuencode就是一种将二进制文件编码为一种通用字符集的方式。具体编码算法wiki中有举例描述。
Original characters | C | a | t | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Original ASCII, decimal | 67 | 97 | 116 | |||||||||||||||||||||
ASCII, binary | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
New decimal values | 16 | 54 | 5 | 52 | ||||||||||||||||||||
+32 | 48 | 86 | 37 | 84 | ||||||||||||||||||||
Uuencoded characters | 0 | V | % | T |
再回到问题场景中的4,找错方向的一步,xxx.tar.gz和xxx.html的区别。
xxx.tar.gz 由tar zcvf xxx.tar.gz DirName命令产生。
tar是打包工具,collecting many files into one archive file(归档,composed of one or more computer files along with metadata);
实际压缩由其中的-z指定gzip(官方文档),gzip xxx.tar(具体算法可参考别人博客)。最终产生的为二进制文件。
xxx.html则在文件起始指明编码方式。
猜测是由于二进制文件传递后,某些元信息被修改,无法正常打开。
但仍存在以下疑问未理解,1. 直接运行shell命令并没有损坏tar.gz
uuencode test.html //uuencode后等待输入,ctrl + C 结束进程 vi test.html //可打开 uuencode test.tar.gz //uuencode后等待输入,ctrl + C 结束进程
tar zxvf test.tar.gz //可正常解压
uuencode test.tar.gz | mail -s "test" xxx@xxx.com //一直等待输入, | shell 管道,前一个命令的输出作为下一条命令的输入
2.jenkins job对于需要等待输入的 shell命令会如何处理,输入流塞的是什么内容呢,怎么就 tar.gz 无法打开了呢?(求指教 未完成知识点 "管道" "jenkins")
jenkins中执行: uuencode reports-$(date +%Y%m%d).tar.gz reports-$(date +%Y%m%d).tar.gz | mail -s "Android Original ScanReports" xxx@xxx.com
执行日志显示是
......
+ mail -s 'Aandroid Original ScanReports' xxx@xxx.com ++ date +%Y%m%d + uuencode reports-20170502.tar.gz
Finished: SUCCESS
补充:tar炸弹,在本机解压tar.gz,一直以为执行失败,实则覆盖了已有目录,应避免使用绝对路径解压。
攻击者利用绝对路径,或者“tar -cf bomb.tar *”的方式创建的tar文件,然后诱骗受害者在根目录下解压,或者使用绝对路径解压。可能使受害系统上已有的文件被覆盖掉,或者导致当前工作目录凌乱不堪,这就是所谓的“tar炸弹”。因此,要养成良好的解压习惯:
- 解压前用“t”查看tar的文件内容。
- 拒绝使用绝对路径。
- 新建一个临时子目录,然后在这个子目录里解压。