업그레이드 후 apt-get 명령을 실행하는 방법

업그레이드 후 apt-get 명령을 실행하는 방법

최근에 좋은 사람을 만났어요checkrestart실행 중인 프로세스가 최근 업데이트된 라이브러리의 오래된 버전을 사용하고 있는지 확인하고 업데이트된 라이브러리로 로드하려면 다시 시작해야 하는지 확인하는 도구입니다. 현재는 or 를 checkrestart사용할 때마다 수동으로 호출해야 합니다 .apt-get upgradeaptitude upgrade

apt-get특정 패키지를 업그레이드한 후 이러한 명령을 자동으로 호출하는 방법이 있습니까 ? aptitude솔루션이 적용되는 경우 보너스 포인트가 제공됩니다 unattended-upgrades.

답변1

좀 더 검색한 후에 나는 이미 의심했던 것을 발견했습니다. apt그것은 많은 도구에서 사용되지만 거의 문서화되지 않은 것처럼 보이는 특정 이벤트에 대해 명령을 호출하는 후크 세트를 자체적으로 제공합니다.

checkrestart패키지 업그레이드 후 도구를 호출하는 것은 매우 간단합니다. 다음 코드 줄을 /etc/apt/apt.conf기존 파일 중 하나나 새 파일 에 넣으세요 /etc/apt/apt.conf.d/.

DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};

checkrestartdpkg이 함수는 호출될 때마다 호출되며 apt(물론 에 의존하는 다른 도구도 apt포함 aptitude) 성공적으로 완료됩니다.

답변2

이를 수행하는 방법에는 여러 가지가 있습니다.

스크립트 사용

빠르고 더러운 해결책은 apt-getor라는 스크립트를 작성 aptitude하고 다음과 같이 실제 프로그램을 호출하도록 하는 것입니다.

#!/bin/bash
# filename: apt-get

# '$@' is all of the arguments passed to the script
/usr/bin/apt-get-bin "$@"
# or /usr/bin/aptitude-bin "$@"

if [[ $1 == *upgrade* ]] ; then
    checkrestart
fi

스크립트를 실행 가능하게 만듭니다. chmod +x apt-get. 또한 루트가 소유하는 스크립트를 만들 수도 있습니다 chown root apt-get; chgrp root apt-get. 스크립트에 setuid 비트를 설정하지 않도록 주의하십시오. 공격자가 스크립트에 대한 쓰기 액세스 권한을 얻으면 스크립트를 빠르고 쉽게 수정하여 루트 셸을 얻을 수 있기 때문입니다.

물론 이 방법을 사용하려면 실제 바이너리를 다른 위치로 이동하고 쉘 스크립트를 경로 어딘가로 이동해야 합니다. 사용자 스크립트를 배치할 올바른 위치는 입니다 /usr/local/bin. 그러나 이 경우 정리된 상태를 유지하려면 바이너리를 이동하기 전에 실제로 있었던 위치에 스크립트를 배치해야 합니다.

이런 방식으로 바이너리를 스크립트로 바꾸는 것은 상당히 방해가 되며 시스템의 모든 사용자에게 영향을 미칩니다. 대안으로 스크립트 이름을 다음과 같이 지정할 수 있습니다 apt-get-cr. 대신 스크립트를 호출하는 것만 기억하세요 apt-get. 쉘 함수를 작성할 수도 있습니다.

쉘 함수 사용

apt-get바이너리를 이동하지 않고 명령 이름을 유지하려면 쉘 기능을 사용하십시오 .

apt-get() {
    # 'command' makes sure this function doesn't call itself.
    # You could also use a direct path the binary as shown above.
    command apt-get "$@"

    if [[ $1 == *upgrade* ]] ; then
        checkrestart
    fi
}

이 기능을 쉘 구성( 등)의 어딘가에 배치 ~/.bashrc하십시오 ~/.zshrc.

이 방법은 일반적으로 스크립팅 방법보다 덜 방해적입니다. 또한 일반적으로 루트 사용자만 가능한 이동 바이너리가 필요하지 않습니다.

단점은 쉘 함수 접근 방식이 쉘 간에 항상 이식성이 뛰어나지는 않으며 본질적으로 스크립트 접근 방식과 같은 그래픽 인터페이스(예: 실행기 표시줄)에서 잘 작동하지 않는다는 것입니다(거의 항상 스크립트를 실행 가능한 바이너리 파일로 취급할 수 있음). .

관련 정보