Come eseguire un comando prima di scaricare con apt-get?


8

Come posso eseguire un comando prima che apt-get inizi a scaricare un pacchetto?

Conosco l'hook pre-invoke di dpkg ( hook uno script per apt-get ), ma sembra che venga eseguito dopo il download.

$ 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/

Ciò di cui abbiamo bisogno è eseguire un comando prima del download. Più esattamente: lo script deve essere eseguito dopo aver chiamato apt-get ma prima che apt-get acceda a qualsiasi risorsa online.

Esiste qualcosa come un hook di pre-download?

È importante che l'installazione possa essere eseguita senza dover sostituire lo script apt-get (e senza fare nient'altro che potrebbe essere annullato da un aggiornamento).


2
Potresti dichiarare una funzione chiamata apt-getche a sua volta chiamerebbe reale apt-get. A seconda dell'ambito desiderato, la funzione può essere dichiarata in /etc/profileo ~/.profileo ~/.bashrc.
user43791,

Cosa significa esattamente "Lo script deve essere eseguito dopo aver chiamato apt-get ma prima che apt-get acceda a qualsiasi risorsa online"? Quale parte della produzione apt-get deve essere in esecuzione prima che il tuo hook possa essere eseguito correttamente?
jill,

@jthill dobbiamo attivare il download di un determinato URL prima di accedere a qualsiasi altro URL. Il motivo è che scarichiamo da Freenet (archivio dati anonimo decentralizzato usato come repository deb) e vogliamo avviare una ricerca aggressiva per la versione più recente prima di scaricare qualsiasi cosa.
Arne Babenhauserheide,

Dai commenti, stai chiedendo come sostituire un comando di sistema in un modo che non può essere ignorato e non può essere rimosso anche dal programma di installazione del sistema. Stai chiedendo come eseguire il rootkit del sistema.
jill,

Sarebbe utile se potessi descrivere il tuo caso d'uso. O in altre parole, cosa stai cercando di fare?
Faheem Mitha,

Risposte:


5

Che dire dell'utilizzo di hook pre / post-invoke apt?

Essenzialmente è simile agli hook di dpkg pre / post-invoke ma per apt (che presumo sia in realtà quello importante nel tuo scenario di utilizzo). AFAIK ce ne sono altri ma ho usato solo così.

Per esempio

$ sudo cat /etc/apt/apt.conf.d/05new-hook
APT::Update::Pre-Invoke {"your-command-here"};

Apt non fornisce un hook pre-invoke per l'aggiornamento o l'installazione, quindi funziona solo per apt-get update.
Andrew Domaszek,

Vero, ma stavo rispondendo alla domanda in modo specifico! :) È possibile utilizzare gli hook di dpkg (come da OP) per tutto ciò che richiede modifiche pre / post installazione.
Jeremy Davis,

Tipo; supponendo che l'aggiornamento venga sempre eseguito prima dell'aggiornamento / installazione. L'aggancio di tutti i comandi prima dell'accesso alla rete sembra impossibile con gli hook apt attualmente disponibili (2017-05-17). Questa è ancora la risposta migliore per gli script, ma non aiuta per cose come gli script di aggiornamento automatico esistenti.
Andrew Domaszek,

Oh ok, ora ti capisco. Scusate; Sì, hai davvero un buon punto. Quindi puoi modificare apt-get update, ma apt-get install verrà comunque scaricato, prima che vengano eseguiti gli hook di dpkg ?! Hmmm, fa davvero schifo!
Jeremy Davis,

Cosa stai cercando di fare? Se vuoi aggiornamenti automatici ma installa solo da repository specifici (ad es. Sicurezza Debian), puoi usare cronapt con uno script come lo script cronapt di TurnKey [1]. Dividi le voci di sources.list in file separati; quelli da cui desideri gli aggiornamenti automatici vanno in security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
Jeremy Davis,

2

Per prima cosa determinare dove è apt-get usando whereis apt-geto which apt-get; Presumo sia in / usr / bin / apt-get

Quindi crea un file in / usr / local / bin / apt-get con questo contenuto:

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

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

Questo dovrebbe sopravvivere a tutti gli aggiornamenti della distribuzione ma non dovrebbe cambiare il comportamento di apt-get (oltre a eseguire il comando prima di fare qualsiasi altra cosa). Come bonus, potrebbe analizzare gli argomenti della riga di comando per eseguire il comando solo quando è veramente necessario.

(Questa risposta si basa sulla risposta di Mohammad Etemaddar , unita al feedback di Muru)


2

È possibile utilizzare un "alias" nel file .bashrc. Ad esempio, inseriscilo nel tuo file .bashrc di root:

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

Gli argomenti della riga di comando verranno aggiunti automaticamente alla fine dell'alias.

Sostituisci semplicemente echo blahblahcon il comando che ti serve.

Ma in questo caso, funziona solo quando si eseguono comandi come root (non sudo).


È possibile inserire questo alias nel normale profilo utente per poterlo utilizzare sudo?
Mohammad Etemaddar,

1
Sì, penso di sì. Prova: alias apt-get='echo blahblah && sudo apt-get'. Quindi devi solo digitare il terminale per esempio - apt-get updatesenza sudo, e ti verrà richiesta automaticamente una password sudo.
Romano,

è vero. ovviamente allora 'echo blahblah' non funzionerà sotto privilegi.
Mohammad Etemaddar,

1
Potrebbe essere meglio usare una funzione shell o uno script (in /usr/local/bino ~/bin), perché gli alias non gestiscono bene gli argomenti.
Scott,

1

Innanzitutto determinare dove viene utilizzato apt-get whereis apt-get; Presumo sia in / usr / bin / apt-get

come dice muru , puoi creare uno script chiamato apt-getin /usr/local/bin/precedenza /usr/binin Debian e Ubuntu $PATH. Quindi inserisci il seguente codice ( /usr/local/bin/apt-get):

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

Grazie Muru per l'offerta come commento.

Altro modo:

Naturalmente c'è un altro modo che non è migliore di quello precedente.

Puoi mv /usr/bin/apt-get /usr/bin/apt-get2

Quindi crea un file in / usr / bin / apt-get con questo contenuto:

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

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


questo sopravvive a un dist-upgrade?
Arne Babenhauserheide,

Sì. $@fa sì che lo script funzioni con tutti gli argomenti.
Mohammad Etemaddar,

6
Eek. Se vuoi creare un sostituto, inseriscilo /usr/local/bin, che viene prima /usr/binnel PATH predefinito in Debian e Ubuntu.
muru,

3
Questo è davvero un cattivo consiglio, scusa. (a) L' apt-geteseguibile si trova in /usr/bin/apt-get, non sbin. (b) Non scherzare con i comandi di sistema. Come dice Muru, puoi creare un override locale /usr/local/bin, anche se non è una buona soluzione.
Faheem Mitha,

@muru / usr / local / bin sembra un possibile modo di procedere - non ci avevo pensato. Grazie!
Arne Babenhauserheide,

0

Prova un alias nel .bashrcfile. Funziona solo quando si accede all'account a cui corrisponde il file. La sintassi di un alias è:

alias newcommand='command1; command2; command3' Quindi la tua linea potrebbe apparire un po 'così:

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

O questo:

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

Con il secondo, apt-getverrà eseguito solo se ha esito firstcommandpositivo.


Oltre a chiarire il problema dell'utente root / normale, si tratta essenzialmente di una reiterazione della prima risposta.
G-Man dice "Reinstate Monica"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.