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.