Respostas:
Para versões modernas, apt
existe uma opção específica para isso:
apt list --upgradable
Para o apt-get
comando antigo, o -u
switch mostra uma lista de pacotes disponíveis para atualização:
# apt-get -u upgrade --assume-no
Na apt-get
pá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
-u
é uma opção padrão deapt-get
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,
column
da 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
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
O mais fácil é:
apt list --upgradable
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-get
simulação:
apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }'
dist-upgrade
mas 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!
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.
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.
-s, --simulate, --just-print, --dry-run, --recon, --no-act
, recon e run-run são meus favoritos pessoais.
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.
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)
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.
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-run
mas 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
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
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á ligar apt-updates
para obter uma lista de todas as atualizações, independentemente do usuário.
Você ainda precisa ligar apt-get update
com acesso privilegiado.
Aí está a apt-show-versions
ferramenta. Para mostrar as atualizações disponíveis, execute:
apt-show-versions -u
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.