問題場景:測試環境需要將測試報告打包發送出來,構建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的文件內容。
- 拒絕使用絕對路徑。
- 新建一個臨時子目錄,然后在這個子目錄里解壓。
