So führen Sie einen Befehl nach dem Upgrade von apt-get aus

7

Kürzlich bin ich auf das nette checkrestartTool gestoßen, das prüft, ob laufende Prozesse eine veraltete Version einer kürzlich aktualisierten Bibliothek verwenden und einen Neustart benötigen, um sie mit der aktualisierten Bibliothek zu laden. Im Moment muss ich checkrestartjedes Mal von Hand anrufen, wenn ich apt-get upgradeoder verwendet habe aptitude upgrade.

Gibt es eine Möglichkeit, einen solchen Befehl nach einigen Paketen automatisch aufzurufen apt-getoder aptitudeaktualisiert zu haben? Bonuspunkte, wenn die Lösung auch funktioniert unattended-upgrades.

Benedikt Bauer
quelle

Antworten:

8

Nach einigen weiteren Recherchen stellte sich heraus, was ich bereits vermutet hatte: aptselbst bietet eine Reihe von Hooks zum Aufrufen von Befehlen bei bestimmten Ereignissen, die von vielen Tools verwendet werden, aber kaum dokumentiert zu sein scheinen.

Das Aufrufen eines Tools wie checkrestartnach einem Paket-Upgrade ist ziemlich einfach. Man muss nur die folgende Codezeile entweder in /etc/apt/apt.confoder eine der vorhandenen Dateien oder eine neue Datei in einfügen /etc/apt/apt.conf.d/:

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

Dies wird checkrestartjedes Mal dpkgaufgerufen, wenn es von apt(und natürlich jedem anderen Tool, auf das Sie sich verlassen apt, wie z. B. aptitude) aufgerufen und erfolgreich beendet wurde.

Benedikt Bauer
quelle
4
Beachten Sie, dass bei jeder Ausführung apthäufig dpkgmehrmals aufgerufen wird.
4
Wo hast du gefunden DPkg::Post-Invoke-Success? Im Quellcode kann ich nur finden DPkg::Post-Invoke, APT::Update::Post-Invokeund APT::Update::Post-Invoke-Success.
Gilles 'SO - hör auf böse zu sein'
4

Es gibt verschiedene Möglichkeiten, dies zu tun.

Verwenden eines Skripts

Eine schnelle und schmutzige Lösung wäre, ein Skript mit dem Namen apt-getoder zu schreiben aptitudeund das eigentliche Programm als solches aufzurufen:

#!/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

Machen Sie das Skript ausführbar : chmod +x apt-get. Möglicherweise möchten Sie auch das Skript im Besitz von root erstellen : chown root apt-get; chgrp root apt-get. Achten Sie darauf, das setuid-Bit in Ihrem Skript nicht zu setzen. Wenn ein Angreifer Schreibrechte dafür erhält, kann er es schnell und einfach ändern, um ihm eine Root-Shell zu geben.

Diese Methode würde natürlich erfordern, dass Sie die eigentliche Binärdatei an einen anderen Ort verschieben und Ihr Shell-Skript an einen Ort in Ihrem Pfad verschieben. Der richtige Ort, um Benutzerskripte zu platzieren, ist /usr/local/bin. In dieser Situation sollten Sie Ihr Skript jedoch an der Stelle ablegen, an der sich die eigentliche Binärdatei befand, bevor Sie es verschoben haben, um die Organisation zu gewährleisten.

Das Ersetzen der Binärdatei durch ein Skript auf diese Weise ist ziemlich aufdringlich und betrifft alle Benutzer auf dem Computer. Alternativ können Sie Ihr Skript auch so nennen apt-get-crund daran denken, dieses Skript anstelle von aufzurufen apt-get. Sie können auch eine Shell-Funktion schreiben.

Verwenden einer Shell-Funktion

Mit einer Shell-Funktion können Sie den Befehlsnamen beibehalten, apt-getohne sich in Binärdateien bewegen zu müssen.

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
}

Setzen Sie diese Funktion irgendwo in der Shell - Konfiguration ( ~/.bashrc, ~/.zshrcusw.)

Diese Methode ist im Allgemeinen viel weniger aufdringlich als die Skriptmethode. Außerdem müssen Sie sich nicht in den Binärdateien bewegen, was im Allgemeinen nur der Root-Benutzer tun kann.

Auf der anderen Seite ist die Shell-Funktionsmethode zwischen Shells nicht immer sehr portabel und passt nicht so gut zu grafischen Oberflächen wie Launcher-Balken wie die Skriptmethode (Sie können ein Skript fast immer wie eine ausführbare Binärdatei behandeln. )


quelle
2
Sie müssen $@richtig zitieren , Ihre Argumente werden entstellt.
Chris Down
Da Sie es bereits in der ersten Version Ihrer Antwort eingeführt haben, handelt es sich um eine Art Problemumgehung. Meine Hoffnung war, dass apt oder aptitude bereits einen eigenen Mechanismus oder Haken zur Ausführung solcher Befehle bietet. Ich hoffe, Sie nehmen es nicht falsch, wenn ich einige Tage warte, wenn es eine andere Antwort gibt.
Benedikt Bauer