Bagaimana cara membongkar dan mengemas file pkg?

99

Saya memiliki file pkg yang dibuat oleh Install Maker untuk Mac. Saya ingin mengganti satu file dalam pkg. Tetapi saya harus melakukan ini di sistem Linux, karena ini adalah bagian dari proses pengunduhan. Ketika pengguna mulai mengunduh file server harus mengganti satu file dalam pkg. Saya punya solusi bagaimana membongkar pkg dan mengganti file tetapi saya tidak tahu bagaimana mengemas lagi ke pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
sumber
(Untuk pengunjung mendatang) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 mungkin memberi Anda wawasan
james_womack
MacOS tampaknya dilengkapi dengan perintah xar.
MikeP

Jawaban:

187

Paket hanyalah arsip .xar dengan ekstensi berbeda dan hierarki file yang ditentukan. Sayangnya, bagian dari hierarki file itu adalah arsip cpio.gz dari instalasi yang sebenarnya, dan biasanya itulah yang ingin Anda edit. Dan ada juga file Bom yang menyertakan informasi tentang file di dalam arsip cpio itu, dan file PackageInfo yang menyertakan informasi ringkasan.

Jika Anda benar-benar hanya perlu mengedit salah satu file info, itu sederhana:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
# edit stuff
xar -cf ../Foo-new.pkg *

Tetapi jika Anda perlu mengedit file yang dapat diinstal:

mkdir Foo
cd Foo
xar -xf ../Foo.pkg
cd foo.pkg
cat Payload | gunzip -dc |cpio -i
# edit Foo.app/*
rm Payload
find ./Foo.app | cpio -o | gzip -c > Payload
mkbom Foo.app Bom # or edit Bom
# edit PackageInfo
rm -rf Foo.app
cd ..
xar -cf ../Foo-new.pkg

Saya yakin Anda bisa mendapatkan mkbom (dan lsbom) untuk kebanyakan distro linux. (Jika Anda bisa mendapatkan ditto, itu membuat segalanya lebih mudah, tetapi saya tidak yakin apakah itu hampir tersedia di mana-mana.)

abarnert
sumber
Iya. Saya telah mencoba metode ini sebelumnya (hanya membongkar / mengemas tanpa mengubah file apa pun), tetapi setelah menginstal pkg ini tidak ada yang terjadi. Di konsol saya mendapat pesan ini: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Tidak ada file atau direktori seperti itu. Saya telah menyelidiki bahwa file Payload lama memiliki /./ Project1.app / ... dan muatan baru memiliki /Project1.app / ... di dalamnya.
dream2work
Nah, bagian terakhir itu mudah. Saya tidak tahu apakah itu membuat perbedaan, tetapi mungkin (mungkin karena Bom dan Payload tidak cocok?). Cukup gunakan ./Foo.app sebagai ganti Foo.app di perintah find | cpio | gzip. Saya akan mengedit jawabannya.
abarnert
4
@abarnert: alih-alih cat Payload | gunzip -dc |cpio -iAnda cukup menggunakantar xzvf Payload
ccpizza
Saya mendapatkan berjalan error cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Saya mencoba membuka BSD.pkgdari paket instalasi OS X Yosemite.
Shrx
1
Saya tidak memiliki xar jadi saya mencoba: 7z x <file>.pkgdan berhasil.
21

Berikut adalah skrip bash yang terinspirasi oleh jawaban abarnert yang akan mengekstrak paket bernama MyPackage.pkgke dalam subfolder bernama MyPackage_pkgdan kemudian membuka folder di Finder.

    #!/usr/bin/env bash
    filename="$*"
    dirname="${filename/\./_}"
    pkgutil --expand "$filename" "$dirname"
    cd "$dirname"
    tar xvf Payload
    open .

Pemakaian:

    pkg-upack.sh MyPackage.pkg

Peringatan: Ini tidak akan bekerja di semua kasus, dan akan gagal dengan file tertentu, misalnya PKG di dalam penginstal sistem OSX. Jika Anda ingin mengintip ke dalam file pkg dan melihat apa yang ada di dalamnya, Anda dapat mencoba SuspiciousPackage (aplikasi gratis), dan jika Anda memerlukan lebih banyak opsi seperti membongkar file tertentu secara selektif, lihat Pacifist (nagware).

ccpizza
sumber
2
Gunakan pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i untuk arsip yang lebih baru (diambil dari sini: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

Selain apa yang dikatakan @abarnert, saya hari ini harus mengetahui bahwa cpioutilitas default di Mountain Lion menggunakan format arsip yang berbeda per default (tidak yakin yang mana), bahkan dengan halaman manual yang menyatakan akan menggunakan format cpio / odc lama. Jadi, jika ada yang menemukan cpio read error: bad file formatpesan tersebut saat mencoba menginstal paket yang dimanipulasi, pastikan untuk menyertakan formatnya dalam langkah pengemasan ulang:

find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Malte Rohde
sumber
3

@shrx Saya telah berhasil membongkar BSD.pkg (bagian dari penginstal Yosemite) dengan menggunakan perintah "pbzx".

pbzx <pkg> | cpio -idmu

Perintah "pbzx" dapat diunduh dari tautan berikut:

h6ah4i
sumber
2

Anda mungkin ingin melihat pertigaan saya di pbzxsini: https://github.com/NiklasRosenstein/pbzx

Ini memungkinkan Anda untuk melakukan streaming file pbzx yang tidak dibungkus dalam arsip XAR. Saya telah mengalami ini dengan Gambar Disk Alat Baris Perintah XCode baru-baru ini (mis. 10.12 XCode 8).

pbzx -n Payload | cpio -i
Niklas R
sumber