列出可用更新,但不安装它们


208

我希望我的cron运行报告脚本能够在程序包有更新的情况下通知我。是一种方法,可以apt-get给我可用的更新列表,但不执行其他任何操作?

Answers:


231

易于

对于现代版本,apt有一个特定的开关:

apt list --upgradable

适当的

对于旧apt-get命令,-u开关显示可升级的软件包列表:

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

apt-get手册页

-u
--show-upgradeed
 显示升级的软件包;打印出所有要升级的软件包的列表。配置项:APT :: Get :: Show-Upgradeed。
--assume-no  对所有提示自动“否”。<==为了防止它开始安装

2
我希望这可以在没有根的情况下完成
ThorSummoner 2015年

19
如果键入“ Y”并按Enter,此命令安装更新。我肯定会推荐加“-s”,否则这个答案是误导
Murmel

5
这是一个非常错误的答案,因为(没有其他选项)该命令等待输入,并且如果用户输入错误的输入,则会安装该软件包,这将修改系统,这不是OP想要的(只是发生在我的系统上)
Daniel Alder 2015年

顺便说一句:-uapt-get
Daniel Alder

1
@ThorSummoner'-s'将做您想做的事而无需root
nevelis 2015年

67
apt-get --just-print upgrade

不太容易阅读,下面是解析apt-get输出的perl一个内衬:

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"}'

这应该输出类似:

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

希望它会帮助别人,


1
只是为了笑:apt-get -s upgrade | awk -F'[] [()] +''/ ^ Inst / {printf“ Prog:%s \ tcur:%s \ tavail:%s \ n”,$ 2,$ 3,$ 4}'
修补

8
如果这样使用,它的外观也可能会好得多columnapt-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看起来很棒!
尼克

1
恐怕这个Perl代码会入侵我的机器...;)
克里斯(Chris

33

受enzotib启发的另一种选择:

aptitude search '~U' | wc -l

此命令将使用aptitude输出新软件包,然后使用wc只是计算行数。

在一个旁注中,我发现enzotib的解决方案在〜U周围没有单引号不适合我。(Wheezy,ZSH,能力0.6.8.2)

更新:

有了新的apt,您现在可以执行以下操作:

apt list --upgradable

为此,apt list命令正是我想要的。
dvorak

这个解决方案的好处是您不需要sudo / root。
Gunni

25

最简单的是:

apt list --upgradable

不适用于薄荷糖。
ychaouche

1
遗憾的是,根据是否有可用的升级,它不会返回不同的退出代码。能够在脚本中使用它会很好。
戴尔·安德森

18

你可以跑

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

或无证件

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

使用apt-get模拟的另一种方法:

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

1
这个
智能

apt-get -s dist-upgrade也可以很好地工作,并且在通过该awker进行管道传输时具有相同的输出
ychaouche

谢谢!这摆脱了很多依赖地狱。我试图dist-upgrade但不丢失一些需要使用的软件包aptitudeaptitude install $(apt-get -s dist-upgrade | awk '/^Inst/ { print $2 }')做到了!
Jayen

11

看一看“ apticron”软件包:

apticron-用于邮寄有关待处理软件包更新的简单工具

Apticron是一个简单的脚本,它每天发送有关待处理的软件包更新(例如安全更新)的电子邮件,并通过dselect和aptitude正确处理保留的软件包。

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


您的链接已断开...
Alexis Wilke '18

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

将列出可用更新,而无需实际安装。

在完成模拟(因此-s)升级之前,第一个命令将更新软件包索引文件。“ -s”将进行模拟升级,显示将安装但实际上不会安装任何包的数据包。

相反,在确认后实际上将安装“ -u”而不是“ -s”。


2
可以使用-s, --simulate, --just-print, --dry-run, --recon, --no-act,侦查和空运行中的任何一个来触发我的个人收藏夹,该模拟选项。
ThorSummoner 2015年

9

我需要有关可能升级的完整版本信息,因此我对jasonwryan的答案进行了修改:

apt-get -V -u upgrade

这很简单,而且IMO的格式合理。


3

只需过滤输出

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

在日志中仅包含首选信息。

最有可能的是,您需要在生产线之后添加漂亮的部分

...

以下软件包将被升级:

...

开头没有空格。


嗨,欢迎来到该网站。就目前情况而言,您的答案基本上是对现有答案的重新整理,因此不会添加任何新内容。您可以通过改进,例如,解释如何过滤输出,加入什么样的各种开关等做一个解释
terdon

2

受此答案启发,喷射另一架飞机:

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;

输出看起来像这样(彩色):

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

如果您不希望简短说明,请使用以下内容:

{ 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;

输出:

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)

一个内衬很好,只是它不输出某些包装的描述。
ychaouche

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

对Cron电子邮件来说是最简单的;没有用户迭代,并且如果没有更新,则没有输出。


1

在对@jasonwryan的答案写警告之后,我想提供自己的解决方案:

apt-get dist-upgrade --assume-no

不幸的是,这与debian wheezy不兼容,我不得不检查一些仍未升级的lxc容器。此表格将始终有效:

apt-get dist-upgrade </dev/null

最后,我还想重新格式化输出。我选择再次更改呼叫(使用--dry-run但忽略所有其他输出),因为它感觉更安全:

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}
'

返回值:

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

1

apt-check 是最有效的脚本编制方法。

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

很小的修改仅显示安全更新。

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

0

作为变体,我使用以下内容:

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)
     }'

将其粘贴到一个名为的脚本中apt-updates,然后您可以调用apt-updates以获取所有更新的列表,而不管用户如何。

您仍然需要以apt-get update特权访问权限进行呼叫。


输出仅显示软件包名称(第一列),第二列始终打印“ =”,第三列始终为空。我在造币厂。
ychaouche


0

我喜欢用这个:

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

您会得到如下输出:

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

如果有可用的更新,则没有更新。这样,您可以简单地将其与监视解决方案结合在一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.