私が参加しているサイバーセキュリティコンテストでは、多くのパッケージがインストールされたDebian仮想マシンが与えられ、無関係なパッケージや悪意のあるパッケージをクリーンアップするように依頼されました。
以前は、dpkg -l | grep [searchterm]
およびこのタスクを実行するための一般的なパッケージのリスト。ただし、これは非常に非効率的で時間がかかります。
私のタスクをスピードアップするために、ユーザーによってプロセスがインストールされ、システムの「デフォルト」パッケージではないシステムにインストールされているパッケージのリストを検索する方法はありますか?
このコマンドはあなたの仕事を短くするかもしれません:
apt-mark showmanual
「手動」でインストールされたパッケージを表示することになっています。ただし、100%の信頼性はありません。自動インストールされたパッケージの多くは、手動でインストールされたものとしてフラグが付けられます(理由が長すぎるため、ここでは説明できません)。
また、(許可されている場合)clamav
やrkhunter
などのセキュリティツールを実行して、コンピュータをスキャンし、悪意のあるプログラムがないかどうかを確認することもできます。
以下は、毎晩デスクトップで実行する「ヘルス」スクリプトの行です。センサー、ネットワーク使用状況、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
この質問で見つけたほとんどすべてのコードは、履歴ログからの検索を使用しました。
$ 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
ファイル/ var/lib/apt/extended_statesも確認できます。
cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 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リストも、今のところ機能しているようです。
パッケージをインストールする唯一の方法はROOT
特権を持つことなので、ユーザーのインストールとデフォルトのパッケージのインストールを区別できるかどうかはわかりません。ただし、このコマンドを実行すると、すべてのパッケージがインストールされ、そのステータスが1つのファイルに格納されます。
dpkg --get-selections > installed_packages.txt
次の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
を使用したくない場合は、このインストーラパッケージリストを別の場所に保存することもできます。