記錄一個有關 curl 和 tar 的小問題
這是我今天在工作時遇到的問題,先還原下問題
今天在解壓一個壓縮包時解壓失敗,有以下提示
$ curl -O https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz $ tar -zxvf canal.deployer-1.1.3.tar.gz gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now 複製程式碼
這裡首先提示,造成這個問題的原因以及解決方案很簡單,對你很有可能沒有借鑑意義。不過尋找原因的過程以及從這個問題上學到的東西還是有點意思的。
本文連結 blog.xiange.tech/post/a-prob…
StackOverflow
作為程式設計師的兩大利器之一,第一步跟蹤到了 StackOverflow
,查詢到了這個問題,問題描述一模一樣
How to extract filename.tar.gz file
首先,先使用 file
檢視下檔案的型別
$ file canal.deployer-1.1.3.tar.gz canal.deployer-1.1.3.tar.gz: HTML document, ASCII text, with very long lines, with no line terminators 複製程式碼
如果沒有使用 gzip
壓縮,那需要使用 tar
解壓的時候,去掉 -z
引數。
無果。
這裡安利一個工具, explainshell
可以以圖文視覺化 shell 命令各個引數的意義,當引數較多,命令較長時,非常試用,強烈推薦。
不過,我從 file
命令中意識到有可能檔案有問題,因為它的輸出是 HTML document
,且是純文字型別。
從源頭出發
當我意識到檔案有問題時,覺得應該從檔案源找出問題。檔案是通過 curl
下載而來,我添加了 -v
引數用來檢視 http 詳細的報文。
$ curl -Ov https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz ... > User-Agent: curl/7.29.0 > Host: github.com > Accept: */* > < HTTP/1.1 302 Found < Date: Fri, 12 Apr 2019 13:20:31 GMT < Content-Type: text/html; charset=utf-8 ... 複製程式碼
定位到問題了,地址做了重定向,但是 curl
並沒有跟蹤重定向後的 Location
。因此,剛才的壓縮包其實是關於重定向的響應,所以檔案型別是 HTML document
。
為了驗證一下,我查看了壓縮包的內容。
$ cat canal.deployer-1.1.3.tar.gz <html><body>You are being <a href="https://github-production-release-asset-2e65be.s3.amazonaws.com/7587038/6df81900-56c6-11e9-8140-7d9ae25b1ca8?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190412%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190412T132310Z&X-Amz-Expires=300&X-Amz-Signature=3cb0943449b8d86bf6292b399409fddfa9fbef1c646c20910f10ae7fe836e53e&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dcanal.deployer-1.1.3.tar.gz&response-content-type=application%2Foctet-stream">redirected</a>.</body></html> 複製程式碼
果然如此,我突然意識到在剛開始 curl
成功後根據 Received
的大小就可以定位到問題了。不過我一般自動 curl
的輸出,而且當下載東西的時候,我一般就切視窗了...
# 接收到的檔案只有 616 個位元組大小 $ curl -O https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz % Total% Received % XferdAverage SpeedTimeTimeTimeCurrent DloadUploadTotalSpentLeftSpeed 1006160616004440 --:--:--0:00:01 --:--:--444 複製程式碼
找到了問題就很好解決了。
問題解決
找到 curl
追蹤重定向的引數,重新下載問題解決。
# 找到引數為 -L $ curl --help | grep -e follow -e redirect -L, --locationFollow redirects (H) --max-redirs NUMMaximum number of redirects allowed (H) --post301Do not switch to GET after following a 301 redirect (H) --post302Do not switch to GET after following a 302 redirect (H) --post303Do not switch to GET after following a 303 redirect (H) --proto-redir PROTOCOLSEnable/disable specified protocols on redirect --stderr FILEWhere to redirect stderr. - means stdout $ curl -OL https://github.com/alibaba/canal/releases/download/canal-1.1.3/canal.deployer-1.1.3.tar.gz 複製程式碼
反思
如果仔細一點,剛開始 curl
時發現 Received
的大小,估計幾秒鐘就能解決問題。不過總的來說還是略有收穫。
-
explainshell
解析複雜的 linux 命令 -
curl -OL <url>
追蹤重定向並下載到本地 -
file <file>
檢視檔案型別 - 使用
grep
匹配多個關鍵字grep "PATTERN1\|PATTERN2" FILE grep -E "PATTERN1|PATTERN2" FILE grep -e PATTERN1 -e PATTERN2 FILE egrep "PATTERN1|PATTERN2" FILE
關注公眾號 山月行 ,記錄我的技術成長,歡迎交流
