包管理工具apt的历史记录与日志分析
包管理工具 apt 的历史记录与日志分析
相信每个用 Linux 的都会遇到这种情形,用 apt 或 yum 装软件的时候跟随一起装一大堆依赖,但是在卸载时这些依赖并没有一起跟着卸载(autoremove 命令也没用),这时候我们也不知道安装的这些依赖的名字,无法手动卸载,该怎么办呢?我想大多数人的第一反应会是找日志或者历史记录,我也是这么想的,但是关于这方面的中文资料几乎没有,反正我是没有搜到。然而用英文搜索却很容易就找到了。学好英语真的很重要,中文资料实在太少了。。
用中文搜索最多会找到 dpkg 的日志文件记录在/var/log/dpkg.log 中,但是在 dpkg.log 中不光记录了安装或删除了哪个软件包,实际上是记录了安装的每一个软件包的详细安装过程,有很多我们不需要的信息,分析起来比较麻烦。
然而,其实 apt 也是有详细的日志的,日志文件位于/var/log/apt/history.log,其中详细的记录了每一条 apt 命令的开始时间、结束时间、输入的命令、安装和删除的软件包等等,尤其是输入的 apt 的命令和安装、删除的软件包这两条命令非常适合我们重现或者反操作之前输入的 apt 命令。其具体的日志格式是这样的:
Start-Date: 2013-12-20 20:34:55 Commandline: apt-get autoremove Remove: gir1.2-json-1.0:amd64 (0.15.2-0ubuntu1), gir1.2-coglpango-1.0:amd64 (1.14.0-0ubuntu1), gir1.2-gdesktopenums-3.0:amd64 (3.6.1-0ubuntu1), libtracker-miner-0.14-0:amd64 (0.14.5-1ubuntu1), libtracker-sparql-0.14-0:amd64 (0.14.5-1ubuntu1), gir1.2-cogl-1.0:amd64 (1.14.0-0ubuntu1), gir1.2-clutter-1.0:amd64 (1.12.2-0ubuntu3.1) End-Date: 2013-12-20 20:35:00
另外还有一种方法就是使用新立得软件包管理器,它自带历史记录,但是每次安装都得打开新立得太麻烦了,个人很少使用。
除了上面这些外,还有一个简单的日记分析脚本,apt-history script,将以下脚本添加到/root/.bashrc 中(注意必须是 root,否则不能使用):
function apt-history(){ case "$1" in install) cat /var/log/dpkg.log | grep 'install ' ;; upgrade|remove) cat /var/log/dpkg.log | grep $1 ;; rollback) cat /var/log/dpkg.log | grep upgrade | \ grep "$2" -A10000000 | \ grep "$3" -B10000000 | \ awk '{print $4"="$5}' ;; *) cat /var/log/dpkg.log ;; esac }
使用方法:
$ sudo -i Password: # apt-history install 2013-12-06 10:45:41 install wireshark-common:amd64 <none> 1.8.2-5wheezy7build0.13.04.1 2013-12-06 10:45:42 install wireshark:amd64 <none> 1.8.2-5wheezy7build0.13.04.1 2013-12-07 14:40:58 install liblinear1:amd64 <none> 1.8+dfsg-1ubuntu1 2013-12-07 14:40:59 install liblinear-tools:amd64 <none> 1.8+dfsg-1ubuntu1 2013-12-07 14:41:00 install nmap:amd64 <none> 6.00-0.3
注意这个脚本必须以 root 的身份使用,使用命令 sudo apt-history 会提示找不到命令。apt-history 命令的参数可以是 install, upgrade, remove, rollback 其中之一。apt-history 分析的是 dpkg.log 中的日志,个人还是喜欢查看/var/log/apt/history.log,里面每一条命令对应的软件包都很清楚。