对于我参与的网络安全竞赛,我获得了一个安装了许多软件包的Debian虚拟机,并要求清除无关或恶意软件包。
过去,我使用dpkg -l | grep [searchterm]
和一系列常见软件包来执行此任务。然而,这是非常低效和耗时的。
为了加快我的任务,有没有办法搜索系统上安装的软件包列表,这些软件包已经由用户安装了进程,而不是系统“默认”软件包?
答案 0 :(得分:7)
此命令可能会缩短您的工作时间:
apt-mark showmanual
应该显示已安装的软件包"手动"。它不是100%可靠,因为许多自动安装的软件包被标记为手动安装(因为这里描述的原因太长)。
您也可以(如果允许)运行clamav
和/或rkhunter
等安全工具来扫描您的计算机以查找恶意程序。
答案 1 :(得分:6)
以下是我每晚在桌面上运行的“运行状况”脚本中的一行。除了从传感器,网络使用,硬盘温度等收集信息外,它还会从命令行手动安装我手动安装的所有软件列表。
我目前正在运行Kubuntu 14.04.5(Trusty),我不知道Ubuntu和Debian的软件包管理之间有什么区别的细节,但希望这对你有用,对我来说也是如此。< / p>
( zcat $( ls -tr /var/log/apt/history.log*.gz ) ; cat /var/log/apt/history.log ) | egrep '^(Start-Date:|Commandline:)' | grep -v aptdaemon | egrep '^Commandline:' | egrep 'install' 1>>installed_packages.txt
答案 2 :(得分:3)
这也考虑了使用aptitude
安装的软件包(不仅仅是apt install
或apt-get install
,就像我基于Benny Hill的答案一样):
( ( zcat $( ls -tr /var/log/apt/history.log*.gz ) ; cat /var/log/apt/history.log ) | egrep '^(Start-Date:|Commandline:)' | grep -v aptdaemon ; ( zcat $( ls -tr /var/log/aptitude.*.gz ) ; cat /var/log/aptitude ) ) | egrep '^Commandline:.*install|^\[INSTALL\]' | sed 's#Commandline: ##' | awk '/INSTALL/ { print $2 }; !/INSTALL/ { print $0 }; ' 1>installed_packages.txt
示例输出(最后一行来自aptitude日志):
apt-get install nodejs
apt install tidy
mc:amd64
答案 3 :(得分:2)
我为此问题找到的大多数代码都使用历史记录中的搜索:
$ cat /var/log/apt/history.log | grep 'apt-get install '
或列出机器上安装的所有Debian软件包:
$ dpkg --get-selections
我发现上述答案不足,因为我的历史记录日志不完整,而且我不想将内置软件包与手动安装的软件包分开。但是,此解决方案仅显示手动启动的已安装软件包。这个使用日志:/var/log/dpkg.log
,它应该作为bash脚本执行。
#!/usr/bin/env bash
parse_dpkg_log() {
{
for FN in `ls -1 /var/log/dpkg.log*` ; do
CMD="cat"
[ ${FN##*.} == "gz" ] && CMD="zcat"
$CMD $FN | egrep "[0-9] install" | awk '{print $4}' \
| awk -F":" '{print $1}'
done
} | sort | uniq
}
list_installed=$(parse_dpkg_log)
list_manual=$(apt-mark showmanual | sort)
comm -12 <(echo "$list_installed") <(echo "$list_manual")
答案 4 :(得分:1)
以下Bash命令在Debian 10(破坏者)中对我有效。它会打印所有手动安装的软件包减去Debian安装中的软件包(换句话说,您用apt install
安装的软件包):
sudo grep -oP "Unpacking \K[^: ]+" /var/log/installer/syslog \
| sort -u | comm -13 /dev/stdin <(apt-mark showmanual | sort)
要搜索sudo
,需要 /var/log/installer/syslog
。如果您不想每次使用sudo
,也可以将此安装程序软件包列表保存在其他位置。
答案 5 :(得分:1)
有人编写了一个程序,生成由 Debian 软件包系统确定的所有手动安装的软件包列表(由用户、管理员/root 或两者)。它检查 Debian 的 apt-history 日志,然后合并来自 apt-mark
程序的报告。 Apt-mark 包括用户直接使用“dpkg”系统手动安装的软件包,而不仅仅是用户通过他们的软件包管理器实用程序(Apt、Synaptic、软件中心等)安装的软件包。如果您缺少 apt-mark 实用程序,您可以告诉它只进行历史检查。
参见GitHub page。
<块引用>列出用户安装的 Debian 软件包实用程序
列出由 Debian 软件包系统确定的所有手动安装的软件包(由用户、管理员/root 或两者)。
答案 6 :(得分:0)
我不知道是否可以在用户安装和默认软件包安装之间取消,因为安装软件包的唯一方法是拥有//addon config/environment.js
module.exports = function() {
return {
addonRootVar: 'exist after merge'
APP: {
addonDeepVar: 'doesn\'t exist in resulting config'
}
}
}
//host app config/environment.js
module.exports = function() {
return {
hostRootVar: 'exist after merge'
APP: {
hostDeepVar: 'whole APP property will be overwritten :('
}
}
}
个特权。但是你可以通过执行这个命令来安装所有软件包并将它们的状态放在一个文件中
ROOT
答案 7 :(得分:0)
您还可以查看文件/ var / lib / apt / extended_states。
cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'
如果您想知道旧分区上安装的内容,这非常有用。
答案 8 :(得分:0)
一个较旧的问题,但找到一个解决方案后,我找到了解决方案,并提出了一些其他问题以解决稍微不同的任务。尝试保持最新的已安装软件包列表以进行系统重建。我发现以下工作效果很好:
comm -12 <(apt list --installed 2> /dev/null | cut -d '/' -f 1 | sort) <(history | grep -e "apt\(-get\)\? install" | grep -v -e "grep -e" | grep -v "./" | cut -d ' ' -f10 | sort)
这将获取所有已安装软件包的列表,并与正在安装的软件包的历史记录进行比较。
我假设恶意行为者没有试图隐藏它们的轨道来安装软件包。脚本中也有一个有点讨厌的命令apt列表,但是现在看来确实可以使用。