Questão Como posso instalar apenas atualizações de segurança a partir da linha de comando?


sudo apt-get upgrade instala todas as atualizações, não apenas atualizações de segurança. Eu sei que posso usar o Gerenciador de Atualizações para selecionar apenas atualizações de segurança importantes, mas existe uma maneira de fazer isso a partir da linha de comando?


287
2017-07-28 22:50


origem


Acho que não. O dist-upgrade leva todo o sistema para uma nova versão. Estou falando de atualizações do dia-a-dia, como as que você vê no Gerenciador de Atualizações. - mac9416
Eu vejo o que você está dizendo agora. Heh, eu corro o apt-get update tantas vezes que escrevo sem pensar. Obrigado pelo heads-up! - mac9416
Você quer "apt-get dist-upgrade", não "apt-get upgrade". "dist-upgrade" não é para novos lançamentos (isso é "do-release-upgrade" um comando separado). Usando "dist-upgrade" significa que ele irá lidar com mudanças nas dependências dos novos pacotes. Isso pode ser importante. - Kees Cook
dist-upgrade é a operação normal executada pela GUI do Update Manager. Para pacotes como o kernel, onde há um linux-image-generic pacote, dependendo da imagem atual, por exemplo linux-image-3.x.y-zz-generic (cada versão do que é um nome de pacote separado), dist-upgrade (que permite que novos pacotes sejam instalados para satisfazer dependências) executará esta atualização, enquanto a atualização mostrará o pacote do kernel como retido. - chronitis
Surpreendente que não há boas apt-get respostas baseadas para isso, considerando o quão proeminentemente ele é listado em cada servidor - Karthik T


Respostas:


O pacote atualizações autônomas fornece funcionalidade para instalar atualizações de segurança automaticamente.

Você poderia usar isso, mas em vez de configurar a peça automática, você poderia chamá-la manualmente. Para este caso, o seguinte deve fazê-lo em silêncio:

sudo unattended-upgrade

ou versão mais detalhada, para controlar como vai

sudo unattended-upgrade -d

NOTA: Quando você chama de atualização não assistida, deixa o "s" desligado.

Isso pressupõe que o pacote esteja instalado por padrão, o que provavelmente é. Se não, faça apenas:

sudo apt-get install unattended-upgrades

Veja também /usr/share/doc/unattended-upgrades/README.md.


268
2017-07-29 17:28



Para desabilitar a execução automática de unattended-upgrade você provavelmente está precisando modificar /etc/cron.daily/apt, mas não tenho certeza se é "correto" fazê-lo - Jaime Hablutzel
Nota lateral: para o servidor Ubuntu 12.04.5 LTS, unattended-upgrades não está instalado por padrão. - Raptor
Como você está fazendo isso a partir da linha de comando, use -v para mensagens informativas ou -d para mensagens de depuração. Caso contrário, o utilitário será muito silencioso, caso em que você precisaria verificar os logs em /var/log/unattended-upgrades. Você também pode usar --dry-run para simular, mas não atualizar realmente nada. Para mais informações e outras opções, use --help para obter a mensagem de ajuda. - ADTC
eu aprendi algumas coisas sobre unattended-upgrades hoje. obrigado! - the0ther
"para monitorar como funciona", é apenas depurar mensagens não interativas, certo? - Aquarius Power


Algumas dicas sobre como gerenciar atualizações

Isso se aplica tanto ao Debian quanto ao Ubuntu, mas instruções mais específicas para o Ubuntu seguem.

  • Mostrar apenas atualizações de segurança:

    apt-get -s dist-upgrade |grep "^Inst" |grep -i securi 
    

    ou

    sudo unattended-upgrade --dry-run -d
    

    ou

    /usr/lib/update-notifier/apt-check -p
    
  • Mostrar todos os pacotes atualizáveis

    apt-get -s dist-upgrade | grep "^Inst"
    
  • Instalar apenas atualizações de segurança

    apt-get -s dist-upgrade | grep "^Inst" | 
        grep -i securi | awk -F " " {'print $2'} | 
        xargs apt-get install
    

Notas: 

  • Às vezes, o Ubuntu mostra atualizações de segurança como se estivessem vindo do repositório $ release-updates. Isto é assim, foi-me dito, porque os desenvolvedores do Ubuntu enviam atualizações de segurança para o repositório $ release-updates também para agilizar sua disponibilidade.

    Se for esse o caso, você pode fazer o seguinte para mostrar apenas as atualizações de segurança:

    sudo sh -c 'grep ^deb /etc/apt/sources.list | 
        grep security > /etc/apt/sources.security.only.list'
    

    e

    apt-get -s dist-upgrade -o Dir::Etc::SourceList=/etc/apt/sources.security.only.list -o Dir::Etc::SourceParts=/dev/null  | 
        grep "^Inst" | awk -F " " {'print $2'}
    
  • Verifique quais serviços precisam ser reiniciados após as atualizações de pacotes. Descubra quais pacotes você irá atualizar antecipadamente e agende suas reinicializações / reinicializações. O problema aqui é que, a menos que você reinicie um serviço, ele ainda pode estar usando uma versão mais antiga de uma biblioteca (razão mais comum) que foi carregada na memória antes de você instalar um novo pacote que corrige uma vulnerabilidade de segurança.

    checkrestart -v
    

    No entanto, tenha em mente que checkrestart pode listar processos que não devem necessariamente ser reiniciados. Por exemplo, o serviço PostgreSQL pode manter em sua memória referência a um arquivo de xlog já excluído, o que não é um motivo válido para reiniciar o serviço.

    Portanto, outra maneira mais confiável de verificar isso usando utilitários padrão é o seguinte pequeno script que eu descaradamente roubei de https://locallost.net/?p=233

    Ele verifica se os processos em execução em um sistema ainda estão usando bibliotecas excluídas em virtude de manter cópias das que estão na memória ativa.

    ps xh -o pid |
    while read PROCID; do
           grep 'so.* (deleted)$' /proc/$PROCID/maps 2> /dev/null
           if [ $? -eq 0 ]; then
                   CMDLINE=$(sed -e 's/\x00/ /g' < /proc/$PROCID/cmdline)
                   echo -e "\tPID $PROCID $CMDLINE\n"
           fi
    done
    

104
2017-11-16 11:35



Eu noto só agora este post. É extremamente preciso. Muito obrigado (+1) - Danduk82
De onde vem 'checkrestart'? Não consigo encontrá-lo no Ubuntu Trusty. Eu encontrei "needrestart" que parece que caberia em suas instruções? - Ben XO
Pode ser encontrado no pacote debian-goodies: packages.debian.org/wheezy/debian-goodies. Há também needrestart. Você pode encontrar ambos no Xenial executando: $ apt-cache search checkrestart - ILIV
Eu recebo "E: Não foi possível abrir o arquivo de bloqueio / var / lib / dpkg / lock - open (13: Permission denied)" mesmo com o sudo. Isso é algo específico para uma das atualizações ou os comandos que você forneceu? - Nathan Hornby
O mais provável é que seja uma terminação incorreta / anormal do dpkg que deixou um arquivo de bloqueio não-limpo. Não acontece normalmente até, por ex. a instalação de um pacote não é concluída com sucesso (disco completo, etc.) Você provavelmente não pode executar outros comandos apt-get e dpkg, consegue? - ILIV


substituir /etc/apt/preferences com o seguinte:

Package: *
Pin: release a=lucid-security
Pin-Priority: 500

Package: *
Pin: release o=Ubuntu
Pin-Priority: 50

agora um simples apt-get upgrade atualizará todas as atualizações de segurança apenas.

Por que (e como) isso funciona: O arquivo de preferências irá fixar todos os pacotes da distribuição do Ubuntu para a prioridade 50, o que os tornará menos desejáveis ​​do que os pacotes já instalados. Arquivos originados do repositório de segurança recebem a prioridade padrão (500), portanto, são considerados para instalação. Isso significa que apenas os pacotes considerados mais desejáveis ​​que os atualmente instalados são atualizações de segurança. Mais informações sobre fixação no apt_preferences manpage.

Você pode promover temporariamente uma determinada distribuição para atualizações com o --target-release opção que funciona com apt-get e aptitude (pelo menos) que permitirá fixar certas versões para que sejam elegíveis para atualização.

Se você deseja usar isso apenas para scripts e não torná-lo padrão para o sistema, é possível colocar as regras em algum outro local e usá-lo:

apt-get -o Dir::Etc::Preferences=/path/to/preferences_file upgrade

Isso fará com que o apt procure pelo arquivo de preferências de um local não padrão.

O arquivo de preferências dado como exemplo não se aplica a repositórios de terceiros, se você deseja fixar esses também você pode usar apt-cache policy para determinar facilmente as teclas necessárias para fixar.


46
2017-07-29 04:12



Obrigado por ter tempo para uma resposta completa. Eu pensar Eu entendo como isso funciona. Mas quando eu crio o arquivo / etc / apt / preferences e executo o apt-get upgrade, ele quer atualizar todos os pacotes, não apenas as atualizações de segurança. A atualização da lista antes e depois é exatamente a mesma, exceto com o / etc / apt / preferences ele não quer atualizar o Leafpad, que eu construí da fonte e instalei "manualmente" com o dpkg. É muito estranho para mim, mas pode significar algo para você. - mac9416
Você pode ver o que está acontecendo com o comando de política apt-cache. Escolha um dos pacotes que não está recebendo uma correção de segurança e execute apt-cache policy packagename. Isso listará as prioridades para várias versões. Você deve ver várias linhas e prioridades diferentes. Se não houver linhas com a prioridade 50, a marcação não está afetando os pacotes em questão por algum motivo. - Ressu
Eu havia seguido essa resposta no passado. Hoje descobri que, devido a essa resposta, 68 pacotes de atualização de segurança NÃO foram instalados no meu servidor e não apareceram como possíveis candidatos à instalação. Esta não é uma boa resposta! - Shade


O seguinte é confirmado no Ubuntu 14.04 LTS.

Use o unattended-upgrade pacote.

Olhe o arquivo /etc/apt/apt.conf.d/50unattended-upgrades. Deve haver uma seção no topo que é:

// Automatically upgrade packages from these (origin:archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

Observe como ele foi configurado para permitir somente atualizações não assistidas para pacotes de segurança, por padrão.

Modifique o arquivo /etc/apt/apt.conf.d/10periodic igual a:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";

Isso executará atualizações automáticas de segurança autônoma, uma vez por dia.

Agora, para executar manualmente: sudo unattended-upgrade.

Para testar como um dry-run, sem fazer nada: sudo unattended-upgrade --dry-run.

Fonte: https://help.ubuntu.com/14.04/serverguide/automatic-updates.html


9
2017-10-03 17:18



Existe uma maneira de fazer isso uma programação mensal? - mike.b93
@ mike.b93, acredito que APT::Periodic::Unattended-Upgrade "30"; Faria isso - a cada 30 dias. - vcardillo


Embora seja bastante feio, você pode desabilitar todos os repositórios além do repositório de segurança e fazer:

sudo apt-get update && sudo apt-get upgrade

Eu não testei isso, mas em teoria ele só encontraria atualizações no repositório de segurança e as aplicaria ...


5
2017-07-29 00:00



Sim, essa é uma possibilidade. Eu vou investigar isso. Eu não sou bom em BASH, mas posso tentar fazer um script para fazer isso. - mac9416
OK, eu desativei todos, mas os repositórios de segurança do Ubuntu e corri sudo apt-get update && sudo apt-get upgrade (cancelamento antes de quaisquer atualizações serem feitas). Então eu reativei todos os meus repos, corri sudo apt-get updateee abriu o Gerenciador de Atualizações. Os pacotes marcados como atualizações de segurança não eram exatamente apt-get upgrade encontrado, mas eles eram muito próximos - perto o suficiente para mim. Eu ainda gostaria de saber exatamente como o Gerenciador de Atualizações faz e como fazer o mesmo a partir da linha de comando, mas isso será suficiente. Obrigado! - mac9416


  • apt-get update: apenas leia as entradas no repositório - de acordo com a lista existente. Necessário para verificar o que é novo.
  • apt-get upgrade: todas as atualizações para pacotes instalados sem módulos do kernel. Nenhuma atualização de lançamento.
  • apt-get dist-upgrade: todas as atualizações para pacotes instalados também com módulos do kernel. Nenhuma atualização de lançamento.
  • apt-get com parâmetro -s: somente teste, nenhuma alteração executada.

3
2017-08-02 09:49





Eu não consigo encontrar uma opção no apt-get ou no aptitude, no entanto alguém teve o mesma questão no SuperUser. A única resposta é:

Verifique e ajuste o /etc/apt/apt.conf.d/50unattended-upgrade. Você substituiu 'kármico' pelo nome de código do seu Ubuntu?

Nenhuma resposta sobre se isso funcionou no entanto.


0
2017-07-28 23:04



Parece que o método descrito nessa página wiki depende da configuração do argumento --target-release do aptitude para <release> -security. Como o OP dessa questão, esse método instala todas as atualizações, não apenas as atualizações de segurança. Lendo as páginas man do apt-get e aptitude, eu não acho que o argumento --target-release é mesmo destinado a limitar as atualizações apenas à segurança, embora eu não tenha certeza do que isso é para. - mac9416