Jak rozpakować i spakować plik pkg?

99

Mam plik pkg utworzony przez Install Maker for Mac. Chcę zamienić jeden plik w pkg. Ale muszę to zrobić w systemie Linux, ponieważ jest to część procesu pobierania. Kiedy użytkownik zaczyna pobierać pliki, serwer musi zamienić jeden plik w pkg. Mam rozwiązanie, jak rozpakować pakiet i zamienić plik, ale nie wiem, jak ponownie spakować do pkg. http://emresaglam.com/blog/1035 http://ilostmynotes.blogspot.com/2012/06/mac-os-x-pkg-bom-files-package.html

dream2work
źródło
(Dla przyszłych odwiedzających) gabrielrinaldi.me/how-to-install-jdk-7-on-yosemite-10-10 może dać ci wgląd
james_womack
Wygląda na to, że MacOS zawiera polecenie xar.
MikeP

Odpowiedzi:

187

Pakiety to po prostu archiwa .xar z innym rozszerzeniem i określoną hierarchią plików. Niestety, częścią tej hierarchii plików jest archiwum cpio.gz zawierające aktualne instalacje i zwykle to właśnie chcesz edytować. Jest też plik Bom zawierający informacje o plikach w tym archiwum cpio oraz plik PackageInfo, który zawiera 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 do zainstalowania:

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 możesz dostać ditto, to jeszcze bardziej ułatwi sprawę, ale nie jestem pewien, czy jest to prawie tak wszechobecne).

abarnert
źródło
Tak. Próbowałem już tej metody (tylko rozpakuj / spakuj bez zmiany plików), ale po zainstalowaniu tego pakietu nic się nie dzieje. W konsoli otrzymałem wiadomość: posix_spawn ("/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...): Nie ma takiego pliku lub katalogu. Zbadałem, że stary plik ładunku ma /./ Project1.app / ... a nowy ładunek ma /Project1.app / ... w środku.
dream2work
Cóż, ta ostatnia część jest łatwa. Nie wiem, czy to robi różnicę, ale może (może dlatego, że Bom i ładunek nie pasują?). Po prostu użyj ./Foo.app zamiast Foo.app w poleceniu find | cpio | gzip. Zmienię odpowiedź.
abarnert
4
@abarnert: zamiast cat Payload | gunzip -dc |cpio -iciebie możesz po prostu użyćtar xzvf Payload
ccpizza
Otrzymuję uruchomiony błędzie cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. Próbuję otworzyć BSD.pkgz pakietu instalacyjnego OS X Yosemite.
shrx
1
Nie miałem XAR, więc spróbowałem: 7z x <file>.pkgi zadziałało.
21

Oto skrypt bash zainspirowany odpowiedzią abarnerta, który rozpakuje pakiet o nazwie MyPackage.pkgdo podfolderu o nazwie, MyPackage_pkga następnie otworzy folder w Finderze.

    #!/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 zakończy się niepowodzeniem z niektórymi plikami, np. PKG w instalatorze systemu OSX. Jeśli chcesz zajrzeć wewnątrz pliku pkg i zobaczyć co jest w środku, można spróbować SuspiciousPackage (bezpłatną aplikację), a jeśli potrzebujesz więcej opcji, takich jak selektywne rozpakowaniu konkretnych plików, a następnie przyjrzeć się pacyfistą (nagware).

ccpizza
źródło
2
Użyj pbzx -n macOSUpd10.12.1.pkg / Payload | cpio -i dla nowszych archiwów (pobrane stąd: stackoverflow.com/a/41598227/5688277 )
Adrian O'Connor
3

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

find ./Foo.app | cpio -o --format odc | gzip -c > Payload
Malte Rohde
źródło
3

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

pbzx <pkg> | cpio -idmu

Polecenie „pbzx” można pobrać z następującego łącza:

h6ah4i
źródło
2

Możesz zajrzeć do mojego rozwidlenia pbzxtutaj: https://github.com/NiklasRosenstein/pbzx

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

pbzx -n Payload | cpio -i
Niklas R
źródło