Comment puis-je exécuter une commande avant que apt-get ne commence à télécharger un package?
Je connais le hook dpkg pré-invoqué ( hook un script pour apt-get ), mais cela semble être exécuté après le téléchargement.
$ 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/
Ce dont nous avons besoin, c'est d'exécuter une commande avant le téléchargement. Plus exactement: le script doit s'exécuter après avoir appelé apt-get mais avant qu'apt-get accède à toute ressource en ligne.
Y a-t-il quelque chose comme un crochet de pré-téléchargement?
Il est important que l'installation puisse se faire sans avoir à remplacer le script apt-get (et sans rien faire qui pourrait être annulé par une mise à jour).
apt-get
qui appellerait elle-même le réelapt-get
. Selon l'étendue que vous souhaitez qu'elle ait, la fonction peut être déclarée dans/etc/profile
ou~/.profile
ou~/.bashrc
.Réponses:
Qu'en est-il de l'utilisation des crochets apt pré / post-invocation?
Essentiellement, il est similaire aux hooks dpkg pré / post-invocation mais pour apt (qui, je suppose, est en fait le plus important dans votre scénario d'utilisation). AFAIK il y en a d'autres mais je n'ai utilisé que comme ça.
Par exemple
la source
apt-get update
.Déterminez d'abord où apt-get utilise
whereis apt-get
ouwhich apt-get
; Je suppose que c'est dans / usr / bin / apt-getCréez ensuite un fichier dans / usr / local / bin / apt-get avec ce contenu:
maintenant
chmod +x /usr/local/bin/apt-get
.Cela devrait survivre à toutes les mises à niveau de la distribution mais cela ne devrait pas changer le comportement d'apt-get (à part exécuter la commande avant de faire quoi que ce soit d'autre). En prime, il pourrait analyser les arguments de la ligne de commande pour exécuter la commande uniquement lorsque cela est vraiment nécessaire.
(Cette réponse s'appuie sur la réponse de Mohammad Etemaddar , fusionnée avec les commentaires de muru)
la source
Vous pouvez utiliser un "alias" dans le fichier .bashrc. Par exemple, mettez cela dans votre fichier racine .bashrc:
Les arguments de ligne de commande seront ajoutés automatiquement à la fin de l'alias.
Remplacez-le simplement
echo blahblah
par la commande dont vous avez besoin.Mais dans ce cas, cela ne fonctionne que lorsque vous exécutez des commandes en tant que root (pas sudo).
la source
alias apt-get='echo blahblah && sudo apt-get'
. Ensuite, il vous suffit de taper le terminal par exemple -apt-get update
sanssudo
, et un mot de passe sudo vous sera automatiquement demandé./usr/local/bin
ou~/bin
), car les alias ne gèrent pas bien les arguments.Déterminez d'abord où apt-get est utilisé
whereis apt-get
; Je suppose que c'est dans / usr / bin / apt-getcomme le dit muru , vous pouvez créer un script nommé
apt-get
dans/usr/local/bin/
lequel se trouve avant/usr/bin
dans Debian et Ubuntu$PATH
. Ensuite, mettez-y le code suivant (/usr/local/bin/apt-get
):Merci muru pour l'offre comme commentaire.
Autre moyen:
Bien sûr, il existe un autre moyen qui n'est pas meilleur que le précédent.
Vous pouvez
mv /usr/bin/apt-get /usr/bin/apt-get2
Créez ensuite un fichier dans / usr / bin / apt-get avec ce contenu:
maintenant
chmod +x /usr/bin/apt-get
la source
$@
fait fonctionner le script avec tous les arguments./usr/local/bin
, qui précède/usr/bin
dans le PATH par défaut dans Debian et Ubuntu.apt-get
exécutable se trouve dans/usr/bin/apt-get
, nonsbin
. (b) Ne jouez pas avec les commandes du système. Comme le dit Muru, vous pouvez créer un remplacement local/usr/local/bin
, même si ce n'est pas une bonne solution.Essayez un alias dans le
.bashrc
fichier. Cela ne fonctionne que lorsque vous êtes connecté au compte auquel le fichier correspond. La syntaxe d'un alias est:alias newcommand='command1; command2; command3'
Votre ligne pourrait donc ressembler un peu à ceci:alias apt-get='firstcommand; apt-get'
Ou ca:
alias apt-get='firstcommand && apt-get'
Avec le second,
apt-get
ne s'exécutera qu'en cas defirstcommand
succès.la source