Bagaimana cara menunjukkan riwayat manajemen paket apt-get melalui baris perintah?

Jawaban:

131

Semua tindakan dengan apt (apt-get) dicatat. File-file ini tersedia di / var / log / apt /. Untuk melihat log riwayat terbaru, jalankan:

less /var/log/apt/history.log

Log ini akan diputar (setiap bulan saya kira), file-file lama akan berakhiran dengan angka dan dikompres. Jadi untuk melihat log riwayat selanjutnya, gunakan:

zless /var/log/apt/history.log.1.gz

Untuk melihat log yang tersedia:

ls -la /var/log/apt/
Lekensteyn
sumber
4
Ini luar biasa. Satu-satunya hal yang hilang adalah siapa yang menjalankan perintah.
Penebusan Terbatas
3
@LimitedAtonement Lihatlah /var/log/auth.log, mungkin berisi pengguna yang menjalankan instalasi. (ini tidak akan membantu jika instalasi dipanggil melalui shell / program yang berjalan sebagai root)
Lekensteyn
3
Juga berguna: zgrep, zcat
ishmael
apakah file ini juga mencatat paket dependensi yang diinstal sebagai hasil dari apt-get asli?
Mahesha999
2
@LimitedAtonement versi terbaru dari APT menawarkan bagian "Diminta-Oleh:" log untuk menunjukkan siapa yang memanggil perintah dan juga perintah mana yang mereka panggil seperti "Commandline: packagekit role = 'update-paket'" atau "Commandline: apt upgrade "
Michael Tunnell
21

Anda juga dapat membuat perintah singkat untuk menampilkan konten yang menarik.

  • Tambahkan fungsi khusus ini ke ~/.bashrc:

    ### pars for fun: install | remove | rollback
    function apt-history(){
    
          case "$1" in
            install)
                  grep 'install ' /var/log/dpkg.log
                  ;;
            upgrade|remove)
                  grep $1 /var/log/dpkg.log
                  ;;
            rollback)
                  grep upgrade /var/log/dpkg.log | \
                      grep "$2" -A10000000 | \
                      grep "$3" -B10000000 | \
                      awk '{print $4"="$5}'
                  ;;
            *)
                  cat /var/log/dpkg.log
                  ;;
          esac
    }
  • Dan menyebutnya di terminal seperti ini:

    kreso@h17:~$ apt-history install
    2013-08-06 14:42:36 install gir1.2-nautilus-3.0:amd64 <none> 1:3.8.2-0ubuntu1~ubuntu13.04.1
    2013-08-06 14:42:36 install python-nautilus:amd64 <none> 1.1-3ubuntu1
    2013-08-06 14:42:37 install insync-nautilus:all <none> 1.0.20
    2013-08-07 14:41:37 install powertop:amd64 <none> 2.1-0ubuntu1
    2013-08-07 18:44:10 install libdiscid0:amd64 <none> 0.2.2-3build1
    2013-08-07 18:44:11 install sound-juicer:amd64 <none> 3.5.0-0ubuntu1
    

Diambil dari sini

Kresimir Pendic
sumber
zgrep ... /var/log/dpkg.log*- Output entri dari arsip juga.
Ctrl-C
6

Anda juga dapat menggunakan perintah berikut untuk mendaftar paket yang baru diinstal

grep "\ install\ " /var/log/dpkg.log
Desta Haileselassie Hagos
sumber
1
bahkan lebih baik: grep "\ install\ " /var/log/apt/history.logjika Anda perlu menyalin dan menempel daftar ke apt-get
mchid
2

Jika Anda ingin paket-paket yang diinstal dan tidak kemudian dihapus, coba ini:

comm -23 <(grep "apt-get install" /var/log/apt/history.log | sed 's/.* //' | sort) \ 
<(grep "apt-get remove" /var/log/apt/history.log | sed 's/.* //' | sort) 

Ini adalah pemasangan minus penghapusan yang cocok.

Referensi:

hoffmanc
sumber
+1: Satu kalimat bagus tapi hanya berlaku untuk periode rotasi log terakhir. Juga alih-alih sort, gunakan sort -udalam kedua kasus untuk menghindari duplikat baris muncul seperti dalam paket suka oracle-java8-installerdan banyak lainnya.
Cbhihe
1

Inilah cara Anda benar-benar melakukannya, katakan paket bergumam:

_P=mutter &&
(cat /var/log/dpkg.log{,.1};zcat /var/log/dpkg.log.*.gz) |
egrep --text "^[^ ]* [^ ]* (configure|install|remove|status [^ ]*|trigproc|upgrade) $_P[: ]" |
sort --reverse | less

Menggunakan dpkg.log menangkap operasi yang tidak dilihat oleh apt-get.

Keluaran:

2016-12-20 09:47:35 status unpacked mutter:amd64 3.22.2-2ubuntu1~ubuntu16.10.1
2016-12-20 09:47:35 status installed mutter:amd64 3.22.2-2ubuntu1~ubuntu16.10.1
…
Harald Rudell
sumber
1
Harap perhatikan tiga backticks di sini tidak berfungsi seperti yang Anda pikirkan.
edwinksl
1

Untuk mendapatkan riwayat pembaruan dari paket tertentu dengan asumsi itu diinstal / diperbarui melalui apt, inilah oneliner (bash dan zgrep), contohnya adalah untuk paket skypeforlinux:

package='skypeforlinux'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)

File riwayat log greps apt ini untuk skypeforlinux termasuk tiga baris sebelumnya untuk mendapatkan tanggal. Kemudian ulangi hasilnya dan gema tanggal dan versi yang relevan.

Ganti nilai variabel paket dengan nama paket Anda, bahkan berfungsi untuk beberapa paket asalkan dimulai dengan string yang sama.

Contoh dengan output:

package='apache'; pregex="(${package}[^\)]+\))"; while read -r line; do [[ "$line" =~ ^Start-Date:[[:space:]]([[:digit:]].+) ]] && curdate="${BASH_REMATCH[1]} "; [[ "$line" =~ $pregex ]] && echo "$curdate ${BASH_REMATCH[1]}"; done < <(for i in `ls -tr /var/log/apt/history*`; do zgrep -B3 "$package" $i; done)
2017-10-19  15:00:09  apache2-utils:amd64 (2.4.18-2ubuntu3.5)
2017-11-24  14:24:45  apache-pom-java:amd64 (10-2build1, automatic)
2018-02-22  16:42:02  apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26  15:34:34  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:36:32  apache2-data:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:40:50  apache2-data:amd64 (2.4.18-2ubuntu3.5, automatic)
2018-02-26  15:42:07  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-02-26  15:42:39  apache2:amd64 (2.4.18-2ubuntu3.5)
2018-03-15  10:08:50  apache-pom-java:amd64 (10-2build1)
2018-04-20  08:55:07  apache2-data:amd64 (2.4.18-2ubuntu3.5, 2.4.18-2ubuntu3.8)
2018-07-06  08:55:11  apache2-data:amd64 (2.4.18-2ubuntu3.8, 2.4.18-2ubuntu3.9)
kilgor
sumber