Faça a atualização e atualização do apt-get automatizar e autônoma

28

Eu tenho cerca de 7 servidores Debian que eu gerencio e gostaria de configurá-los para se atualizarem automaticamente. Então, eu criei um script como tal:

#!/bin/sh
apt-get update
apt-get upgrade

e colocou na rootlista de crontab. Infelizmente, ele sempre fica na seção Atualização, perguntando se tenho certeza de que quero atualizar. Por ser um trabalho cron, não vejo a saída até que me envie um e-mail dizendo que falhou. Existe uma maneira de ignorar esse prompt e fazer a atualização automaticamente?

O canadense Luke REINSTATE MONICA
fonte
3
... ou cron-apt.
derobert

Respostas:

46

Use a opção -y para o apt-get não pedir. De man apt-get:

   -y, --yes, --assume-yes
       Automatic yes to prompts; assume "yes" as answer to all prompts and
       run non-interactively. If an undesirable situation, such as
       changing a held package, trying to install a unauthenticated
       package or removing an essential package occurs then apt-get will
       abort. Configuration Item: APT::Get::Assume-Yes.

Você também pode definir a variável de ambiente DEBIAN_FRONTEND

DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
Arthur Ulfeldt
fonte
11
O que DEBIAN_FRONTENDfaz? Também é usado para outros processos?
Canadian Luke REINSTATE MONICA
Estou tentando isso no meu servidor doméstico e escolherá a melhor resposta assim que for executado
canadense Luke REINSTATE MONICA
11
@CanadianLuke veja aqui para DEBIAN_FRONTEND. Não é mencionado no meu Debian man debconf, portanto, pode ser uma coisa do Ubuntu.
terdon
@terdon, você não possui o pacote -doc para o debconf. Está na seção 7 do homem man 7 debconf;)
Braiam
@Braiam ah, OK, eu vi isso e tentei, man 7 debconfmas não consegui nada. Agora eu sei o porquê :)
terdon
27

Bem, talvez você esteja usando a ferramenta errada. unattended-upgradeso pacote instala atualizações de segurança diariamente (pode ser configurado), você pode configurar quais pacotes atualizar ou não atualizar, etc. Pode ser instalado usando:

sudo apt-get install unattended-upgrades

De man unattended-upgrades:

A configuração é feita através do mecanismo de configuração do apt. O arquivo de configuração padrão pode ser encontrado em /etc/apt/apt.conf.d/50unattended-upgrades

Braiam
fonte
@CanadianLuke lê todas as configurações, /etc/apt/apt.conf.d/mas apenas as que começam com Unattended-Upgrade::são analisadas.
Braiam
Estou tentando isso em um dos servidores em funcionamento e escolherei a melhor resposta assim que for executada
canadense Luke REINSTATE MONICA
10

embora as respostas anteriores sejam informativas, elas não contornam a 'questão' de entrada exigida por meios humanos durante upgrade. portanto, estou usando o seguinte:

export DEBIAN_FRONTEND=noninteractive
export DEBIAN_PRIORITY=critical
sudo -E apt-get -qy update
sudo -E apt-get -qy -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" upgrade
sudo -E apt-get -qy autoclean

para incluir atualizações de 'distribuição' como kernels, use o dist-upgradecomando

consulte o manpgage dedpkg para informações detalhadas sobre esses parâmetros.

Nota importante : é necessário chamar sudoincluindo o -Eparâmetro:

Indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the user does not have permission to preserve the environment.

caso contrário, as EXPORTdeclarações não afetarão as chamadas de apt-get!

o crédito vai para Remy van Elst ! obrigado!

nervosismo
fonte
11
Você poderia explicar por que adicionou outras opções para o apt-get upgrade?
FarO
11
Além disso, é necessário "sudo -E" se o script for executado no crontab do rott?
FarO 23/12/19
11
@ FarO que depende de qual ambiente / em qual contexto você gostaria que o cronjob fosse executado. geralmente, eles são executados por root- assim você não precisa usá sudo-lo. as 'outras opções' estão definidas para serem executadas sem supervisão em qualquer caso. por favor, consulte a manpágina referenciada .
jitter
4

Uma ferramenta genérica para esse tipo de coisa é yes:

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

Então, por exemplo, você poderia fazer

yes | sudo apt-get upgrade 

Observe que, no caso específico de apt-get upgradeusar as opções sugeridas por @Braiam ou @ArthurUlfeldt, é melhor.

terdon
fonte
A linha que colo quando quero fazê-lo manualmente é apt-get update && yes | apt-get upgrade(nossos servidores não devem usar sudo... Não pergunte ...)
canadense Luke REINSTATE MONICA
Por que usar um truque em vez de uma opção já fornecida? "-y" já está no apt-get.
FarO
3
Porque, como eu disse na resposta, esta é uma ferramenta genérica para esse tipo de operação, portanto, essa resposta é para outros casos, não para o apt. Você não leu o último parágrafo? Ou a primeira frase?
terdon