Câu hỏi Làm thế nào để giải nén và đóng gói tập tin pkg?


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 tin trong pkg. Nhưng tôi phải làm điều này dưới hệ thống Linux, bởi 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 bằng 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 tin nhưng tôi không biết làm thế nào đóng gói một lần nữa để pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html


76
2017-07-02 18:06


gốc


(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ác câu trả lời:


Các gói chỉ là các tệp 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à bản lưu trữ cpio.gz của các 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ể nhận được 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 đó làm cho mọi việc trở nên dễ dàng hơn, nhưng tôi không chắc liệu nó gần như có sẵn ở mọi nơi hay không.)


147
2017-07-02 19:23



Vâ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 tin), nhưng sau khi cài đặt này pkg không có gì happend. Trong giao diện đ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 như vậy. Tôi đã điều tra rằng tập tin Tải trọng cũ có /./ Project1.app / ... và tải trọng mới có /Project1.app / ... bên trong. - dream2work
Vâng, phần cuối cùng là dễ dàng. Tôi không biết liệu nó có tạo nên sự khác biệt hay không, nhưng có lẽ (có lẽ vì Bom và Payload không khớp?). 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
@abarnert: thay vì cat Payload | gunzip -dc |cpio -i bạn chỉ có thể sử dụng tar xzvf Payload - ccpizza
Tôi gặp lỗi khi chạy cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format;0 blocks. Tôi đang cố gắng mở BSD.pkg từ gói cài đặt OS X Yosemite. - shrx
@ccpizza Đề xuất của bạn cũng không hoạt động, tôi nhận được: tar: Unrecognized archive format;tar: Error exit delayed from previous errors.. - shrx


Lấy cảm hứng từ câu trả lời từ abarnert, Tôi đã tạo một tập lệnh bash sẽ giải nén gói có tên MyPackage.pkg vào một thư mục con có tên MyPackage_pkg và sau đó mở thư mục trong Trình tìm kiếm. Hủy bỏ dòng cuối cùng nếu bạn không muốn bước 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, ví dụ: PKG bên trong trình cài đặt hệ thống OSX. Nếu bạn chỉ muốn nhìn vào bên trong tệp pkg và xem nội dung bên trong, bạn có thể thử SuspiciousPackage (ứng dụng miễn phí) và nếu bạn muốn thực hiện một số giải nén nghiêm túc, bao gồm trích xuất các tệp cụ thể, thì hãy xem Hòa bình (nagware).


17
2018-05-30 09:00



tar xvf Payload làm việc tuyệt vời trên Yosemite - cde
tar: Định dạng lưu trữ không được công nhận - malhal
Sử dụng pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i cho các bản lưu trữ mới hơn (được lấy từ đây: stackoverflow.com/a/41598227/5688277) - Adrian O'Connor


Ngoài những gì @abarnert đã nói, hôm nay tôi phải tìm ra rằng mặc định cpio Tiện ích trên Mountain Lion sử dụng định dạng lưu trữ khác nhau theo mặc định (không chắc chắn), ngay cả với trang người dùng cho biết nó sẽ sử dụng định dạng cpio / odc cũ. Vì vậy, nếu có ai vấp phải cpio read error: bad file format trong khi cố gắng cài đặt các gói thao tác của mình, hãy chắc chắn 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
2018-02-27 10:02





@shrx Tôi đã thành công để giải nén 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
2018-01-09 15:39





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 truyền các tệp pbzx không được gói trong một kho lưu trữ XAR. Tôi đã trải nghiệm điều này với các 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

2
2018-01-11 18:01