如何查看apt-get安装的历史记录?


18

如何查看apt-get install已手动执行的命令的历史记录?

在我看来,所有可用方法都显示了从Ubuntu安装开始就已经安装的所有内容。

apt-get install自系统安装过程完成以来,如何查看历史记录?


嗯,是。您还会期待什么?您是否只想显示从终端运行的那些而不显示由GUI或某些东西运行的那些?请编辑您的问题并进行澄清。
terdon

@terdon Okay进行了新的编辑
TellMeWhy 2015年

1
还有的日志dpkg/var/log/dpkg.log*
Velkan

1
@ParanoidPanda这会以各种方式失败。历史记录被截断,在其他shell中运行的东西,从历史记录中删除的东西或从不放在首位的东西,从脚本安装的东西,其他用户运行的东西等
乌贼2015年

1
@MrBones:我知道,我已经在我的回答(以及它下面的评论)中这样说。但是,OP要求在手动执行apt-get install安装软件包的命令时查看所有实例的方法,并且我提供了一种解决方案,除非历史文件已以某些方式更改(例如:条目具有已删除)。

Answers:


20

我认为给出的答案在这里科斯是迄今为止我见过的最好的方式。尽管正如Software Center所使用的apt,它也会列出所有已安装的内容。

该命令是:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

我回家后会进行测试,如果可以的话,请接受:)
TellMeWhy 2015年

不是!检查出的更新:askubuntu.com/a/680405/320386
科斯

使用这个,是这个任务的方法更安全:zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?=.* install ) \K.*' | sed '1,4d'grep -Po '^Commandline:(?=.* install ) \K.*'只有将筛选apt-get包含命令install用开头和结尾的空间,sed '1,4d' 可能是依赖于特定的安装; 我的中的1,4会删除您要删除的来自Ubiquity的条目的确切数目。让我知道您安装的号码是否相同,这样至少我们有一个基线:|
kos 2015年

@kos我得到了额外的行,例如apt-get -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y --no-remove install linux-generic新命令。他们是无所不在的界线吗?
Arronical

不,它们看起来像来自Software Updater。apt-get除了只能运行一次的Ubiquity(例如,aptdaemon条目也将由该命令显示)之外,没有办法与用户运行的命令和某些前端运行的命令区分开。最好的选择仍然是使用该命令,该命令至少要排除“泛在”条目。
kos 2015年


3

为了简化@Arronical答案,我最近学到的一个巧妙技巧是,您可以同时使用zcat -qftxt和txt压缩文件。

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

变成

zcat -qf /var/log/apt/history.log* | grep -Po '^Commandline: apt-get install (?!.*--reinstall)\K.*'

来自man zcat:

   -q --quiet
          Suppress all warnings.
   -f --force
          Force  compression  or  decompression  even if the file has multiple links or the corre‐
          sponding file already exists, or if the compressed data is read from  or  written  to  a
          terminal.  If  the  input  data is not in a format recognized by gzip, and if the option
          --stdout is also given, copy the input data without change to the standard  output:  let
          zcat  behave  as  cat.  If -f is not given, and when not running in the background, gzip
          prompts to verify whether an existing file should be overwritten.

2

这是只打印当前安装的脚本 顶级软件包的,其中“顶级软件包”定义为没有其他atp软件包所依赖的atp软件包。如果此类顶级程序是由atp或软件包管理器(如synaptic)安装的,则它们是由用户手动选择的。

#!/bin/sh
NumDaysAgo=18
find /var/lib/dpkg/info -name "*.list" -mtime -$NumDaysAgo \
    -exec stat -c $'%y\t%n' {} \; | \
sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list,,' | \
sort -r | \
while read Date Time Xxx Pkg
do 
    lncnt=$(apt-cache --installed rdepends $Pkg | wc -l)
    if [ $lncnt -eq "2" ]
        then echo "$Date $Time $Pkg"
    fi
done
echo "JOB COMPLETED: $BASH_SOURCE"

假定用户更可能希望更快地获取新信息并且程序运行缓慢,则以相反的顺序打印软件包。

程序流程:

  • 该程序首先通过读取下的文件名将所有已安装软件包收集到一个列表中/var/lib/dpkg/info/。文件修改时间是安装时间。
  • 该列表以相反的顺序排序。
  • 对于每个已安装的软件包$Pkg,调用来apt-cache rdepends $Pkg 请求的反向依赖性$Pkg。如果没有依赖项,则它是顶级程序包,并打印该程序包信息:日期时间程序包名称

笔记:

  • 脚本取决于的输出格式 apt-cache rdepends $Pkg旨在供人眼并且在apt的未来版本中可能会更改。
  • 在/ var / lib / dpkg / info /下收集文件名的部分的代码来自 此unix.stackexchange帖子。正如那个海报“ mikel”所指出的那样,dpgk历史日志文件是不可靠的,因为它们在达到一定容量后将被轮换出来。
  • 的手册页 apt-chache
  • 该调用apt-cache rdepends ...很慢,大概是因为每个调用都是通过迭代所有依赖项来计算的。因此,以上脚本从最新安装开始,以为用户提供尽可能多的即时满足感。
  • --installed后面的标志apt-cache检查dpkg安装的软件包是否也已正确安装。如果用户或其他安装软件绕过apt并直接使用dpkg,则有可能。这种情况还没有经过测试,但是我认为标准输出或错误输出中都会打印一些值得注意的东西
  • 输出不包括手动选择的程序包,这些程序后来被更高的程序包所依赖。输出还可以包括其他第三方安装软件通过apt安装的软件包,因此不是真正的手动安装。但是,如果输出的目的是从/home包括所述第三方软件的备份目录中设置恢复的linux的基础,则此输出将是合适的。
  • 一些软件包名称包含版本号,而有些则不包含。提及只是为了使人们意识到事实。

1

如果要运行,请查看所有已安装的东西:

sudo apt-get install [package]

而且您没有弄乱bash历史记录,也不想查看其他用户(或所有用户)的这种安装类型的历史记录,那么您可以运行:

history | grep "apt-get install"

这应该可以为您带来最相关的结果。


1
我会得到所有的历史吗?
TellMeWhy 2015年

@DevRobot:除非你手动修改的条目与apt-get install其中的的.bash_history文件,或删除该文件,则该命令会显示所有的情况下,当你执行用字符串命令apt-get install对您的用户帐户中它(即使你以root身份运行命令,因此不完全以您的用户帐户身份运行-使用来运行命令sudo

2
它可能有一个问题,如果你已经进入了200多个命令虽然
Arronical

2
@提出索赔时需要Arronical证明;-)
Rinzwind

1
我本人会假设默认值为 500(gnu.org/software/bash/manual/html_node/…)。
Rinzwind

1

如果需要apt-get install命令历史记录,请使用以下命令:

grep "apt-get install" .bash_history

输出:

ravan@ravan:~$ grep "apt-get install" .bash_history

sudo apt-get install --no-install-recommends ubuntu-mate-core ubuntu-mate-desktop
sudo apt-get install xfce4
sudo apt-get install xfce4.12
sudo apt-get install pgadmin
sudo apt-get install touchegg
sudo apt-get install aptitude
sudo apt-get install aptitude
sudo gedit .bash_history | grep "apt-get install" 
sudo apt-get installvim
grep "apt-get install" .bash_history
cat .bash_history | grep "apt-get install" 

有关其他信息,请参阅其他信息

还有在更详细的信息/var/log/apt/history.loghistory.log.X.gz文件和term.logterm.log.X.gz文件

如果您只想要apt-get包含命令的历史记录,则

history | grep apt-get


apt-mark showmanual显示了同时安装了操作系统的所有软件包,而不仅仅是实际手动安装的软件包。这是一种奇怪的行为方式!
Arronical

1
这不一定提供有关历史的特定详细信息。人们需要查看的是/var/log/apt/history.log类似文件。您只会获得手动选择和自动选择的软件包的列表。您不会从此答案中给出安装时间,删除时间,升级时间等的任何时间顺序历史记录。
托马斯·沃德

@Arronical-手册页在哪里apt -mark showmanual?我在Ubuntu 16.04 LTS手册页上找不到以下内容apt:< manpages.ubuntu.com/manpages/xenial/en/man8/apt.8.html >。
克雷格·希克斯


0

为了查看您已安装和删除,重新安装等内容。有关apt-get安装过程的更多信息。

答案可以修改为别名:

alias apted='zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | fgrep Commandline: | cut -d " " -f 2- | grep -P "^|install"'

0

请注意,可以在安装前设置一些参数,例如在安装过程中virtualmin脚本所做的设置:apt-get -y install packagename。

因此,如果要捕获所有安装命令,则需要更改正则表达式查询。

zcat -qf /var/log/apt/history.log* | grep -Po '^Commandline: apt-get.*install (?!.*--reinstall)\K.*'
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.