¿Cómo ejecutar un comando antes de descargar con apt-get?

8

¿Cómo puedo ejecutar un comando antes de que apt-get comience a descargar un paquete?

Sé sobre el gancho previo a la invocación dpkg ( engancha un script a apt-get ), pero parece que se ejecuta después de la descarga.

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

Lo que necesitamos es ejecutar un comando antes de la descarga. Más exactamente: el script debe ejecutarse después de llamar a apt-get pero antes de que apt-get acceda a cualquier recurso en línea.

¿Hay algo como un gancho de descarga previa?

Es importante que la instalación se pueda realizar sin tener que reemplazar el script apt-get (y sin hacer nada más que una actualización pueda deshacer).

Arne Babenhauserheide
fuente
2
Podría declarar una función llamada apt-getque en sí misma llamaría real apt-get. Dependiendo del alcance que desee que tenga, la función podría declararse en /etc/profileo ~/.profileo ~/.bashrc.
user43791
¿Qué significa exactamente "El script debe ejecutarse después de llamar a apt-get pero antes de que apt-get acceda a cualquier recurso en línea"? ¿Qué parte de la producción apt-get debe ejecutarse antes de que su gancho pueda ejecutarse correctamente?
2015
@j todavía necesitamos activar una descarga de una URL determinada antes de acceder a cualquier otra URL. La razón es que descargamos desde freenet (almacén de datos anónimo descentralizado utilizado como repositorio de Deb) y queremos iniciar una búsqueda agresiva de la versión más reciente antes de descargar cualquier cosa.
Arne Babenhauserheide
A partir de los comentarios, está preguntando cómo reemplazar un comando del sistema de una manera que no se pueda omitir y que ni siquiera el instalador del sistema pueda eliminar. Estás preguntando cómo rootear el sistema.
Jthill
Sería útil si pudiera describir su caso de uso. O en otras palabras, ¿qué estás tratando de hacer?
Faheem Mitha

Respuestas:

5

¿Qué pasa con el uso de ganchos apt pre / post-invoke?

Esencialmente es similar a los ganchos dpkg pre / post-invoke pero para apt (lo que supongo que es realmente el importante en su escenario de uso). AFAIK hay otros, pero solo los he usado así.

P.ej

$ sudo cat /etc/apt/apt.conf.d/05new-hook
APT::Update::Pre-Invoke {"your-command-here"};
Jeremy Davis
fuente
Sin embargo, Apt no proporciona un enlace previo a la invocación para actualizar o instalar, por lo que esto solo funciona apt-get update.
Andrew Domaszek
Es cierto, ¡pero estaba respondiendo la pregunta específicamente! :) Puede usar ganchos dpkg (según el OP) para cualquier cosa que requiera ajustes previos / posteriores a la instalación.
Jeremy Davis
Mas o menos; suponiendo que la actualización siempre se ejecute antes de la actualización / instalación. Enganchar todos los comandos antes de que ocurra el acceso a la red parece imposible con los enganches apt disponibles actualmente (2017-05-17). Esta sigue siendo la mejor respuesta para las secuencias de comandos, pero no ayuda para cosas como las secuencias de comandos de actualización automática existentes.
Andrew Domaszek
Oh ok, te entiendo ahora. Lo siento; Sí, tienes un muy buen punto. ¿Entonces puede ajustar apt-get update, pero apt-get install aún se descargará antes de que se ejecuten los ganchos dpkg? Hmmm, eso realmente apesta!
Jeremy Davis
¿Qué intentas hacer? Si desea actualizaciones automáticas pero solo se instala desde repositorios específicos (por ejemplo, seguridad de Debian), puede usar cronapt con un script como el script cronapt de TurnKey [1]. Divida sus entradas de sources.list en archivos separados; los que desea actualizaciones automáticas van en security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
Jeremy Davis
2

Primero determine dónde está apt-get usando whereis apt-geto which apt-get; Asumiré que está en / usr / bin / apt-get

Luego cree un archivo en / usr / local / bin / apt-get con este contenido:

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

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

Esto debería sobrevivir a todas las actualizaciones de la distribución, pero no debería cambiar el comportamiento de apt-get (aparte de ejecutar el comando antes de hacer cualquier otra cosa). Como beneficio adicional, podría analizar los argumentos de la línea de comando para ejecutar solo el comando cuando realmente se necesita.

(Esta respuesta se basa en la respuesta de Mohammad Etemaddar , combinada con los comentarios de muru)

Arne Babenhauserheide
fuente
2

Puede usar un "alias" en el archivo .bashrc. Por ejemplo, ponga eso en su archivo raíz .bashrc:

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

Los argumentos de la línea de comandos se agregarán automáticamente al final del alias.

Simplemente reemplácelo echo blahblahpor el comando que necesita.

Pero en este caso, solo funciona cuando ejecuta comandos como root (no sudo).

romano
fuente
¿Es posible poner este alias en el perfil de usuario normal para usarlo por sudo?
Mohammad Etemaddar
1
Sí, creo que sí. Proveedores: alias apt-get='echo blahblah && sudo apt-get'. Luego, solo necesita escribir el terminal, por ejemplo, apt-get updatesin sudo, y se le pedirá una contraseña de sudo automáticamente.
Romano
es verdad. por supuesto, entonces 'echo blahblah' no funcionará bajo sus privilegios.
Mohammad Etemaddar
1
Puede ser mejor usar una función de shell o un script (en /usr/local/bino ~/bin), porque los alias no manejan bien los argumentos.
Scott,
1

Primero determine dónde está usando apt-get whereis apt-get; Asumiré que está en / usr / bin / apt-get

como Muru dice: Se puede crear un script llamado apt-geten /usr/local/bin/el que está delante /usr/binen Debian y Ubuntu $PATH. Luego pon el siguiente código ( /usr/local/bin/apt-get):

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

Gracias muru por la oferta como comentario.

Otra manera:

Por supuesto, hay otra forma que no es mejor que la anterior.

Usted puede mv /usr/bin/apt-get /usr/bin/apt-get2

Luego cree un archivo en / usr / bin / apt-get con este contenido:

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

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

Mohammad Etemaddar
fuente
¿Sobrevive esto a una actualización dist?
Arne Babenhauserheide
Si. $@hace que el script funcione con todos los argumentos.
Mohammad Etemaddar
66
Eek Si desea crear un reemplazo, póngalo /usr/local/bin, que viene antes /usr/binen la RUTA predeterminada en Debian y Ubuntu.
muru
3
Este es realmente un mal consejo, lo siento. (a) El apt-getejecutable se encuentra en /usr/bin/apt-get, no sbin. (b) No te metas con los comandos del sistema. Como dice muru, puede crear una anulación local /usr/local/bin, aunque incluso eso no es una buena solución.
Faheem Mitha
@muru / usr / local / bin parece un posible camino a seguir, no había pensado en eso. ¡Gracias!
Arne Babenhauserheide
0

Pruebe con un alias en el .bashrcarchivo. Solo funciona cuando inicia sesión en la cuenta a la que corresponde el archivo. La sintaxis de un alias es:

alias newcommand='command1; command2; command3' Entonces su línea podría verse un poco así:

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

O esto:

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

Con el segundo, apt-getsolo se ejecutará si firstcommandtiene éxito.

Will Dereham
fuente
Además de aclarar el problema del usuario root / normal, esto es esencialmente una reiteración de la primera respuesta.
G-Man dice 'Restablecer a Monica'