วิธีแกะและแพ็คไฟล์ pkg


99

ฉันมีไฟล์ pkg ที่สร้างโดย Install Maker สำหรับ Mac ฉันต้องการแทนที่หนึ่งไฟล์ใน pkg แต่ฉันต้องทำภายใต้ระบบ Linux เพราะนี่เป็นส่วนหนึ่งของกระบวนการดาวน์โหลด เมื่อผู้ใช้เริ่มดาวน์โหลดไฟล์เซิร์ฟเวอร์ต้องแทนที่หนึ่งไฟล์ใน pkg ฉันมีวิธีแก้ปัญหาในการแกะ pkg และแทนที่ไฟล์ แต่ฉันไม่รู้วิธีแพ็คอีกครั้งเป็น pkg http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


(สำหรับผู้เยี่ยมชมในอนาคต) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10อาจให้ข้อมูลเชิงลึกแก่คุณ
james_womack

MacOS ดูเหมือนจะมาพร้อมกับคำสั่ง xar
MikeP

คำตอบ:


188

แพ็กเกจเป็นเพียงไฟล์เก็บถาวร. xar ที่มีนามสกุลต่างกันและลำดับชั้นไฟล์ที่ระบุ น่าเสียดายที่ส่วนหนึ่งของลำดับชั้นของไฟล์นั้นเป็นไฟล์เก็บถาวร cpio.gz ของไฟล์ที่ติดตั้งจริงและโดยปกตินั่นคือสิ่งที่คุณต้องการแก้ไข นอกจากนี้ยังมีไฟล์ Bom ที่มีข้อมูลเกี่ยวกับไฟล์ภายในไฟล์ cpio ที่เก็บถาวรและไฟล์ PackageInfo ที่มีข้อมูลสรุป

หากคุณต้องการแก้ไขไฟล์ข้อมูลอย่างใดอย่างหนึ่งจริงๆก็ทำได้ง่ายๆ:

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

แต่ถ้าคุณต้องการแก้ไขไฟล์ที่ติดตั้งได้:

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

ฉันเชื่อว่าคุณจะได้รับ mkbom (และ lsbom) สำหรับ linux distros ส่วนใหญ่ (ถ้าคุณสามารถหาสิ่งต่าง ๆ ได้นั่นจะทำให้สิ่งต่างๆง่ายขึ้น แต่ฉันไม่แน่ใจว่ามันเกือบจะพร้อมใช้งานทั่วไปหรือไม่)


ใช่. ฉันได้ลองใช้วิธีนี้มาก่อนแล้ว (เฉพาะแกะ / แพ็คโดยไม่ต้องเปลี่ยนไฟล์ใด ๆ ) แต่หลังจากติดตั้ง pkg นี้ก็ไม่มีอะไรเกิดขึ้น ในคอนโซลฉันได้รับข้อความนี้: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ... ): ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว ฉันตรวจสอบแล้วว่าไฟล์ Payload เก่ามี /./ Project1.app / ... และเพย์โหลดใหม่มี /Project1.app / ... อยู่ข้างใน
dream2work

ส่วนสุดท้ายนั้นง่ายมาก ฉันไม่รู้ว่ามันสร้างความแตกต่างหรือเปล่า แต่มันอาจจะ (อาจเป็นเพราะ Bom กับ Payload ไม่ตรงกัน?) เพียงใช้. / Foo.app แทน Foo.app ในคำสั่ง find | cpio | gzip ฉันจะแก้ไขคำตอบ
abarnert

4
@abarnert: แทนที่จะcat Payload | gunzip -dc |cpio -iใช้tar xzvf Payload
ccpizza

ฉันได้รับข้อผิดพลาดขณะทำงานcat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. ฉันพยายามเปิดBSD.pkgจากแพ็คเกจการติดตั้ง OS X Yosemite
shrx

1
ฉันไม่มี xar ดังนั้นฉันจึงลอง: 7z x <file>.pkgและมันก็ได้ผล

21

นี่คือสคริปต์ทุบตีที่ได้รับแรงบันดาลใจจากคำตอบของ abarnertซึ่งจะคลายแพ็กเกจที่ตั้งชื่อMyPackage.pkgลงในโฟลเดอร์ย่อยที่มีชื่อMyPackage_pkgแล้วเปิดโฟลเดอร์ใน Finder

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

การใช้งาน:

    pkg-upack.sh MyPackage.pkg

คำเตือน: สิ่งนี้จะใช้ไม่ได้ในทุกกรณีและจะล้มเหลวกับไฟล์บางไฟล์เช่น PKG ในโปรแกรมติดตั้งระบบ OSX หากคุณต้องการดูภายในไฟล์ pkg และดูว่ามีอะไรอยู่ข้างในคุณสามารถลองS สงสัยPackage (แอปฟรี) และหากคุณต้องการตัวเลือกเพิ่มเติมเช่นการแยกไฟล์เฉพาะบางไฟล์ให้ดูที่Pacifist (nagware)


2
ใช้ pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i สำหรับไฟล์เก็บถาวรที่ใหม่กว่า (นำมาจากที่นี่: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor

3

นอกเหนือจากสิ่งที่ @abarnert กล่าวแล้ววันนี้ฉันต้องพบว่าcpioยูทิลิตี้เริ่มต้นบน Mountain Lion ใช้รูปแบบไฟล์เก็บถาวรที่แตกต่างกันตามค่าเริ่มต้น (ไม่แน่ใจว่าจะเป็นแบบใด) แม้จะมีหน้าคนระบุว่าจะใช้รูปแบบ cpio / odc แบบเก่า ดังนั้นหากใครสะดุดกับcpio read error: bad file formatข้อความขณะพยายามติดตั้งแพ็กเกจที่จัดการเองอย่าลืมใส่รูปแบบในขั้นตอนการแพ็คใหม่:

find ./Foo.app | cpio -o --format odc | gzip -c > Payload

3

ฉันประสบความสำเร็จในการแกะ BSD.pkg (ส่วนหนึ่งของตัวติดตั้ง Yosemite) โดยใช้คำสั่ง "pbzx"

pbzx <pkg> | cpio -idmu

คำสั่ง "pbzx" สามารถดาวน์โหลดได้จากลิงค์ต่อไปนี้:


2

คุณอาจต้องการดูทางแยกของฉันpbzxที่นี่: https://github.com/NiklasRosenstein/pbzx

ช่วยให้คุณสามารถสตรีมไฟล์ pbzx ที่ไม่ได้รวมอยู่ในไฟล์เก็บถาวร XAR ฉันเคยประสบกับสิ่งนี้กับ XCode Command-Line Tools Disk Images ล่าสุด (เช่น 10.12 XCode 8)

pbzx -n Payload | cpio -i
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.