簡體   English   中英

Debian:列出所有用戶安裝的軟件包?

[英]Debian: Listing all user-installed packages?

在我參加的網絡安全競賽中,我得到了一台 Debian 虛擬機,其中安裝了許多軟件包,並要求我清理無關或惡意的軟件包。

過去,我使用過dpkg -l | grep [searchterm] dpkg -l | grep [searchterm]和執行此任務的常用包列表。 然而,這是極其低效和耗時的。

為了加快我的任務,有什么方法可以搜索系統上安裝的軟件包列表,其中用戶安裝了哪些進程並且不是系統“默認”軟件包?

此命令可能會縮短您的工作:

apt-mark showmanual

它應該顯示“手動”安裝了哪些軟件包。 但是,它不是 100% 可靠的,因為許多自動安裝的軟件包被標記為手動安裝(因為這里描述的原因太長了)。

您還可以(如果允許)運行安全工具,例如clamav和/或rkhunter來掃描您的計算機以查找惡意程序。

下面是我每天晚上在桌面上運行的“健康”腳本中的一行。 除了從傳感器、網絡使用情況、硬盤溫度等收集信息外,它還從命令行獲取我手動安裝的所有軟件的列表。

我目前正在運行 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

所有套餐

我為這個問題找到的大多數代碼都使用了歷史日志中的搜索:

$ 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

這還考慮了使用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

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

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

如果您想知道舊分區上安裝了什么,這很有用。

以下 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也可以將此安裝程序包列表保存在其他地方。

有人編寫了一個程序,生成一個由 Debian 軟件包系統確定的手動安裝的所有軟件包的列表(由用戶、管理員/root 或兩者)。 它檢查 Debian 的 apt-history 日志,然后結合來自apt-mark程序的報告。 Apt-mark 包括用戶直接使用“dpkg”系統手動安裝的軟件包,而不僅僅是用戶通過他們的軟件包管理器實用程序(Apt、Synaptic、軟件中心等)安裝的軟件包。 如果您缺少 apt-mark 實用程序,您可以告訴它只執行歷史檢查。

請參閱GitHub 頁面

列出用戶安裝的 Debian 軟件包實用程序

列出由 Debian 軟件包系統確定的所有手動安裝的軟件包(由用戶、管理員/root 或兩者)。

我不知道是否可以在用戶安裝和默認包安裝之間進行區分,因為安裝包的唯一方法是擁有ROOT權限。 但是您可以通過執行此命令將所有軟件包及其狀態都安裝到一個文件中

dpkg --get-selections > installed_packages.txt

一個較舊的問題,但我在找到這個問題和其他幾個稍微不同的任務后想出了一個解決方案。 嘗試更新系統重建的已安裝軟件包列表。 我發現以下效果很好:

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 但它現在似乎確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM