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?

Michael Crenshaw
fonte
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.

azulado
fonte
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
    
EU VIVO
fonte
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.

Ressu
fonte
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

vcardillo
fonte
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 ...

Stephen RC
fonte
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.
fusor
fonte
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 )
pressione o botão
fonte
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.

Ross
fonte
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)"
Seth Bergman
fonte