사전 설치 스크립트에서 deb 패키지 전체 경로를 얻는 방법

사전 설치 스크립트에서 deb 패키지 전체 경로를 얻는 방법

preinstall 스크립트를 사용하여 deb 패키지를 만들었습니다. 설치 후 deb 패키지를 자동으로 백업하고 싶습니다. 그래서 사전 설치/설치 후 스크립트에서 패키지의 전체 경로를 얻고 싶습니다. 해결책이 있나요?

답변1

유지관리자 스크립트( preinstpostinst)는 많은 정보를 얻지만 이를 설치한 패키지 파일의 전체 경로는 얻지 못합니다.언제실행되면 패키지 파일이 더 이상 존재하지 않을 수 있습니다.

바라보다"내부 환경" 섹션man dpkg사용 가능한 정보에 대한 자세한 내용은 스크립트에 제공되는 매개변수를 참조하세요. 관리자 스크립트를 호출할 수 있는 다양한 상황에 대해 알아보려면 다음을 참조하세요.Debian 정책의 유지관리자 스크립트 흐름도 부록preinst;오래된 스크립트 라도 호출할 수 있다는 점에 유의하세요 postinst. 스크립트가 포함된 패키지를 설치할 때만 유용한 것은 아닙니다.

dpkg후크(특히 다음에 의해 트리거되는 후크)를 사용하여 post-invoke원하는 것을 달성 할 수 있습니다 install.

답변2

파일 작성자는 deb사용자가 패키지를 보관하는 방법을 결정할 권한을 가져서는 안 됩니다. 사용하시면 dpkg -i mypkg.deb삭제 mypkg.deb되지 않습니다. 사용자는 패키지를 직접 보관할지 여부를 선택할 수 있습니다.

apt를 통해 패키지를 설치하면 apt패키지가 자동으로 보관됩니다 /var/cache/apt/archives. 사용자는 에서 이 기능을 비활성화할 수 있습니다 apt.conf. 이 제어는 패키지별 기준이 아닌 모든 패키지에 대해 전역적으로 적용됩니다.


추출할 패키지의 이름은 deb인수로 전달되지 않습니다 preinst. 따라서 간단히 다음을 수행할 수 없습니다.

cp "$2" /var/cache/apt/archives/

또한 의 작업 디렉터리 preinst는 입니다 /. 따라서 사용자가 패키지 이름을 바꾸지 않았다고 가정하더라도 여전히 다음을 수행할 수 없습니다.

cp mypkg.deb /var/cache/apt/archives/

내 생각에 당신이 할 수 있는 가장 가까운 일은 이 dpkg-repack도구를 사용하는 것입니다. 이는 표준 도구의 일부가 아니므로 설치가 필요합니다 apt install dpkg-repack. 따라서 이를 사용하는 경우 패키지의 종속성이어야 합니다.

man dpkg-repack설명하다:

dpkg-repack시스템에 설치된 Debian 패키지에서 .deb 파일을 만듭니다. 패키지 압축을 푸는 동안 패키지에 변경 사항이 있는 경우(예: /etcconfigs 파일 수정) 새 패키지는 이러한 변경 사항을 상속합니다. (에서 관리하는 프로필을 포함하여 프로필이 아닌 프로필에 대한 변경을 포함하여 예외가 있습니다 ucf(1).)

이는 설치된 패키지에만 작동 preinst하므로 postinst.

dpkg-repack mypkg
mv mypkg_1.0-1_all.deb /var/cache/apt/archives/

나는 이것을 기껏해야 "휘발성"이라고 표시할 것입니다. 패키지를 출시할 의도가 아닌 이상 이 작업을 수행하지 않는 것이 좋습니다. 자신의 개인 설정을 복원하여 다음 컴퓨터에 적용하고 패키지를 쉽게 보관할 수 있는 방법을 원한다면 괜찮을 것입니다. 하지만 간단한 방법 echo "Don't forget to archive me!"도 효과적일 수 있다는 점을 고려하세요.


위 아이디어에 대한 더 나은 대안은 로컬 apt저장소를 만드는 것입니다. 이 패키지를 해당 저장소에 넣고 로컬 저장소를 sources.listapt install mypkg아닌 에 추가합니다 dpkg -i mypkg.deb. apt그러면 글로벌 정책을 사용하여 를 보관하는 방법을 결정합니다 mypkg.deb.

이 작업의 또 다른 이점은 공유할 수 있는 다른 사용자에게 패키지를 보관하도록 강요하지 않는다는 것입니다.

로컬 저장소를 만드는 방법에는 여러 가지가 있습니다 apt.

  • dpkg-scanpackages:https://help.ubuntu.com/community/Repositories/Personal
  • reprepro: 약간 복잡하지만 공유 저장소를 관리하는 경우, 특히 소스 코드를 포함하고 저장소 서명을 사용하여 콘텐츠에 서명해야 하는 경우 정말 좋습니다.

답변3

반대 투표를 당할 위험이 있지만 수행할 수 있습니다. 스크립트에서 상위 프로세스 정보를 얻으면 preinst패키지 경로를 얻을 수 있습니다. 두 가지 정보가 필요합니다.

  1. 상위 프로세스의 작업 디렉터리
  2. 상위 프로세스의 마지막 매개변수(dpkg/apt는 내부적으로 dpkg-deb를 호출하며 모든 옵션 뒤의 마지막 매개변수는 전체 패키지 이름입니다)

실제로 이는 다음과 같습니다.

CALLING_DIR=$(realpath /proc/$(ps -o ppid:1= $$)/cwd)
DEBIAN_PKG=$(cd "${CALLING_DIR}"; realpath $(xargs -0 -n 1 < /proc/$(ps -o ppid:1= $$)/cmdline | tail -n 1))
echo "${DEBIAN_PKG}"

다른 답변에서 알 수 있듯이 이것은매우 특이한이 정보가 필요합니다. 제가 지금 이 작업을 하고 있다고 생각하는 유일한 이유는 패키지 빌드에 패키지 자체를 포함하는 재배포 가능 구성 요소가 필요한 경우입니다. 이 외에도 후크를 설치하는 것이 좋습니다.

관련 정보