web-dev-qa-db-ja.com

Debian:ユーザーがインストールしたパッケージをすべてリストしますか?

私が参加しているサイバーセキュリティコンテストでは、多くのパッケージがインストールされたDebian仮想マシンが与えられ、無関係なパッケージや悪意のあるパッケージをクリーンアップするように依頼されました。

以前は、dpkg -l | grep [searchterm]およびこのタスクを実行するための一般的なパッケージのリスト。ただし、これは非常に非効率的で時間がかかります。

私のタスクをスピードアップするために、ユーザーによってプロセスがインストールされ、システムの「デフォルト」パッケージではないシステムにインストールされているパッケージのリストを検索する方法はありますか?

10
Thorne Garvin

このコマンドはあなたの仕事を短くするかもしれません:

apt-mark showmanual

「手動」でインストールされたパッケージを表示することになっています。ただし、100%の信頼性はありません。自動インストールされたパッケージの多くは、手動でインストールされたものとしてフラグが付けられます(理由が長すぎるため、ここでは説明できません)。

また、(許可されている場合)clamavrkhunterなどのセキュリティツールを実行して、コンピュータをスキャンし、悪意のあるプログラムがないかどうかを確認することもできます。

10
Jamil Said

以下は、毎晩デスクトップで実行する「ヘルス」スクリプトの行です。センサー、ネットワーク使用状況、HDD温度などから情報を収集するだけでなく、コマンドラインから手動でインストールしたすべてのソフトウェアのリストも取得します。

私は現在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
7
Benny Hill

すべてのパッケージ

この質問で見つけたほとんどすべてのコードは、履歴ログからの検索を使用しました。

$ cat /var/log/apt/history.log | grep 'apt-get install '

または、マシンにインストールされているすべてのDebianパッケージをリストしました。

$ dpkg --get-selections

手動でインストール

私の履歴ログが不完全であり、組み込みパッケージを手動で分離する作業をしたくなかったため、上記の回答は不十分であることがわかりましたインストールされたパッケージ。ただし、このソリューションはmanuallyが開始したインストール済みパッケージのみを表示するというトリックを行いました。これはログを使用します:/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でインストールされたパッケージも考慮に入れます(私が基づいているBenny Hillの回答のように、apt installまたはapt-get installだけではありません)。

( ( 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
tomasz

ファイル/ var/lib/apt/extended_statesも確認できます。

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

これは、古いパーティションに何がインストールされているかを知りたい場合に便利です。

1
Laurent Lyaudet

古い質問ですが、これと、わずかに異なるタスクに対する他のいくつかの質問を見つけた後で思いついた解決策です。システムの再構築用にインストールされたパッケージのリストを最新の状態に保つことを試みます。次の作品はかなりうまくいきました:

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リストも、今のところ機能しているようです。

0
Wil Selwood

パッケージをインストールする唯一の方法はROOT特権を持つことなので、ユーザーのインストールとデフォルトのパッケージのインストールを区別できるかどうかはわかりません。ただし、このコマンドを実行すると、すべてのパッケージがインストールされ、そのステータスが1つのファイルに格納されます。

dpkg --get-selections > installed_packages.txt
0
Hamza Jabbour

次の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)

/var/log/installer/syslogを検索するには、Sudoが必要です。毎回Sudoを使用したくない場合は、このインストーラパッケージリストを別の場所に保存することもできます。

0
aomarks