Como posso instalar apenas atualizações de segurança na linha de comando?


333

sudo apt-get upgradeinstala todas as atualizações, não apenas as atualizações de segurança. Sei que posso usar o Update Manager para selecionar apenas atualizações de segurança importantes, mas existe uma maneira de fazer isso na linha de comando?


2
Acho que não. O dist-upgrade leva todo o sistema para uma nova versão. Estou falando de atualizações diárias, como as que você vê no Gerenciador de Atualizações.
Michael Crenshaw

1
Oh, entendo o que você está dizendo agora. Heh, eu corro o apt-get update tantas vezes, digito sem pensar. Obrigado pelo alerta!
Michael Crenshaw

7
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). O uso de "dist-upgrade" significa que ele manipulará as dependências variáveis ​​dos novos pacotes. Isso pode ser importante.
Kees Cook

3
dist-upgrade é a operação normal executada pela GUI do Update Manager. Para pacotes como o kernel em que há um linux-image-genericpacote, dependendo da imagem atual, por exemplo linux-image-3.x.y-zz-generic(cada versão possui um nome de pacote separado), dist-upgrade (que permite a instalação de novos pacotes para satisfazer dependências) fará essa atualização , enquanto a atualização mostrará o pacote do kernel como retido.
chronitis

3
Surpreendente que não há boas apt-getrespostas com base para isso, considerando como proeminente ela está listada em cada servidor
Karthik T

Respostas:


308

As atualizações autônomas do pacote oferecem funcionalidade para instalar atualizações de segurança automaticamente.

Você pode usar isso, mas, em vez de configurar a parte automática, pode chamá-la manualmente:

sudo unattended-upgrade -d --dry-run
sudo unattended-upgrade -d

Se você deseja executá-lo silenciosamente:

sudo unattended-upgrade

NOTA: Quando você chama a atualização autônoma, deixa "s" no final.

Isso pressupõe que o pacote esteja instalado por padrão, o que provavelmente é. Caso contrário, faça:

sudo apt-get install unattended-upgrades

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


Para desabilitar a execução automática de unattended-upgradevocê provavelmente está precisando de modificar /etc/cron.daily/apt, mas não tenho certeza que é "correta" de fazê-lo
Jaime Hablutzel

Nota: para o servidor Ubuntu 12.04.5 LTS, unattended-upgradesnão está instalado por padrão.
Raptor

13
Como você está fazendo isso na linha de comando, use -vpara mensagens informativas ou -dpara mensagens de depuração. Caso contrário, o utilitário ficará muito silencioso; nesse caso, você precisará verificar os logs /var/log/unattended-upgrades. Você também pode usar --dry-runpara simular, mas não atualizar nada. Para mais informações e outras opções, use --helppara obter a mensagem de ajuda.
ADTC

eu aprendi algumas coisas sobre unattended-upgradeshoje. obrigado!
the0ther

"para monitorar como vai", é apenas depurar mensagens não interativas, certo?
Aquarius Power

116

Algumas dicas sobre como gerenciar atualizações

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

  • 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"
    
  • Instale 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 fossem provenientes do repositório $ release-updates. É assim que me disseram, porque os desenvolvedores do Ubuntu enviam atualizações de segurança para o repositório $ release-updates, além de 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 do pacote. 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 (motivo mais comum) carregada na memória antes de instalar o novo pacote que corrige uma vulnerabilidade de segurança ou o que for.

    checkrestart -v
    

    No entanto, lembre-se de que checkrestartpode listar processos que não devem necessariamente ser reiniciados. Por exemplo, o serviço PostgreSQL pode manter em sua memória a referência a um arquivo 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 bash 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 daquelas 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
    

1
Percebo apenas agora este post. É extremamente preciso. Muito obrigado (+1)
Danduk82 13/05

de onde vem o 'checkrestart'? Não consigo encontrá-lo no Ubuntu Trusty. Encontrei "needrestart" que parece caber em suas instruções?
Ben XO

Pode ser encontrado no pacote debian-goodies: packages.debian.org/wheezy/debian-goodies . Também há necessidade de reiniciar. Você pode encontrar os dois no Xenial executando: $ apt-cache search checkrestart
ILIV

Recebo "E: Não foi possível abrir o arquivo de bloqueio / var / lib / dpkg / lock - open (13: Permissão negada)" mesmo com o sudo. Isso é algo específico para uma das atualizações ou comandos que você forneceu?
Nathan Hornby

Provavelmente, trata-se de uma finalização incorreta / anormal do dpkg que deixou um arquivo de bloqueio não esclarecido. Isso não acontece normalmente até que, por exemplo, a instalação de um pacote não seja concluída com êxito (disco completo, etc.). Você provavelmente não pode executar outros comandos apt-get e dpkg, pode?
ILIV

46

substitua /etc/apt/preferencespelo seguinte:

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

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

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

Por que (e como) isso funciona: O arquivo de preferências fixará todos os pacotes da distribuição Ubuntu na prioridade 50, o que os tornará menos desejáveis ​​do que os pacotes já instalados. Os arquivos originários do repositório de segurança recebem a prioridade padrão (500) para que sejam 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 como fixar na página de manual apt_preferences .

Você pode promover temporariamente uma certa distribuição de atualizações com a --target-releaseopção que funciona com ( apt-gete aptitudepelo menos) que permite fixar determinadas liberaçõ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, você pode colocar as regras em outro local e usá-lo:

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

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

O arquivo de preferências fornecido como exemplo não se aplica a repositórios de terceiros, se você também deseja fixá-los, pode usar apt-cache policypara determinar facilmente as chaves necessárias para fixação.


Obrigado por reservar um tempo para uma resposta completa. Eu acho que entendo como isso funciona. Mas quando eu crio o arquivo / etc / apt / preferências e executo o apt-get upgrade, ele deseja 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 / preferências que ele não deseja atualizar o Leafpad, que eu construí a partir da fonte e instalei "manualmente" com o dpkg. É muito estranho para mim, mas pode significar algo para você.
Michael Crenshaw

1
Você pode ver o que está acontecendo com o comando apt-cache policy. 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 diferentes prioridades. Se não houver linhas com a prioridade 50, a fixação não está afetando os pacotes em questão por algum motivo.
Ressu

1
Eu tinha 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

12

O seguinte é confirmado no Ubuntu 14.04 LTS.

Use o unattended-upgradepacote.

Veja o arquivo /etc/apt/apt.conf.d/50unattended-upgrades. Deve haver uma seção na parte superior 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 apenas atualizações autônomas de pacotes de segurança, por padrão.

Modifique o arquivo /etc/apt/apt.conf.d/10periodicsemelhante 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 de segurança automáticas automáticas, 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


Existe uma maneira de fazer disso uma programação mensal?
Mike.b93

1
@ mike.b93, acredito que a configuração APT::Periodic::Unattended-Upgrade "30";faria isso - a cada 30 dias.
Vcardillo # 23/17

5

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

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

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


Sim, é uma possibilidade. Eu vou dar uma olhada. Não sou bom em BASH, mas posso tentar criar um script para fazê-lo.
Michael Crenshaw

OK, desabilitei todos, exceto os repositórios de segurança do Ubuntu e executei um sudo apt-get update && sudo apt-get upgrade(cancelando antes de qualquer atualização). Em seguida, reativei todos os meus repositórios, executei sudo apt-get updateee abri o Update Manager. Os pacotes marcados como atualizações de segurança não foram exatamente o apt-get upgradeque foram encontrados, mas estavam muito próximos - próximos o suficiente para mim. Eu ainda gostaria de saber exatamente como o Update Manager faz isso e como fazer o mesmo na linha de comando, mas isso fará. Obrigado!
Michael Crenshaw

3
  • apt-get update: basta ler as entradas no repositório - de acordo com a lista existente. Necessário para verificar o que há de 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-getcom parâmetro -s: somente teste, nenhuma alteração realizada.

0

No Debians, eu uso este comando para fazer apenas atualizações de segurança:

apt-get install -y --only-upgrade $( apt-get --just-print upgrade | awk 'tolower($4) ~ /.*security.*/ || tolower($5) ~ /.*security.*/ {print $2}' | sort | uniq )

0

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

Check and adjust /etc/apt/apt.conf.d/50unattended-upgrade. 
Did you replace 'karmic' with the code name of your Ubuntu?

Nenhuma resposta sobre se isso funcionou no entanto.


2
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 pergunta, esse método instala todas as atualizações, não apenas as atualizações de segurança. Lendo as páginas de manual do apt-get e do aptitude, não acho que o argumento --target-release tenha como objetivo limitar as atualizações apenas à segurança, embora não tenha certeza do que serve .
Michael Crenshaw

0

Aqui está um script que consegue isso de algumas maneiras diferentes:

#!/usr/bin/env bash
set -e

# List upgradable packages
apt-get update
apt list --upgradable 2>/dev/null
# List security upgrades
test "$(apt-get upgrade -s -y)" && (apt-get upgrade -s -y)
# List upgradable apt packages then upgrade
apt-get update && apt-get upgrade -y  -V | grep '=>' | awk '{print$1}' && test "$(apt-get upgrade -y)"
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.