Làm thế nào để giải nén và đóng gói tệp pkg?


99

Tôi có một tệp pkg được tạo bởi Install Maker cho Mac. Tôi muốn thay thế một tệp trong pkg. Nhưng tôi phải làm điều này trong hệ thống Linux, vì đây là một phần của quá trình tải xuống. Khi người dùng bắt đầu tải xuống máy chủ tệp phải thay thế một tệp trong pkg. Tôi có một giải pháp làm thế nào để giải nén pkg và thay thế một tệp nhưng tôi không biết cách đóng gói lại thành pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


(Dành cho khách truy cập trong tương lai) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 có thể cung cấp cho bạn thông tin chi tiết
james_womack

MacOS dường như đi kèm với lệnh xar.
MikeP

Câu trả lời:


186

Các gói chỉ là các kho lưu trữ .xar với một phần mở rộng khác và một hệ thống phân cấp tệp được chỉ định. Thật không may, một phần của hệ thống phân cấp tệp đó là kho lưu trữ cpio.gz của các tệp có thể cài đặt thực tế và thường đó là những gì bạn muốn chỉnh sửa. Và cũng có một tệp Bom bao gồm thông tin về các tệp bên trong kho lưu trữ cpio đó và tệp PackageInfo bao gồm thông tin tóm tắt.

Nếu bạn thực sự chỉ cần chỉnh sửa một trong các tệp thông tin, điều đó thật đơn giản:

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

Nhưng nếu bạn cần chỉnh sửa các tệp có thể cài đặt:

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

Tôi tin rằng bạn có thể tải mkbom (và lsbom) cho hầu hết các bản phân phối linux. (Nếu bạn có thể nhận được ditto, điều đó sẽ khiến mọi thứ trở nên dễ dàng hơn, nhưng tôi không chắc liệu nó có gần như phổ biến hay không.)


Đúng. Tôi đã thử phương pháp này trước đây (chỉ giải nén / gói mà không thay đổi bất kỳ tệp nào), nhưng sau khi cài đặt pkg này thì không có gì xảy ra. Trong bảng điều khiển, tôi nhận được thông báo này: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Không có tệp hoặc thư mục nào như vậy. Tôi đã điều tra rằng tệp Payload cũ có /./ Project1.app / ... và trọng tải mới có /Project1.app / ... bên trong.
dream2work

Chà, phần cuối cùng rất dễ dàng. Tôi không biết nó có tạo ra sự khác biệt không, nhưng nó có thể (có thể do Bờm và Trọng tải không hợp nhau?). Chỉ cần sử dụng ./Foo.app thay vì Foo.app trong lệnh find | cpio | gzip. Tôi sẽ chỉnh sửa câu trả lời.
abarnert

4
@abarnert: thay vì cat Payload | gunzip -dc |cpio -ibạn có thể đơn giản sử dụngtar xzvf Payload
ccpizza,

Tôi nhận được một lỗi chạy cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Tôi đang cố mở BSD.pkgtừ gói cài đặt OS X Yosemite.
shrx

1
Tôi không có xar vì vậy tôi đã thử: 7z x <file>.pkgvà nó hoạt động.

21

Đây là một tập lệnh bash được lấy cảm hứng từ câu trả lời của abarnert sẽ giải nén một gói có tên MyPackage.pkgvào một thư mục con có tên MyPackage_pkgvà sau đó mở thư mục trong Finder.

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

Sử dụng:

    pkg-upack.sh MyPackage.pkg

Cảnh báo: Điều này sẽ không hoạt động trong mọi trường hợp và sẽ không thành công với một số tệp nhất định, chẳng hạn như PKG bên trong trình cài đặt hệ thống OSX. Nếu bạn muốn xem bên trong tệp pkg và xem những gì bên trong, bạn có thể thử SuspiciousPackage (ứng dụng miễn phí) và nếu bạn cần thêm các tùy chọn như giải nén có chọn lọc các tệp cụ thể, thì hãy xem Pacifist (nagware).


2
Sử dụng pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i cho tài liệu lưu trữ mới (lấy từ đây: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor

3

Ngoài những gì @abarnert đã nói, hôm nay tôi phải phát hiện ra rằng cpiotiện ích mặc định trên Mountain Lion sử dụng một định dạng lưu trữ khác theo mặc định (không chắc chắn là gì), ngay cả khi trang người dùng nói rằng nó sẽ sử dụng định dạng cpio / odc cũ. Vì vậy, nếu bất kỳ ai tình cờ gặp cpio read error: bad file formatthông báo trong khi cố gắng cài đặt các gói bị thao túng của họ, hãy đảm bảo bao gồm định dạng trong bước đóng gói lại:

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

3

@shrx Tôi đã giải nén thành công BSD.pkg (một phần của trình cài đặt Yosemite) bằng cách sử dụng lệnh "pbzx".

pbzx <pkg> | cpio -idmu

Lệnh "pbzx" có thể được tải xuống từ liên kết sau:


2

Bạn có thể muốn nhìn vào ngã ba của tôi pbzxở đây: https://github.com/NiklasRosenstein/pbzx

Nó cho phép bạn phát trực tuyến các tệp pbzx không được bao bọc trong kho lưu trữ XAR. Tôi đã gặp phải điều này với Hình ảnh đĩa công cụ dòng lệnh XCode gần đây (ví dụ: 10.12 XCode 8).

pbzx -n Payload | cpio -i
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.