it-swarm-id.com

Daftar paket pada sistem berbasis apt dengan tanggal instalasi

Bagaimana saya bisa mendaftar paket yang diinstal berdasarkan tanggal instalasi?

Saya perlu melakukan ini di debian/ubuntu. Jawaban untuk distribusi lain juga bagus.

Saya menginstal banyak hal untuk mengkompilasi sepotong kode tertentu, dan saya ingin mendapatkan daftar paket yang harus saya instal.

106

Distribusi berbasis RPM seperti Red Hat mudah:

rpm -qa --last

Pada Debian dan distribusi berbasis dpkg lainnya, masalah khusus Anda juga mudah:

grep install /var/log/dpkg.log

Kecuali jika file log telah diputar, dalam hal ini Anda harus mencoba:

grep install /var/log/dpkg.log /var/log/dpkg.log.1

Secara umum, dpkg dan apt tampaknya tidak melacak tanggal pemasangan, karena kurangnya bidang seperti itu di dpkg-query halaman manual.

Dan akhirnya /var/log/dpkg.log.* file akan dihapus oleh rotasi log, sehingga cara itu tidak dijamin memberi Anda seluruh sejarah sistem Anda.

Satu saran yang muncul beberapa kali (mis. tas ini ) adalah untuk melihat /var/lib/dpkg/info direktori. File-file di sana menyarankan Anda untuk mencoba sesuatu seperti:

ls -t /var/lib/dpkg/info/*.list | sed -e 's/\.list$//' | head -n 50

Untuk menjawab pertanyaan Anda tentang pilihan, berikut ini pass pertama.

buat daftar paket berdasarkan tanggal

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' | \
    sort > ~/dpkglist.dates

buat daftar paket yang diinstal

$ dpkg --get-selections | sed -ne '/\tinstall$/{s/[[:space:]].*//;p}' | \
    sort > ~/dpkglist.selections

bergabung dengan 2 daftar

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.dates \
    > ~/dpkglist.selectiondates

Untuk beberapa alasan itu tidak mencetak banyak perbedaan untuk saya, jadi mungkin ada bug atau asumsi yang tidak valid tentang apa --get-selections berarti.

Anda jelas dapat membatasi paket baik dengan menggunakan find . -mtime -<days> atau head -n <lines>, dan ubah format output sesuka Anda, mis.

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \
    sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list$,,' | \
    sort > ~/dpkglist.recent

$ join -1 1 -2 1 -t $'\t' ~/dpkglist.selections ~/dpkglist.recent \
    > ~/dpkglist.recentselections

untuk daftar hanya pilihan yang diinstal (diubah?) dalam 4 hari terakhir.

Anda mungkin juga dapat menghapus perintah sort setelah memverifikasi urutan pengurutan yang digunakan oleh dpkg --get-selections dan buat perintah find lebih efisien.

68
Mikel

Mikel telah menunjukkan bagaimana melakukan ini di level dpkg . Khususnya, /var/lib/dpkg/info/$packagename.list dibuat ketika paket diinstal (dan tidak dimodifikasi setelahnya).

Jika Anda menggunakan alat APT (yang mungkin Anda lakukan karena Anda khawatir tentang paket yang secara otomatis diinstal vs manual), ada riwayat di /var/log/apt/history.log. Selama belum diputar, ia tetap melacak semua APT instalasi, pemutakhiran dan pemindahan, dengan anotasi untuk paket yang ditandai sebagai terinstal secara otomatis. Ini adalah fitur yang cukup baru, diperkenalkan pada APT 0.7.26, jadi di Debian muncul dalam keadaan terjepit. Di Ubuntu, 10,04 memiliki history.log tetapi anotasi yang diinstal secara otomatis tidak ada sampai 10.10.

Kasar, tetapi bekerja:

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; 
    do basename ${fillo} | sed 's/.list$//g' ; 
done > forens.txt

ls -ltr /var/lib/dpkg/info/*.list > forentime.txt

for lint in `cat forens.txt` ; do 
    echo -n "[ ${lint} Installed ] : " ; 
    echo -n "`grep /${lint}.list forentime.txt | awk '{ print $6, $7, $8 }'` : " ; 
    ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \
        grep '^Auto' > /dev/null ) && echo "Auto" ) || echo "Manual" ; 
done > pkgdatetime.txt
6
Dulantha

/var/log/apt/history.log file memiliki format IMHO yang aneh.

Tanggal Mulai: {tanggal} {waktu} Baris Perintah: {perintah} {opsi ...} Instal: {paket (versi)}, ..., {paket (versi)}, ... Tanggal Akhir: {tanggal } {waktu}

Saya lebih suka catatan format file log lebih

{tanggal} {waktu} {tab} {paket} {tab} {versi} {tab} {perintah} {opsi}\n

atau XML yang menunjukkan tidak hanya {paket} tetapi {dependensi} apa pun.

Seperti yang saat ini diterapkan, Anda dapat menemukan informasi yang Anda cari tetapi memerlukan beberapa proses forensik untuk mengekstrak detailnya.

4
Saint DanBert

Ini berfungsi bagi saya pada sistem Debian, saya menduga format file telah berubah sejak 2011. Sistem ini cukup segar sehingga saya tidak berharap ini bekerja pada sistem yang lebih lama, meskipun itu mungkin hanya memerlukan unzip log dan menggunakan gumpalan untuk merujuk mereka semua.

grep 'install ' /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d' '

Dua bidang pertama di setiap baris file /var/log/dpkg.log adalah tanggal dan waktu. Perhatikan ruang tambahan dengan instal di bagian grep, ini karena pemutakhiran dapat memicu pemasangan tetapi jika saya mengerti dengan benar Anda ingin tahu apa yang diinstal oleh pengguna.

3
Amias

Berikut ini adalah one-liner yang diinginkan dan dibutuhkan setiap orang:

for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" '{print $1 " :a" $2}' |column -t

Hasilnya akan menunjukkan semua paket (baru) terinstal dan ditingkatkan secara kronologis memesan.

Penjelasan baris:

  • ls -1t - dapat semua dpkg.log* nama file dalam urutan kronologis
  • zcat -f - JIKA file dari jenis gzip lalu dekompreskan, - ELSE hanya meneruskan konten.
  • tac - Membalikkan output dari cat , baris demi baris untuk memastikan kami mendapatkan urutan kronologis yang benar.
  • grep - Hanya memeriksa diinstal atau peningkatan paket .
  • awk -F ':a' - Pisahkan bidang arsitektur dari nama paket
  • column -t - cukup cetak kolom yang dipisahkan oleh spasi

Orang tentu saja ingin membuat alias untuk ini, tetapi sayangnya itu tidak mungkin karena awk tergantung pada tanda kutip tunggal dan ganda. Dalam hal ini sebaiknya dimasukkan ke dalam skrip bash dan di mana : separator ditangani dengan lebih baik untuk arsitektur lainnya di kolom bidang.

Outputnya adalah:

2018-03-06  18:09:47  upgrade  libgomp1                     :armhf  6.3.0-18+rpi1                 6.3.0-18+rpi1+deb9u1
2018-03-05  15:56:23  install  mpg123                       :armhf  <none>                        1.23.8-1
2018-03-05  15:56:23  install  libout123-0                  :armhf  <none>                        1.23.8-1
2018-01-22  17:09:45  install  libmailtools-Perl            :all    <none>                        2.18-1
2018-01-22  17:09:44  install  libnet-smtp-ssl-Perl         :all    <none>                        1.04-1

Kekurangan:

  • Seperti yang ditunjukkan di atas, ini hanya bekerja pada arsitektur ARM dan perlu sedikit modifikasi untuk pemisah bidang arsitektur
  • Perlu dimasukkan ke dalam skrip untuk alias mudah
  • Belum diuji di sistem * nix lainnya
2
not2qubit

GNU/Linux Debian tidak memiliki alat bawaan untuk masalah ini, tetapi semua informasi tentang program yang diinstal dalam cara standar disimpan dalam file dengan program-name.list di lokasi /var/lib/dpkg/info /. Tapi tidak ada informasi tentang program yang diinstal secara manual di sana.


Solusi garis tunggal panjang:

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \
    stat_result=$(stat --format=%y "$file_list"); \
    printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \
done

Penjelasan:

  1. ls -rt menampilkan file yang diurutkan berdasarkan modifikasi tanggal dalam urutan terbalik, yaitu. dengan file terbaru di akhir daftar.
  2. stat mencetak tanggal file dalam bentuk yang dapat dibaca manusia.
  3. printf menampilkan nama paket dan tanggal modifikasi terakhirnya.
  4. Lingkaran for secara keseluruhan mencetak nama dan tanggal paket dari terlama hingga terbaru.

contoh Output (terpotong):

.........................................
gnome-system-log                            2016-09-17 16:31:58.000000000 +0300
libyelp0                                    2016-09-17 16:32:00.000000000 +0300
gnome-system-monitor                        2016-09-17 16:32:00.000000000 +0300
Yelp-xsl                                    2016-09-17 16:32:01.000000000 +0300
Yelp                                        2016-09-17 16:32:03.000000000 +0300
gnome-user-guide                            2016-09-17 16:32:18.000000000 +0300
libapache2-mod-dnssd                        2016-09-17 16:32:19.000000000 +0300
.........................................
linux-compiler-gcc-4.8-x86                  2017-02-26 20:11:02.800756429 +0200
linux-headers-3.16.0-4-AMD64                2017-02-26 20:11:10.463446327 +0200
linux-headers-3.16.0-4-common               2017-02-26 20:11:17.414555037 +0200
linux-libc-dev:AMD64                        2017-02-26 20:11:21.126184016 +0200
openssl                                     2017-02-26 20:11:22.094098618 +0200
unzip                                       2017-02-26 20:11:23.118013331 +0200
wireless-regdb                              2017-02-26 20:11:23.929949143 +0200
nodejs                                      2017-02-26 20:11:33.321424052 +0200
nasm                                        2017-02-28 16:41:17.013509727 +0200
librecode0:AMD64                            2017-03-01 10:38:49.817962640 +0200
libuchardet0                                2017-03-01 10:41:10.860098788 +0200
tree                                        2017-03-04 14:32:12.251787763 +0200
libtar0                                     2017-03-07 09:51:46.609746789 +0200
libtar-dev                                  2017-03-07 09:51:47.129753987 +0200

Cacat utama dari solusi ini adalah bahwa itu tidak teruji dengan baik dalam produksi.

1
PADYMKO

Itu kasar, tetapi bekerja secepat solusi lain. Format tanggal adalah yyyymmddhhmmss, yang berarti bahwa sedikit atau penataan kembali dan memformat hasil penghapusan dalam angka yang dapat diurutkan.

Banyak terima kasih kepada solusi lain, daftar nama paket ini dalam urutan instalasi yang dapat digunakan dalam membangun untuk membuat sistem operasi salinan.

find /var/lib/dpkg/info -name "*.list" -exec stat -c $'%n\t%y' {} \; \
| sed -e 's,/var/lib/dpkg/info/,,' -e 's,\.list\t,\t,' \
| sort | awk '{print $2$3" "$1}' | sed '0,/RE/s/-//' \
| sed '0,/RE/s/-//' | sed '0,/RE/s/://' | sed '0,/RE/s/://' \
| sed '0,/RE/s/\\.//' | sed 's/:armhf//' | sort | awk '{print $2}'
1
Alexander Cave

Memperhatikan hal ini karena Anda menyebutkan bahwa jawaban distribusi lain diperbolehkan. rpm memiliki serangkaian besar format tag keluaran, salah satunya adalah INSTALLTIME. (Menggunakan wget sebagai contoh)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1
wget,1454014156

Ini dapat diformat dalam beberapa cara. Saya menggunakannya dengan cara ini:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1
wget,Thu 28 Jan 2016 03:49:16 PM EST

Dua halaman ini memiliki banyak info hebat untuk memecahkan masalah metadata RPM:

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

Menyortir informasi ini akan memberi Anda solusi yang berfungsi untuk masalah Anda.

1
Jonathan Swift