실행 전 쉘 스크립트 패치

실행 전 쉘 스크립트 패치

나는 쉘 스크립트( arch-chrootArch Linux에서 )를 가지고 있습니다.arch-install-scripts패키지), 시작 시 마지막 줄에서 시작됩니다 chroot.chroot

SHELL=/bin/sh unshare --fork --pid chroot "$chrootdir" "$@"

내 사용 사례에서는 정확히 동일한 스크립트를 사용하고 마지막 줄에 "패치"를 추가하고 싶습니다.

SHELL=/bin/bash chroot "$chrootdir" "$@"

이를 수행하는 가장 좋은 방법은 무엇입니까? 중요한 경우 arch-chroot루트 권한으로 스크립트를 실행해야 합니다. 이제 패치된 스크립트 사본만 남았습니다. 원본 스크립트가 업데이트되면 패치된 버전이 "구식"이 됩니다. 필요하다면 임시 위치에 복사해서 패치할 수도 있겠지만 그게 더 나을지는 잘 모르겠습니다.

스크립트를 일시적으로 패치할 수 있는 방법이 있나요?

원본 스크립트는 해당 스크립트가 속한 패키지가 업데이트될 때만 변경됩니다. 내 목표는 원본 스크립트를 변경하지 않고 유지하면서 원본 스크립트의 최신 버전에 대한 패치 버전을 호출할 수 있는 방법을 갖는 것입니다.

답변1

간단하고 조잡한 해결 방법은 원본 파일의 수정된 복사본으로 임시 파일을 생성한 arch-chroot다음 tmpfile을 실행하는 작은 스크립트를 작성하는 것입니다. 예를 들어:

#!/bin/sh
scriptfile=$(mktemp /tmp/tempscript.XXXXX)
sed 's#SHELL=.*#SHELL=/bin/bash chroot "$chrootdir" "$@"#' /usr/bin/arch-chroot > $scriptfile

$scriptfile "$@"

단 하나의 행만 문자열과 일치한다고 가정합니다. 행이 더 많거나 행이 없으면 SHELL=자동 으로 실패합니다./usr/bin/arch-chroot

답변2

사용 중인 스크립트가 운영 체제 배포와 함께 제공되는 경우 업데이트될 가능성이 매우 높습니다. 원본 스크립트의 마지막 줄을 제거하고 사용자 정의 줄을 끝에 추가하는 래퍼 스크립트를 이 원본 스크립트 주위에 작성하는 것이 좋습니다. 그런 다음 새로 생성된 복사본을 호출합니다. 나는 이것이 가장 쉬운 방법이라고 생각합니다.

mv original_script original_script.orig  # make a backup copy of original
sed -i '$ d' original_script.orig > original_script  # remove last line
echo 'SHELL=/bin/bash chroot "$chrootdir" "$@"' >> original_script # add your line to the end
original_script # run the script
mv original_script.orig original_script  #restore the original in place

답변3

이 목적을 위해 자신만의 수정 패키지를 만드십시오. 최신 상태로 유지하도록 주의하고 자동 업데이트를 피하기 위해 배포판 관련 트릭을 사용할 수도 있습니다.

(아치에 대한 지식도 없이) 당신이 제안한 변경 이유를 이해하지 못하지만, 언뜻 보면 해야 할 일처럼 보입니다.아니요보안상의 이유로 또는 귀하의 사용 사례가 어떤 방식으로든 이 기능을 활성화하기 위한 업스트림 패치를 보장할 만큼 관련성이 있을 수 있습니다. 두 경우 모두 배포판의 버그 보고/개선 요청 시스템을 통해 지식이 풍부한 사람과 논의하는 것이 좋습니다.

또는 여기에서 달성하고 싶은 것이 무엇인지 논의하세요(이 질문과 같이 이를 달성하는 방법보다는).

관련 정보