Wie führe ich einen Befehl vor dem Download mit apt-get aus?

8

Wie kann ich einen Befehl ausführen, bevor apt-get mit dem Herunterladen eines Pakets beginnt?

Ich kenne den dpkg-Pre-Invoke-Hook ( haken Sie ein Skript in apt-get ein ), aber das scheint nach dem Download ausgeführt zu werden.

$ apt-get update
Get: 11 http://security.debian.org/ wheezy/updates/main qemu amd64 1.1.2+dfsg-6a+deb7u7 [115 kB]
Fetched 70.9 MB in 10s (6,776 kB/s)
refreshing freenet index
--2015-05-19 15:55:25--  http://127.0.0.1:8888/freenet:USK@oRy7ltZLJM-w-kcOBdiZS1pAA8P-BxZ3BPiiqkmfk0E,6a1KFG6S-Bwp6E-MplW52iH~Y3La6GigQVQDeMjI6rg,AQACAAE/deb.mempo.org/-42/

Wir müssen vor dem Download einen Befehl ausführen . Genauer gesagt: Das Skript muss nach dem Aufruf von apt-get ausgeführt werden, bevor apt-get auf eine Online-Ressource zugreift.

Gibt es so etwas wie einen Pre-Download-Hook?

Es ist wichtig, dass die Installation durchgeführt werden kann, ohne das Skript apt-get ersetzen zu müssen (und ohne etwas anderes zu tun, das durch ein Update rückgängig gemacht werden könnte).

Arne Babenhauserheide
quelle
2
Sie könnten eine Funktion mit dem Namen deklarieren, apt-getdie selbst den Real aufruft apt-get. Abhängig vom gewünschten Bereich kann die Funktion entweder in /etc/profileoder ~/.profileoder deklariert werden ~/.bashrc.
user43791
Was genau bedeutet "Das Skript muss ausgeführt werden, nachdem apt-get aufgerufen wurde, aber bevor apt-get auf eine Online-Ressource zugreift"? Welcher Teil der Produktion apt-get muss ausgeführt werden, bevor Ihr Hook ordnungsgemäß ausgeführt werden kann?
Bis
@jthill müssen wir einen Download einer bestimmten URL auslösen, bevor auf eine andere URL zugegriffen werden kann. Der Grund dafür ist, dass wir aus dem Freenet (dezentraler anonymer Datenspeicher, der als Deb-Repository verwendet wird) herunterladen und vor dem Herunterladen eine aggressive Suche nach der neuesten Version auslösen möchten.
Arne Babenhauserheide
In Kommentaren wird gefragt, wie ein Systembefehl auf eine Weise ersetzt werden kann, die nicht umgangen und auch vom Installationsprogramm des Systems nicht entfernt werden kann. Sie fragen, wie Sie das System rooten können.
Bis
Es wäre hilfreich, wenn Sie Ihren Anwendungsfall beschreiben könnten. Oder mit anderen Worten, was versuchst du zu tun?
Faheem Mitha

Antworten:

5

Was ist mit passenden Hooks vor / nach dem Aufruf?

Im Wesentlichen ähnelt es dpkg-Hooks vor / nach dem Aufruf, jedoch für apt (was meiner Meinung nach tatsächlich das wichtigste in Ihrem Verwendungsszenario ist). AFAIK gibt es andere, aber ich habe nur so verwendet.

Z.B

$ sudo cat /etc/apt/apt.conf.d/05new-hook
APT::Update::Pre-Invoke {"your-command-here"};
Jeremy Davis
quelle
Apt bietet jedoch keinen Pre-Invoke-Hook für Upgrade oder Installation, daher funktioniert dies nur für apt-get update.
Andrew Domaszek
Stimmt, aber ich habe die Frage speziell beantwortet! :) Sie können dpkg-Hooks (gemäß OP) für alles verwenden, was Optimierungen vor / nach der Installation erfordert.
Jeremy Davis
So'ne Art; vorausgesetzt, das Update wird immer vor dem Upgrade / der Installation ausgeführt. Das Verknüpfen aller Befehle vor dem Netzwerkzugriff scheint mit den derzeit (2017-05-17) verfügbaren apt-Hooks nicht möglich zu sein. Dies ist immer noch die beste Antwort für Skripte, aber es hilft nicht bei Dingen wie vorhandenen Skripten für automatische Updates.
Andrew Domaszek
Oh ok, ich verstehe dich jetzt. Es tut uns leid; Ja, du hast einen wirklich guten Punkt. Sie können also das apt-get-Update optimieren, aber die apt-get-Installation wird weiterhin heruntergeladen, bevor die dpkg-Hooks ausgeführt werden?! Hmmm, das ist wirklich scheiße!
Jeremy Davis
Was versuchst du zu tun? Wenn Sie automatische Updates wünschen, aber nur von bestimmten Repos (z. B. Debian-Sicherheit) installieren möchten, können Sie cronapt mit einem Skript wie TurnKeys cronapt-Skript [1] verwenden. Teilen Sie Ihre Quellen.Listeneinträge in separate Dateien auf. Diejenigen, von denen Sie automatische Updates wünschen, gehen in die Datei security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
Jeremy Davis
2

Bestimmen Sie zuerst, wo apt-get verwendet wird whereis apt-getoder which apt-get; Ich gehe davon aus, dass es in / usr / bin / apt-get ist

Erstellen Sie dann eine Datei in / usr / local / bin / apt-get mit folgendem Inhalt:

#!/bin/bash
# (commands to run before apt-get)
/usr/bin/apt-get "$@"

jetzt chmod +x /usr/local/bin/apt-get.

Dies sollte alle Upgrades der Distribution überleben, aber das Verhalten von apt-get nicht ändern (abgesehen davon, dass der Befehl ausgeführt wird, bevor etwas anderes ausgeführt wird). Als Bonus könnte es die Befehlszeilenargumente analysieren, um den Befehl nur auszuführen, wenn er wirklich benötigt wird.

(Diese Antwort baut auf der Antwort von Mohammad Etemaddar auf , die mit dem Feedback von muru zusammengeführt wurde.)

Arne Babenhauserheide
quelle
2

Sie können einen "Alias" in der .bashrc-Datei verwenden. Fügen Sie dies beispielsweise in Ihre .bashrc-Stammdatei ein:

alias apt-get='echo blahblah && apt-get'

Befehlszeilenargumente werden automatisch am Ende des Alias ​​hinzugefügt.

Ersetzen echo blahblahSie einfach durch den Befehl, den Sie benötigen.

In diesem Fall funktioniert dies jedoch nur, wenn Sie Befehle als root ausführen (nicht als sudo).

römisch
quelle
Ist es möglich, diesen Alias ​​in ein normales Benutzerprofil zu setzen, um ihn von sudo zu verwenden?
Mohammad Etemaddar
1
Ja, das denke ich. Versuchen Sie : alias apt-get='echo blahblah && sudo apt-get'. Dann müssen Sie zum Beispiel nur noch das Terminal eingeben - apt-get updateohne sudo, und Sie werden automatisch nach einem Sudo-Passwort gefragt.
Roman
es ist wahr. Natürlich funktioniert 'echo blahblah' dann nicht unter su Privilegien.
Mohammad Etemaddar
1
Es ist möglicherweise besser, eine Shell-Funktion oder ein Skript (in /usr/local/binoder ~/bin) zu verwenden, da Aliase Argumente nicht gut verarbeiten.
Scott
1

Bestimmen Sie zuerst, wo apt-get verwendet wird whereis apt-get. Ich gehe davon aus, dass es in / usr / bin / apt-get ist

wie muru sagt, können Sie ein Skript erstellen Namen apt-getin /usr/local/bin/dem vor ist /usr/binin Debian und Ubuntu $PATH. Fügen Sie dann den folgenden Code ein ( /usr/local/bin/apt-get):

#!/bin/bash
commands to run before apt-get
/usr/bin/apt-get "$@"

Danke muru für das Angebot als Kommentar.

Andere Weise:

Natürlich gibt es einen anderen Weg, der nicht besser ist als der vorherige.

Du kannst mv /usr/bin/apt-get /usr/bin/apt-get2

Erstellen Sie dann eine Datei in / usr / bin / apt-get mit folgendem Inhalt:

#!/bin/bash
commands to run before apt-get
apt-get2 "$@"

jetzt chmod +x /usr/bin/apt-get

Mohammad Etemaddar
quelle
Überlebt dies ein Dist-Upgrade?
Arne Babenhauserheide
Ja. $@bewirkt, dass das Skript mit allen Argumenten funktioniert.
Mohammad Etemaddar
6
Eek. Wenn Sie ein Ersatz erstellen möchten, setzen Sie es in /usr/local/bin, die vor kommt /usr/binin Debian und Ubuntu in den Standardpfad.
Muru
3
Das ist wirklich ein schlechter Rat, sorry. (a) Die apt-getausführbare Datei befindet sich in /usr/bin/apt-get, nicht sbin. (b) Leg dich nicht mit Systembefehlen an. Wie Muru sagt, können Sie eine lokale Überschreibung erstellen /usr/local/bin, obwohl selbst dies keine gute Lösung ist.
Faheem Mitha
@muru / usr / local / bin klingt nach einem möglichen Weg - daran hatte ich nicht gedacht. Vielen Dank!
Arne Babenhauserheide
0

Versuchen Sie es mit einem Alias ​​in der .bashrcDatei. Dies funktioniert nur, wenn Sie bei dem Konto angemeldet sind, dem die Datei entspricht. Die Syntax eines Alias ​​lautet:

alias newcommand='command1; command2; command3' Ihre Linie könnte also ein bisschen so aussehen:

alias apt-get='firstcommand; apt-get'

Oder dieses:

alias apt-get='firstcommand && apt-get'

Mit der zweiten apt-getwird nur ausgeführt, wenn firstcommanderfolgreich ist.

Will Dereham
quelle
Abgesehen von der Klärung des Root- / Normalbenutzerproblems ist dies im Wesentlichen eine Wiederholung der ersten Antwort.
G-Man sagt "Reinstate Monica"