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 Cat
Original ASCII, decimal 6797116
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 1654552
+32 48863784
Uuencoded characters 0V%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的文件内容。
  • 拒绝使用绝对路径。
  • 新建一个临时子目录,然后在这个子目录里解压。

 

posted @ 2017-05-03 09:28  QA小虾  阅读(2134)  评论(0编辑  收藏  举报