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

168

Eu quero que meu script de relatório de execução do cron avise-me caso haja atualizações para meus pacotes. Essa é uma maneira de fazer com que apt-get me forneça a lista de atualizações disponíveis, mas não faça mais nada?

    
por Morris 26.08.2011 / 12:14

16 respostas

175

apt

Para versões modernas de apt , há uma opção específica para isso:

apt list --upgradable

apt-get

Para o antigo comando apt-get , a opção -u mostra uma lista de pacotes disponíveis para atualização:

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

Na apt-get man page :

-u
--show-upgraded
 Show upgraded packages; Print out a list of all packages that are to be upgraded. Configuration Item: APT::Get::Show-Upgraded.
--assume-no  Automatic "no" to all prompts. &lt== To prevent it from starting to install
    
por 26.08.2011 / 12:22
63
apt-get --just-print upgrade

Não é lido tão facilmente, abaixo está um perl liner 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 mostrar algo como:

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

Espero que ajude alguém,

    
por 14.05.2013 / 17:27
31

Outra opção, inspirada na enzotib:

aptitude search '~U' | wc -l

Este comando irá usar o aptitude para mostrar os novos pacotes e depois wc apenas contar as linhas.

Em um sidenote, descobri que a solução da enzotib sem as aspas simples ao redor do ~ U não funcionou para mim. (Wheezy, ZSH, aptitude 0.6.8.2)

Atualização:

Com o novo apt você pode fazer agora:

apt list --upgradable
    
por 26.06.2013 / 23:58
25

O mais fácil é:

apt list --upgradable
    
por 30.11.2016 / 20:35
17

Você pode executar

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 simulação apt-get :

apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
    
por 26.08.2011 / 12:19
11

Dê uma olhada no pacote "apticron":

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

link

    
por 26.08.2011 / 13:42
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 de pacotes antes que a atualização simulada (assim -s) seja feita. "-s" fará uma atualização simulada mostrando os pacotes que serão instalados, mas que na verdade não instalarão nada.

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

    
por 11.08.2013 / 12:51
8

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.

    
por 15.07.2014 / 19:30
3

Basta filtrar a saída de

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

para ter apenas as informações preferidas em seu registro.

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

...

The following packages will be upgraded:

...

que tem poucos espaços no começo.

    
por 19.11.2014 / 17:45
2

Jet outro on-liner, inspirado por esta 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 é 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 uma breve descrição, 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;

Saída:

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)
    
por 03.03.2015 / 23:19
2
apt-get update > /dev/null && apt-get --just-print upgrade | grep "Inst "

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

    
por 27.04.2017 / 08:35
1

Depois de escrever um aviso para a resposta do @jasonwryan, quero 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 funcionará sempre:

apt-get dist-upgrade </dev/null

Por fim, também quis reformatar a saída. Eu escolhi mudar a chamada novamente (usando --dry-run , mas ignorando todas as saídas adicionais) porque é 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}
'

Retorna:

The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip
    
por 01.11.2015 / 14:38
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
    
por 04.11.2016 / 22:19
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-updates e você poderá chamar apt-updates para obter uma listagem de todas as atualizações, independentemente do usuário.

Você ainda precisa chamar apt-get update com acesso privilegiado.

    
por 02.11.2016 / 12:26
0

Existe a ferramenta apt-show-versions . Para mostrar as atualizações disponíveis, execute:

apt-show-versions -u
    
por 26.10.2017 / 19:03
0

Eu gosto de usar isso:

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

Você recebe 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. Desta forma, você pode simplesmente juntá-lo com uma solução de monitoramento.

    
por 20.07.2018 / 14:03

Tags