【问题标题】:Debian: Listing all user-installed packages?Debian:列出所有用户安装的软件包?
【发布时间】:2016-12-07 00:05:21
【问题描述】:

对于我参加的网络安全竞赛,我获得了一个安装了许多软件包的 Debian 虚拟机,并要求我清理无关的或恶意的软件包。

过去,我使用dpkg -l | grep [searchterm] 和一个常用包列表来执行此任务。然而,这是极其低效且耗时的。

为了加快我的任务,是否有任何方法可以搜索系统上安装的软件包列表,其中用户已为其安装了进程并且不是系统“默认”软件包?

【问题讨论】:

标签: linux debian apt


【解决方案1】:

这个命令可能会缩短你的工作:

apt-mark showmanual

它应该显示“手动”安装了哪些软件包。虽然它不是 100% 可靠的,因为许多自动安装的软件包都被标记为手动安装(因为这里描述的原因太长了)。

您还可以(如果允许)运行clamav 和/或rkhunter 等安全工具来扫描您的计算机中的恶意程序。

【讨论】:

    【解决方案2】:

    下面是我每晚在桌面上运行的“健康”脚本中的一行。除了从传感器、网络使用情况、硬盘温度等收集信息外,它还获取我从命令行手动安装的所有软件的列表。

    我目前正在运行 Kubuntu 14.04.5 (Trusty),我不知道 Ubuntu 和 Debian 的包管理之间的任何差异的细节,但希望这对你和我一样有用。

    ( 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
    

    【讨论】:

    • 这似乎符合我的要求,但你能解释一下为什么/如何做到吗?
    • 唯一缺少的是安装上述应用程序的日期和时间
    【解决方案3】:

    所有包

    我为这个问题找到的大部分代码都使用了历史日志中的搜索:

    $ 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")
    

    我在这里找到了代码:https://gist.github.com/UniIsland/8878469

    【讨论】:

      【解决方案4】:

      这还考虑了使用aptitude 安装的软件包(不仅是apt installapt-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
      

      【讨论】:

        【解决方案5】:

        您还可以查看文件 /var/lib/apt/extended_states。

        cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'
        

        如果您想知道旧分区上安装了什么,这很有用。

        【讨论】:

          【解决方案6】:

          以下 Bash 命令在 Debian 10 (buster) 中适用于我。它打印所有手动安装的软件包减去来自您的 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,也可以将此安装程序包列表保存在其他位置。

          【讨论】:

            【解决方案7】:

            某人编写了一个程序,根据 Debian 软件包系统确定手动安装的所有软件包列表(由用户、管理员/root 或两者)。它检查 Debian 的 apt-history 日志,然后结合来自apt-mark 程序的报告。 Apt-mark 包括由用户直接通过使用“dpkg”系统手动安装的软件包,而不仅仅是通过用户通过其软件包管理器实用程序(Apt、Synaptic、软件中心等)安装的软件包。如果您缺少 apt-mark 实用程序,您可以告诉它只进行历史检查。

            请参阅GitHub page

            列出用户安装的 Debian 软件包实用程序

            列出所有手动安装的软件包(由用户、管理员/root 或两者),由 Debian 软件包系统确定。

            【讨论】:

              【解决方案8】:

              我不知道是否可以区分用户安装和默认包安装,因为安装包的唯一方法是拥有ROOT 特权。但是您可以通过执行此命令将所有软件包及其状态安装在一个文件中

              dpkg --get-selections > installed_packages.txt
              

              【讨论】:

                【解决方案9】:

                一个较老的问题,但我在找到这个和其他几个问题后提出的解决方案,任务略有不同。试图更新系统重建的已安装软件包列表。我发现以下工作非常好:

                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 list 但是它现在似乎确实有效。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-02-15
                  • 2017-12-30
                  • 2011-01-17
                  • 1970-01-01
                  • 2018-05-21
                  • 2013-07-30
                  • 2011-05-23
                  • 1970-01-01
                  相关资源
                  最近更新 更多