Pytanie Jak rozpakować i spakować plik pkg?


Mam plik pkg stworzony przez Install Maker for Mac. Chcę zastąpić jeden plik w pkg. Ale muszę to zrobić w systemie Linux, ponieważ jest to część procesu pobierania. Gdy użytkownik zaczyna pobierać serwer plików, musi zastąpić jeden plik w pkg. Mam rozwiązanie jak rozpakować pkg i zastąpić plik, ale nie wiem jak spakować pakiet ponownie do 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


pochodzenie


(Dla przyszłych odwiedzających) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 może dać ci wgląd - james_womack
MacOS wydaje się pochodzić z polecenia xar. - MikeP


Odpowiedzi:


Pakiety to tylko archiwa .xar z innym rozszerzeniem i określoną hierarchią plików. Niestety, częścią tej hierarchii plików jest archiwum cpio.gz rzeczywistych instalacji i zwykle to właśnie chcemy edytować. Istnieje również plik Bom zawierający informacje o plikach znajdujących się w archiwum cpio oraz plik PackageInfo zawierający informacje podsumowujące.

Jeśli naprawdę potrzebujesz tylko edytować jeden z plików informacyjnych, to proste:

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

Ale jeśli chcesz edytować pliki instalacyjne:

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

Wierzę, że można uzyskać mkbom (i lsbom) dla większości dystrybucji Linuksa. (Jeśli uda Ci się uzyskać to samo, to jeszcze łatwiejsze, ale nie jestem pewien, czy jest to prawie tak wszechobecne).


147
2017-07-02 19:23



Tak. Próbowałem tej metody wcześniej (tylko rozpakować / pack bez zmiany jakichkolwiek plików), ale po zainstalowaniu tego pkg nic się nie stało. W konsoli dostałem tę wiadomość: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Brak takiego pliku lub katalogu. Sprawdziłem, że stary plik ładunku ma /./ Project1.app / ... i nowy ładunek ma /Project1.app / ... wewnątrz. - dream2work
Cóż, ta ostatnia część jest łatwa. Nie wiem, czy to robi różnicę, ale może (może dlatego, że Bom i ładunek się nie zgadzają?). Po prostu użyj ./Foo.app zamiast Foo.app w poleceniu find | cpio | gzip. Będę edytować odpowiedź. - abarnert
@abarnert: zamiast cat Payload | gunzip -dc |cpio -i możesz po prostu użyć tar xzvf Payload - ccpizza
Wystąpił błąd podczas uruchamiania cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format;0 blocks. Próbuję otworzyć BSD.pkg z pakietu instalacyjnego OS X Yosemite. - shrx
@ ccpizza Twoja sugestia również nie działa, otrzymuję: tar: Unrecognized archive format;tar: Error exit delayed from previous errors.. - shrx


Zainspirowany odpowiedzią od abarnert, Zrobiłem skrypt bash, który rozpakuje pakiet o nazwie MyPackage.pkg do podfolderu o nazwie MyPackage_pkg a następnie otwórz folder w Finderze. Usuń ostatni wiersz, jeśli nie chcesz kroku Findera.

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

Stosowanie:

    pkg-upack.sh MyPackage.pkg

Ostrzeżenie: to nie zadziała we wszystkich przypadkach i zawiedzie w przypadku niektórych plików, np. PKG wewnątrz instalatora systemu OSX. Jeśli chcesz tylko zajrzeć do pliku pkg i zobaczyć, co jest w środku, możesz spróbować PodejrzanyPakiet (bezpłatna aplikacja), a jeśli chcesz zrobić poważne rozpakowanie, w tym wyodrębnianie określonych plików, to spójrz na Pacyfista (nagware).


17
2018-05-30 09:00



tar xvf Payload świetnie spisał się na Yosemite - cde
tar: Nierozpoznany format archiwum - malhal
Użyj pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i dla nowszych archiwów (zaczerpnięte stąd: stackoverflow.com/a/41598227/5688277) - Adrian O'Connor


Oprócz tego, co powiedział @abarnert, dzisiaj musiałem dowiedzieć się, że domyślnie cpio narzędzie na Mountain Lion używa domyślnie innego formatu archiwum (nie wiem, który), nawet jeśli strona man mówi, że używa starego formatu cpio / odc. Tak więc, jeśli ktoś natknie się na cpio read error: bad file format wiadomość podczas próby zainstalowania swoich zmanipulowanych pakietów, pamiętaj, aby uwzględnić ten format w kroku ponownego pakowania:

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

3
2018-02-27 10:02





@shrx Udało mi się rozpakować BSD.pkg (część instalatora Yosemite) za pomocą komendy "pbzx".

pbzx <pkg> | cpio -idmu

Komendę "pbzx" można pobrać z poniższego linku:


2
2018-01-09 15:39





Możesz zajrzeć do mojego widelca pbzx tutaj: https://github.com/NiklasRosenstein/pbzx

Pozwala na strumieniowe przesyłanie plików pbzx, które nie są zapakowane w archiwum XAR. Doświadczyłem tego z najnowszymi obrazami dyskowymi narzędzi wiersza poleceń XCode (np. 10.12 XCode 8).

pbzx -n Payload | cpio -i

2
2018-01-11 18:01