Как запустить команду перед загрузкой с помощью apt-get?


8

Как я могу запустить команду, прежде чем apt-get начнет загружать пакет?

Я знаю о хуке dpkg pre-invoke ( подключить скрипт к apt-get ), но, похоже, он запускается после загрузки.

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

Нам нужно запустить команду перед загрузкой. Точнее: скрипт должен запускаться после вызова apt-get, но до того, как apt-get получит доступ к любому онлайн-ресурсу.

Есть ли что-то вроде зацепки перед загрузкой?

Важно, что установка может быть выполнена без замены скрипта apt-get (и без выполнения чего-либо еще, что может быть отменено обновлением).


2
Вы можете объявить функцию с именем, apt-getкоторая сама вызовет реальную apt-get. В зависимости от объема вы хотите, чтобы функция могла быть объявлена как в /etc/profileили ~/.profileили ~/.bashrc.
— user43791

Что именно означает «скрипт должен запускаться после вызова apt-get, но до того, как apt-get получает доступ к любому онлайн-ресурсу»? Какая часть продукта apt-get должна быть запущена, прежде чем ваш хук сможет работать правильно?
— до

@jthill нам нужно запустить загрузку данного URL-адреса, прежде чем любой другой URL-адрес будет доступен. Причина в том, что мы загружаем из freenet (децентрализованное анонимное хранилище данных, используемое в качестве deb-репозитория), и мы хотим запустить один агрессивный поиск самой последней версии, прежде чем что-либо скачивать.
— Арне Бабенхаузерхайде

Из комментариев вы спрашиваете, как заменить системную команду таким образом, чтобы ее нельзя было обойти и не удалить даже установщиком системы. Вы спрашиваете, как руткит системы.
— августа

Было бы полезно, если бы вы могли описать ваш вариант использования. Или, другими словами, что вы пытаетесь сделать?
— Фахим Митха

Ответы:


5

Как насчет использования apt pre / post-invoke hooks?

По сути, это похоже на перехваты dpkg pre / post-invoke, но для apt (который, я полагаю, на самом деле важен в вашем сценарии использования) AFAIK есть и другие, но я использовал только так.

Например

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

Тем не менее, Apt не предоставляет хук предварительного вызова для Upgrade или Install, так что это работает только для apt-get update.
— Андрей Домашек,

Правда, но я отвечал на вопрос конкретно! :) Вы можете использовать хуки dpkg (согласно ОП) для всего, что требует настройки до / после установки.
— Джереми Дэвис

Вроде; при условии, что обновление всегда выполняется перед обновлением / установкой. Перехват всех команд до того, как произойдет доступ к сети, кажется невозможным с доступными в настоящее время (2017-05-17) подходящими перехватчиками. Это все еще лучший ответ для сценариев, но он не помогает таким вещам, как существующие сценарии автоматического обновления.
— Андрей Домашек

О, хорошо, я понимаю тебя сейчас. Сожалею; да, у вас есть действительно хорошая мысль. Таким образом, вы можете настроить apt-get update, но apt-get install все равно будет загружаться до запуска хуков dpkg ?! Хм, это действительно отстой!
— Джереми Дэвис

Что вы пытаетесь сделать? Если вы хотите автообновления, но устанавливаете их только из определенных репозиториев (например, безопасности Debian), вы можете использовать cronapt со скриптом, подобным скрипту cronapt TurnKey [1]. Разделите ваши записи sources.list на отдельные файлы; те, от которых вы хотите получать автоматические обновления, идут в security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
— Джереми Дэвис,

2

Сначала определите, где используется apt-get whereis apt-getили which apt-get; Я предполагаю, что это в / usr / bin / apt-get

Затем создайте файл в / usr / local / bin / apt-get с этим содержимым:

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

Теперь chmod +x /usr/local/bin/apt-get.

Это должно выдержать все обновления дистрибутива, но не должно изменять поведение apt-get (кроме запуска команды перед выполнением чего-либо еще). В качестве бонуса он может анализировать аргументы командной строки, чтобы запускать команду только тогда, когда она действительно необходима.

(Этот ответ основан на ответе Мухаммеда Этемаддара , объединенного с ответом Муру)


2

Вы можете использовать «псевдоним» в файле .bashrc. Например, поместите это в свой корневой файл .bashrc:

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

Аргументы командной строки будут автоматически добавлены в конец псевдонима.

Просто замените echo blahblahкоманду, которая вам нужна.

Но в этом случае он работает только тогда, когда вы выполняете команды от имени пользователя root (не sudo).


Можно ли поместить этот псевдоним в обычный профиль пользователя, чтобы использовать его с помощью sudo?
— Мухаммед Этемаддар

1
Да, я так. Попробуйте: alias apt-get='echo blahblah && sudo apt-get'. Затем вам нужно всего лишь ввести терминал, например, apt-get updateбез sudo, и вам будет предложено автоматически ввести пароль sudo.
— Роман

это так. конечно, тогда «эхо, бла-бла» не будет работать под привилегиями su.
— Мухаммед Этемаддар

1
Возможно, лучше использовать функцию оболочки или сценарий (в /usr/local/binили ~/bin), потому что псевдонимы плохо обрабатывают аргументы.
— Скотт

1

Сначала определите, где используется apt-get whereis apt-get; Я предполагаю, что это в / usr / bin / apt-get

а Muru говорит, Вы можете создать скрипт с именем , apt-getв /usr/local/bin/котором находится , прежде чем /usr/binв Debian и Ubuntu $PATH. Затем поместите в него следующий код ( /usr/local/bin/apt-get):

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

Спасибо Муру за предложение в качестве комментария.

Другой путь:

Конечно, есть и другой способ, который не лучше предыдущего.

Вы можете mv /usr/bin/apt-get /usr/bin/apt-get2

Затем создайте файл в / usr / bin / apt-get с этим содержимым:

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

сейчас же chmod +x /usr/bin/apt-get


это переживает dist-upgrade?
— Арне Бабенхаузерхайде

Да. $@заставляет скрипт работать с каждым аргументом.
— Мухаммед Этемаддар

6
Ик. Если вы хотите создать замену, вставьте ее /usr/local/bin, что раньше /usr/binв PATH по умолчанию в Debian и Ubuntu.
— Муру

3
Это действительно плохой совет, извините. (а) apt-getИсполняемый файл находится в /usr/bin/apt-get, а не sbin. (б) Не связывайтесь с системными командами. Как говорит Муру, вы можете создать локальное переопределение /usr/local/bin, хотя даже это не является хорошим решением.
— Фахим Митха

@muru / usr / local / bin звучит как возможный путь - я не думал об этом. Спасибо!
— Арне Бабенхаузерхайде

0

Попробуйте псевдоним в .bashrcфайле. Работает только при входе в учетную запись, которой соответствует файл. Синтаксис псевдонима:

alias newcommand='command1; command2; command3' Так что ваша строка может выглядеть примерно так:

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

Или это:

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

Со вторым, apt-getбудет выполняться только в случае firstcommandуспеха.


Помимо выяснения проблемы root / обычного пользователя, это по сути повторение первого ответа.
— G-Man говорит: «Восстановите Монику»
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.