我希望我的cron运行报告脚本能够通知我,以防我的软件包有更新。是一种让apt-get向我提供可用更新列表但又什么都不做的方法吗?

#1 楼

apt
对于现代版本的apt,有一个特定的开关:
apt list --upgradable
对于旧的apt-get命令,-u开关显示可用软件包的列表。升级:
# apt-get -u upgrade --assume-no

apt-get手册页:

-u
--show-upgradeed显示升级的软件包;打印出所有要升级的软件包的列表。配置项:APT :: Get :: Show-Upgraded。-假定否所有提示均自动“否”。 &lt ==为防止其开始安装


评论


我希望没有root就可以做到

–雷神召唤师
2015年2月6日,17:33

如果键入“ Y”并按Enter,此命令将安装更新。我绝对建议添加“ -s”,否则此答案会产生误导

–默默尔
15年6月17日在7:26

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

–丹尼尔·奥尔德(Daniel Alder)
2015年11月1日下午13:11

顺便说一句:-u是apt-get的默认选项

–丹尼尔·奥尔德(Daniel Alder)
2015年11月1日下午13:17

@ThorSummoner'-s'将做您想做的事而无需root

–nevelis
2015年12月16日23:47

#2 楼

apt-get --just-print upgrade


读起来不太容易,下面是一个Perl一种衬里,用于解析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:  INSTALLED:  AVAILABLE: \n"}'


希望对其他人有帮助,

评论


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

– tink
13年5月17日在3:19

如果使用这样的列,它的外观也可能会好得多:apt-get --just-print upgrade 2>&1 | perl -ne'if(/ Inst \ s([\ w,\-,\ d,\。,〜,:,\ +] +)\ s \ [([[ww,\-,\ d,\。 ,〜,:,\ +] +)\] \ s \(([[w,\-,\ d,\。,〜,:,\ +] +)\)?/ i){print“ PROGRAM:已安装$ 1:可用的$ 2:$ 3 \ n“}'|列-s“” -t

– AntonioK
15年7月14日在11:35

@AntonioK看起来很棒!

–尼克
16年11月10日在5:47

恐怕这个Perl代码会入侵我的机器...;)

–克里斯
18年6月26日在15:14

@AntonioK您如何按字母顺序对程序名称进行排序?

– Richie
20年1月29日在12:51

#3 楼

另一个受enzotib启发的选项:

aptitude search '~U' | wc -l

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

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

更新:

使用新的apt可以做到:

apt list --upgradeable

评论


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

– dvorak
17年6月22日在16:19

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

– Gunni
17-10-10在15:17

#4 楼

最简单的是:

apt list --upgradeable

评论


在薄荷糖上不起作用。

–ychaouche
17年2月9日在9:31

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

–戴尔·安德森(Dale Anderson)
17年5月5日在19:32

#5 楼

您可以运行

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


评论


这个智能命令对我来说非常有效,不需要root

–JamesCW
16年5月5日在18:22

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

–ychaouche
17年2月9日在9:28



谢谢!这摆脱了很多依赖地狱。试图进行dist-upgrade,但不丢失某些软件包,因此需要使用aptitude。 aptitude install $(apt-get -s dist-upgrade | awk'/ ^ Inst / {print $ 2}')达到了目的!

–贾恩
17年12月3日在10:18

#6 楼

看一下“ apticron”软件包:

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


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


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

评论


您的链接已损坏...

– Alexis Wilke
18年9月1日23:51

#7 楼

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


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

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

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

评论


我个人最喜欢使用-s,-simulate,-just-print,-dry-run,-recon,-no-act,recon和dry-run中的任何一个来触发模拟选项。

–雷神召唤师
15年12月17日在17:24

#8 楼

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


#9 楼

只需过滤

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


的输出即可在日志中仅包含首选信息。

很可能,您需要漂亮的部分行之后


...

以下软件包将被升级:

...


开头没有空格。

评论


嗨,欢迎来到该网站。就目前而言,您的答案基本上是对现有答案的重新提炼,因此不会添加任何新内容。您可以通过例如解释如何过滤输出,添加各种开关的功能说明等来改进它。

– terdon♦
2014年11月19日在17:29

#10 楼

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


对cron电子邮件最简单;没有用户迭代,如果没有更新,则没有输出。

#11 楼

喷射另一架飞机,
受到这个答案的启发:

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


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

 q4312079q 


输出:

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
17年2月9日在10:12

#12 楼

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


#13 楼

在为@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=
The following packages have been kept back:
  iproute
The following packages will be upgraded:
  unzip
} /no longer required/{p=0} #optional: /been kept back/{p=0} p && t{print t;t=""} /^ / && p{print q4312078q} '


返回值:

q4312078q

#14 楼

我喜欢这样使用:

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


你会得到这样的输出:是可用的更新,如果没有,则没有更新。这样,您可以简单地将其与监视解决方案相结合。

#15 楼

作为变体,我使用以下命令:

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",
               ,
               substr(,2),
               substr(,1,length()-1)
     }'


将其粘贴到名为apt-updates的脚本中,然后您可以调用apt-updates以获得所有更新的列表,而与用户无关。 br />
您仍然需要通过特权访问来调用apt-get update

评论


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

–ychaouche
17-2-9在10:15



#16 楼

apt-show-versions工具。要显示可用更新,请运行:

apt-show-versions -u