Como executar um comando antes de baixar com o apt-get?


8

Como posso executar um comando antes do apt-get começar a baixar um pacote?

Eu sei sobre o gancho de pré-chamada do dpkg ( conecte um script ao apt-get ), mas isso parece ser executado após o 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/

O que precisamos é executar um comando antes do download. Mais exatamente: o script deve ser executado após a chamada do apt-get, mas antes do apt-get acessar qualquer recurso online.

Existe algo como um gancho de pré-download?

É importante que a instalação possa ser feita sem a necessidade de substituir o script apt-get (e sem fazer mais nada que possa ser desfeito por uma atualização).


2
Você pode declarar uma função nomeada apt-getque chamaria de real apt-get. Dependendo do escopo que você deseja, a função pode ser declarada em /etc/profileou ~/.profileou ~/.bashrc.
User43791

O que exatamente significa "O script deve ser executado depois de chamar o apt-get, mas antes que o apt-get acesse qualquer recurso on-line"? Que parte da produção do apt-get precisa estar em execução antes que seu gancho possa ser executado corretamente?
jthill

@jillill, precisamos acionar o download de um determinado URL antes que qualquer outro URL seja acessado. O motivo é que baixamos do freenet (armazenamento de dados anônimo descentralizado usado como repositório deb) e queremos desencadear uma pesquisa agressiva da versão mais recente antes de baixar qualquer coisa.
Arne Babenhauserheide

Nos comentários, você está perguntando como substituir um comando do sistema de uma maneira que não pode ser ignorada e nem removida pelo instalador do sistema. Você está perguntando como fazer o rootkit do sistema.
jthill

Seria útil se você pudesse descrever seu caso de uso. Ou, em outras palavras, o que você está tentando fazer?
Faheem Mitha

Respostas:


5

Que tal usar ganchos pré / pós-chamada do apt?

Essencialmente, é semelhante aos ganchos de pré / pós-chamada do dpkg, mas para o apt (que eu suponho que seja realmente o mais importante no seu cenário de uso). AFAIK existem outros, mas eu só usei assim.

Por exemplo

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

O Apt não fornece um gancho de pré-chamada para atualização ou instalação, portanto, isso funciona apenas para apt-get update.
Andrew Domaszek

É verdade, mas eu estava respondendo a pergunta especificamente! :) Você pode usar ganchos do dpkg (conforme o OP) para qualquer coisa que exija ajustes antes / depois da instalação.
Jeremy Davis

Mais ou menos; assumindo que a atualização sempre seja executada antes da atualização / instalação. A conexão de todos os comandos antes que o acesso à rede ocorra parece impossível com os ganchos de apt atualmente disponíveis (17-05-2017). Essa ainda é a melhor resposta para scripts, mas não ajuda em coisas como scripts de atualização automática existentes.
Andrew Domaszek

Oh ok, eu te pego agora. Desculpa; Sim, você tem um bom argumento. Então você pode ajustar o apt-get update, mas o apt-get install ainda será baixado antes que os ganchos do dpkg sejam executados ?! Hmmm, isso é realmente péssimo!
Jeremy Davis

O que você está tentando fazer? Se você deseja atualizações automáticas, mas instala apenas a partir de repositórios específicos (por exemplo, segurança Debian), pode usar o cronapt com um script como o script cronapt do TurnKey [1]. Divida suas entradas sources.list em arquivos separados; os que você deseja que as atualizações automáticas acessem security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
Jeremy Davis

2

Primeiro determine onde o apt-get está usando whereis apt-getou which apt-get; Vou assumir que está em / usr / bin / apt-get

Em seguida, crie um arquivo em / usr / local / bin / apt-get com este conteúdo:

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

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

Isso deve sobreviver a todas as atualizações da distribuição, mas não deve alterar o comportamento do apt-get (além de executar o comando antes de fazer qualquer outra coisa). Como bônus, ele poderia analisar os argumentos da linha de comando para executar apenas o comando quando for realmente necessário.

(Esta resposta baseia-se na resposta de Mohammad Etemaddar , mesclada com o feedback de muru)


2

Você pode usar um "alias" no arquivo .bashrc. Por exemplo, coloque isso no seu arquivo .bashrc raiz:

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

Os argumentos da linha de comando serão adicionados automaticamente ao final do alias.

Apenas substitua echo blahblahpelo comando que você precisa.

Mas, neste caso, só funciona quando você está executando comandos como root (não sudo).


É possível colocar esse alias no perfil de usuário normal para usá-lo pelo sudo?
Mohammad Etemaddar

1
Sim, acho que sim. Tente: alias apt-get='echo blahblah && sudo apt-get'. Então você só precisa digitar o terminal, por exemplo - apt-get updatesem sudo, e será solicitada uma senha do sudo automaticamente.
Roman

é verdade. é claro que 'eco blahblah' não funcionará sob seus privilégios.
Mohammad Etemaddar

1
Talvez seja melhor usar uma função shell ou um script (in /usr/local/binou ~/bin), porque os aliases não lidam bem com argumentos.
2525 Scott

1

Primeiro determine onde o apt-get está usando whereis apt-get; Vou assumir que está em / usr / bin / apt-get

como Muru diz: Você pode criar um script chamado apt-getem /usr/local/bin/que é antes /usr/binno Debian e Ubuntu $PATH. Em seguida, coloque o seguinte código nele ( /usr/local/bin/apt-get):

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

Muru Obrigado pela oferta como comentário.

Outro jeito:

Claro que existe outra maneira que não é melhor que a anterior.

Você pode mv /usr/bin/apt-get /usr/bin/apt-get2

Em seguida, crie um arquivo em / usr / bin / apt-get com este conteúdo:

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

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


isso sobrevive a um dist-upgrade?
Arne Babenhauserheide

Sim. $@faz com que o script funcione com todos os argumentos.
Mohammad Etemaddar

6
Eek. Se você deseja criar uma substituição, coloque-a /usr/local/bin, que vem antes /usr/binno PATH padrão no Debian e Ubuntu.
muru

3
Este é um péssimo conselho, desculpe. (a) O apt-getexecutável está localizado em /usr/bin/apt-get, não sbin. (b) Não mexa com os comandos do sistema. Como muru diz, você pode criar uma substituição local /usr/local/bin, embora mesmo isso não seja uma boa solução.
Faheem Mitha

@muru / usr / local / bin parece um caminho possível - eu não tinha pensado nisso. Obrigado!
Arne Babenhauserheide

0

Tente um alias no .bashrcarquivo. Funciona apenas quando conectado à conta à qual o arquivo corresponde. A sintaxe de um alias é:

alias newcommand='command1; command2; command3' Portanto, sua linha pode ficar assim:

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

Ou isto:

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

Com o segundo, apt-getsó será executado se firstcommandfor bem-sucedido.


Além de esclarecer a questão do usuário root / normal, esta é essencialmente uma reiteração da primeira resposta.
G-Man diz 'Reinstate Monica'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.