pkg 파일의 압축을 풀고 압축하는 방법은 무엇입니까?


99

Mac 용 Install Maker에서 만든 pkg 파일이 있습니다. 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 2016-08-26

답변:


186

패키지는 확장자가 다르고 파일 계층이 지정된 .xar 아카이브입니다. 불행히도 그 파일 계층의 일부는 실제 설치 파일의 cpio.gz 아카이브이며 일반적으로 편집하려는 것입니다. 또한 해당 cpio 아카이브 내의 파일에 대한 정보를 포함하는 Bom 파일과 요약 정보가 포함 된 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

대부분의 Linux 배포판에서 mkbom (및 lsbom)을 얻을 수 있다고 생각합니다. (동일하게 얻을 수 있다면 일이 훨씬 더 쉬워 지지만 거의 어디서나 사용할 수 있는지 확실하지 않습니다.)


예. 이전에이 방법을 시도했지만 (파일을 변경하지 않고 압축 풀기 / 압축 만)이 패키지를 설치 한 후에는 아무 일도 일어나지 않았습니다. 콘솔에서 다음 메시지를 받았습니다. posix_spawn ( "/ Library / Application Support / Project1 / Project1.app / Contents / MacOS / Project1", ...) : 해당 파일이나 디렉터리가 없습니다. 이전 페이로드 파일에 /./ Project1.app / ...이 있고 새 페이로드에 /Project1.app / ...이 있음을 조사했습니다.
dream2work

마지막 부분은 쉽습니다. 차이가 나는지는 모르겠지만 아마도 Bom과 Payload가 일치하지 않기 때문일 수 있습니다. find | cpio | gzip 명령에서 Foo.app 대신 ./Foo.app을 사용하십시오. 답을 수정하겠습니다.
abarnert

4
@abarnert : 대신 cat Payload | gunzip -dc |cpio -i단순히 사용할 수 있습니다tar xzvf Payload
ccpizza 2014 년

나는 오류 실행을 얻을 cat Payload | gunzip -dc |cpio -i: gunzip: unknown compression format; 0 blocks. BSD.pkgOS X Yosemite 설치 패키지에서 열려고 합니다.
shrx

1
xar가 없어서 시도해 보았습니다 7z x <file>.pkg.

21

다음은 abarnert의 대답에서 영감을 얻은 bash 스크립트입니다.이 스크립트는 이름이 지정된 MyPackage.pkg하위 폴더에 이름이 지정된 패키지를 풀고 MyPackage_pkgFinder에서 폴더를 엽니 다.

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

용법:

    pkg-upack.sh MyPackage.pkg

경고 : 이것은 모든 경우에 작동하지 않으며 특정 파일 (예 : OSX 시스템 설치 프로그램 내의 PKG)에서 실패합니다. pkg 파일 내부를 들여다보고 내부 내용을 확인하려면 SuspiciousPackage (무료 앱)를 사용해 볼 수 있으며 , 특정 파일을 선택적으로 압축 해제하는 등 더 많은 옵션이 필요한 경우 Pacifist (nagware)를 살펴보세요 .


2
pbzx -n macOSUpd10.12.1.pkg / Payload 사용 | 최신 아카이브 용 cpio -i (여기
Adrian O'Connor

3

@abarnert가 말한 것 외에도, 저는 오늘 cpioMountain Lion 의 기본 유틸리티가 이전 cpio / odc 형식을 사용할 것이라고 명시한 man 페이지에서도 기본마다 다른 아카이브 형식 (어떤 것이 확실하지 않음)을 사용하는지 알아 내야했습니다 . 따라서 cpio read error: bad file format조작 된 패키지를 설치하려고 할 때 메시지를 우연히 발견 하면 재 포장 단계에 해당 형식을 포함해야합니다.

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

3

@shrx "pbzx"명령을 사용하여 BSD.pkg (Yosemite 설치 프로그램의 일부) 압축을 해제했습니다.

pbzx <pkg> | cpio -idmu

"pbzx"명령은 다음 링크에서 다운로드 할 수 있습니다.


2

https://github.com/NiklasRosenstein/pbzxpbzx 에서 내 포크를 살펴볼 수 있습니다 .

XAR 아카이브에 래핑되지 않은 pbzx 파일을 스트리밍 할 수 있습니다. 최근 XCode 명령 줄 도구 디스크 이미지 (예 : 10.12 XCode 8)에서이 문제를 경험했습니다.

pbzx -n Payload | cpio -i
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.