Как запустить команду перед загрузкой с помощью 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 говорит: «Восстановите Монику»