Listar atualizações disponíveis, mas não instalá-las


209

Quero que meu script de relatório cron-run me notifique caso haja atualizações para meus pacotes. A maneira de fazer é apt-getme fornecer a lista de atualizações disponíveis, mas não faça mais nada?

Respostas:


231

apto

Para versões modernas, aptexiste uma opção específica para isso:

apt list --upgradable

apt-get

Para o apt-getcomando antigo, o -uswitch mostra uma lista de pacotes disponíveis para atualização:

# apt-get -u upgrade --assume-no

Na apt-getpágina do manual :

-u
--show-upgrade
 Mostra pacotes atualizados; Imprima uma lista de todos os pacotes que devem ser atualizados. Item de configuração: APT :: Get :: Show-Upgraded.
--assume-não  automática "não" a todas as solicitações. <== Para impedir que ele comece a instalar

2
Eu estava esperando que isso poderia ser feito sem raiz
— ThorSummoner

19
Se você digitar "Y" e pressione Enter, este comando irá instalar atualizações. Eu recomendaria definitivamente para adicionar "-s", caso contrário, esta resposta é enganosa
— Murmel

5
Essa é uma resposta muito errada, porque (sem opções adicionais) o comando aguarda a entrada e, se o usuário digitar a entrada errada, o pacote está instalado, o que modifica o sistema que não é o que o OP deseja (apenas aconteceu no meu sistema)
— Daniel Alder

E btw: -ué uma opção padrão deapt-get
— Daniel Alder

1
O @ThorSummoner '-s' fará o que você deseja e funciona sem raiz #
— nevelis

67
apt-get --just-print upgrade

Não é lido tão facilmente, abaixo está um liner perl one para analisar a saída do apt-get:

apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}'

Isso deve gerar algo como:

PROGRAM: grub-pc INSTALLED: 1.99-21ubuntu3.1 AVAILABLE: 1.99-21ubuntu3.9

Espero que ajude alguém,


1
só para rir: atualização do apt-get -s | awk -F '[] [()] +' '/ ^ Inst / {printf "Prog:% s \ tcur:% s \ tavail:% s \ n", $ 2, $ 3, $ 4}'
— tink

8
Também poderia ser muito mais agradável à vista, se o uso columnda seguinte forma:apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "PROGRAM: $1 INSTALLED: $2 AVAILABLE: $3\n"}' | column -s " " -t
— AntonioK

1
@AntonioK Parece ótimo!
— nick

1
Receio que esta Perl-código irá cortar minha máquina ...;)
— Chris

33

Outra opção, inspirada no enzotib:

aptitude search '~U' | wc -l

Este comando usará o aptitude para gerar os novos pacotes e, em seguida, wc para apenas contar as linhas.

Em uma nota de rodapé, descobri que a solução do enzotib sem as aspas simples ao redor do ~ U não funcionava para mim. (Wheezy, ZSH, aptidão 0.6.8.2)

Atualização:

Com o novo apt, você pode fazer agora:

apt list --upgradable

Obrigado por isso, o comando apt list era exatamente o que eu queria.
— Dvorak

Bom com esta solução é que você não precisa do sudo / root.
— Gunni

25

O mais fácil é:

apt list --upgradable

não funciona com hortelã.
— 9443 ychaouche

1
É uma pena que isso não retorne códigos de saída diferentes, dependendo se há atualizações disponíveis ou não. Teria sido bom poder usar isso em um script.
— Dale Anderson

18

Você pode correr

aptitude -F%p --disable-columns search ~U

ou o não documentado

/usr/lib/update-notifier/apt-check -p; echo

Outro método usando uma apt-getsimulação:

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'

1
Este comando aptidão trabalhou muito para mim e não exigir raiz
— JamesCW

apt-get -s dist-upgrade funciona muito bom e tem a mesma saída quando você canalizá-lo através desse awker
— ychaouche

obrigado! isso saiu de um pouco de inferno de dependência. estava tentando dist-upgrademas não perder alguns pacotes tão necessários para usar aptitude. aptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')fez o truque!
— precisa

11

Dê uma olhada no pacote "apticron":

apticron - Ferramenta simples para enviar e-mail sobre atualizações de pacotes pendentes

O Apticron é um script simples que envia e-mails diários sobre atualizações de pacotes pendentes, como atualizações de segurança, lidando adequadamente com os pacotes em espera pelo dselect e pelo aptitude.

https://packages.debian.org/buster/apticron


Seu link está quebrado ...
— Alexis Wilke

10
apt-get update && apt-get -s upgrade

listará as atualizações disponíveis sem realmente instalar.

O primeiro comando atualiza os arquivos de índice do pacote antes que a atualização simulada (assim -s) seja concluída. "-s" fará uma atualização simulada mostrando os pacotes que seriam instalados, mas na verdade não instalarão nada.

Pelo contrário, "-u" em vez de "-s" seria instalado após a confirmação.


2
A opção de simulação pode ser acionada com qualquer um de -s, --simulate, --just-print, --dry-run, --recon, --no-act, recon e run-run são meus favoritos pessoais.
— ThorSummoner

9

Eu precisava de informações completas sobre possíveis atualizações, então usei uma modificação da resposta de jasonwryan:

apt-get -V -u upgrade

É uma saída simples e IMO razoavelmente formatada.


3

Basta filtrar a saída de

apt-get update && apt-get -s -V -u upgrade

ter apenas as informações preferidas em seu log.

Provavelmente, você precisará da parte bonita depois da linha

...

Os seguintes pacotes serão atualizados:

...

que tem poucos espaços no começo.


Olá e bem-vindo ao site! Tal como está, sua resposta é basicamente uma reformulação das já existentes e, portanto, não acrescenta nada de novo. Você poderia melhorá-lo, por exemplo, explicando como para filtrar a saída, acrescentando uma explicação do que os vários parâmetros fazer etc.
— terdon

2

Faça outro jato on-line, inspirado nesta resposta :

function a { read input;dpkg -l ${input} | grep " ${input} " | awk '{$1=$2=$3=$4="";print $0}' | sed 's/^ *//';unset input;};{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line $(echo $line | awk '{print $1}' | a )\n"; done;

A saída fica assim (colorida):

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8) Embedded GNU C Library: National Language (locale) data [support]
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2) Common header files for Linux 3.2.0-4
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2) Provide limited super user privileges to specific users

Se você não quiser a descrição curta, use esta:

{ apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print "$1 (\e[1;34m$2\e[0m -> \e[1;32m$3\e[0m)\n"}';} | while read -r line; do echo -en "$line\n"; done;

Resultado:

locales (2.13-38+deb7u7 -> 2.13-38+deb7u8)
linux-headers-3.2.0-4-amd64 (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
linux-headers-3.2.0-4-common (3.2.65-1+deb7u1 -> 3.2.65-1+deb7u2)
sudo (1.8.5p2-1+nmu1 -> 1.8.5p2-1+nmu2)

O liner único é fantástico, exceto que não gera a descrição de alguns pacotes.
— precisa saber é o seguinte

2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

é o mais simples para emails cron; não há iteração do usuário e, se não houver atualizações, não haverá saída.


1

Depois de escrever um aviso para a resposta de @ jasonwryan, desejo fornecer minha própria solução:

apt-get dist-upgrade --assume-no

Infelizmente, este não funciona com o debian wheezy e eu tive que verificar alguns contêineres lxc que ainda não foram atualizados. Este formulário sempre funcionará:

apt-get dist-upgrade </dev/null

Finalmente, eu também queria reformatar a saída. Optei por alterar a chamada novamente (usando, --dry-runmas ignorando todas as saídas adicionais), porque parece mais seguro:

apt-get --dry-run dist-upgrade | awk '
BEGIN{p=0}
/^The/{p=1;t=$0}
/no longer required/{p=0}
#optional: /been kept back/{p=0}
p && t{print t;t=""}
/^  / && p{print $0}
'

Devoluções:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip

1

apt-check é provavelmente o método de script mais eficiente.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1

Uma modificação muito pequena mostra apenas as atualizações de segurança.

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2

0

Como variação, uso o seguinte:

apt-get -V -s dist-upgrade \
    |grep -E "^   .*=>.*" \
    |awk 'BEGIN {
        ul=sprintf("%*s",40,""); gsub(/ /,"-",ul);
        printf "%-30s %-30s %-30s\n", "Package", "Installed", "Available";
        printf "%-30.30s %-30.30s %-30.30s\n", ul, ul, ul;
     }
     {
        printf "%-30s %-30s %-30s\n",
               $1,
               substr($2,2),
               substr($4,1,length($4)-1)
     }'

Coloque-o em um script chamado apt-updatese você poderá ligar apt-updatespara obter uma lista de todas as atualizações, independentemente do usuário.

Você ainda precisa ligar apt-get updatecom acesso privilegiado.


a saída mostra apenas o nome do pacote (primeira coluna), a segunda coluna sempre imprime "=" e a terceira coluna está sempre vazia. Estou na casa da moeda.
— 9443 ychaouche


0

Eu gosto de usar isso:

apt-get -qq update && apt-get -qq -s upgrade

Você obtém uma saída como esta:

Inst linux-base [3.5] (4.5~deb8u1 Debian-Security:8/oldstable [all])
Conf linux-base (4.5~deb8u1 Debian-Security:8/oldstable [all])

se houver atualizações disponíveis e nenhuma, se não houver. Dessa forma, você pode simplesmente associá-lo a uma solução de monitoramento.

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.