有没有一个地方可以查看我安装的更新?
zcat
/zgrep
/zless
进行搜索和过滤。 - Pablo Bianchicat /var/log/dpkg.log | grep "^2012-03-25.*\ installed\ "
sudo dpkg -i ...
),这些软件包在apt的历史记录中不会显示出来。zgrep "^2012-03-25.*\ installed\ " /var/log/dpkg.log*
对于我们来说,有一个稍微更容易和准确的答案来回答“上次我们修补这个东西是什么时候?”这个问题变得很有用。所以我把它整理了一下。我在12.04、14.04和16.04上进行了测试。它对于那个问题返回了相当准确的答案。 注意:“相当准确”可能不是“完全准确”。 注意:只针对那个问题。
示例输出:
xenial% 9: ./linuxpatchdate
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2
#!/usr/bin/perl
#------------------ subroutines --------------------
sub parseRecord {
my $sdate = "";
my $useful = 0;
my $packages = 0;
my @ptmp;
while (my $recordLine = shift() ) {
if ($recordLine =~ m/^Start-Date: ([\d\-]*).*/) {
$sdate = $1;
}
elsif ($recordLine =~ m/^Commandline:.*upgrade/) {
$useful = 1;
}
elsif ($recordLine =~ m/^Install: (.*)/) {
$recordLine =~ s/\([^\)]*\)//g;
@ptmp = split(/,/,$recordLine);
$packages = $packages + $#ptmp + 1;
}
elsif ($recordLine =~ m/^Upgrade: (.*)/) {
$recordLine =~ s/\([^\)]*\)//g;
@ptmp = split(/,/,$recordLine);
$packages = $packages + $#ptmp + 1;
}
}
if ($useful) {
return ($sdate,$packages);
}
else {
return ("0",0);
}
}
#------------------ main program --------------------
@lines = split(/\n/,`/bin/zcat -f /var/log/apt/history.log /var/log/apt/history*gz`);
my %patchHash;
my $line;
my @inputLines;
my $pushDate = "";
my $pushNum = "";
foreach $line (@lines) {
# all records separated by blank lines
if ($line !~ /./) {
# no-op
}
elsif ($line =~ m/^Start-Date: ([\d\-]*).*/) {
@inputLines = ();
push (@inputLines, $line);
}
elsif ($line =~ m/^End-Date: ([\d\-]*).*/) {
($pushDate, $pushNum) = parseRecord(@inputLines);
if ($pushNum != 0) {
$patchHash{$pushDate} += $pushNum;
}
}
else {
push (@inputLines, $line);
}
}
foreach $pushDate (sort(keys(%patchHash))) {
print "$pushDate $patchHash{$pushDate}\n";
}
/var/log/apt/history.log
。可能会有类似于/var/log/apt/history.log.1.gz
的文件。 - Max Bileschizcat /var/log/apt/history.log.* | perl -00 -ne 'print if /\ninstall/i'
(使用-00
每个段落是一条记录) - Pablo Bianchi/var/log/opt/term.log
也可能会很有帮助。 - Danijel