Compression

如何提取“X1 檔案”?

  • April 19, 2018

我有一個沒有文件副檔名的奇怪文件,據說它是 git 儲存庫內容的存檔。根據file (1),這是一個“X1 檔案”:

$ file my_git_repo 
my_git_repo: X1 archive data

但是,我想不出任何方法來提取或查看此文件的內容。我試過了:

  • tar
  • unzip
  • bzip2
  • xz
  • lzip
  • lzma
  • lzop
  • gzip
  • uncompress

但是這些工具都不能辨識我的文件。我也嘗試在WikipediaArch Wiki上尋求幫助,但這些頁面都沒有提到“X1”。我還嘗試了“X1 存檔”或“提取 X1 文件”的Google搜尋變體,但主要是我得到了名為“X1”的產品或服務的結果,似乎與名為“X1”的文件格式無關。最後,我嘗試使用 之類的工具查看該文件strings,該文件確實包含我希望在我的 git 儲存庫中的文件的文件名以及該儲存庫中文件的片段,所以我不認為這個文件是只是隨機數據或類似的東西。

我有什麼樣的文件,如何查看其內容?

好的,這個我想通了。

我注意到文件的第一行包含一個奇怪的字元串:

% head -n 1 my_git_repo | strings
X11 forwarding request failed on channel 0

那根弦似曾相識。我的預設 SSH 配置嘗試轉發 X11 連接,但是當它失敗時——例如通過 ssh 對 git 伺服器執行 git 操作時——該字元串會列印在 stderr 上:

$ git archive --remote=ssh://git@my.git.server/my_git_repo.git master > my_git_repo.tar
X11 forwarding request failed on channel 0

我猜測創建 git 存檔的庫同時擷取了 stdout 和 stderr 而不僅僅是 stdout,這將解釋該文件的第一行是如何形成的。

因此,如果我刪除該文件的第一行,我會得到更合理的輸出file (1)

$ tail -n +2 my_git_repo > my_git_repo.edit
$ file my_git_repo.edit 
my_git_repo.edit: Zip archive data, at least v1.0 to extract

如果我將文件重命名為my_git_repo.zip並嘗試使用 來查看文件的內容unzip -l,我發現它包含我期望的文件,並且當我使用 提取檔案時unzip,我得到了我想要的文件。

我不確定從哪裡libmagic得到這個文件是“X1 存檔”的想法,但我猜它與“X1”是損壞文件的前兩個字元有關。

引用自:https://unix.stackexchange.com/questions/438803