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的文件內容。
  • 拒絕使用絕對路徑。
  • 新建一個臨時子目錄,然后在這個子目錄里解壓。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM