Bagaimana cara mendapatkan riwayat "apt-get install" di Ubuntu?

85

Saya akan memindahkan server dari satu kotak Ubuntu ke yang lain. Saya tidak mengkloning kotak lama ke yang baru; Saya membuat sistem baru dan akan memindahkan data sesuai kebutuhan. Saya ingin menginstal semua perangkat lunak yang saya miliki di kotak lama pada yang baru.

Apakah ada cara sederhana untuk menemukan riwayat semua perintah "sudo apt-get install" yang telah saya berikan dari waktu ke waktu? Yaitu, dpkg-l menunjukkan kepada saya semua paket yang telah diinstal, tetapi tidak paket tingkat atas mana yang menginstalnya. Jika ada cara bagi dpkg untuk memberi saya paket instalasi, saya dapat menemukan yang unik di sana; kalau tidak, saya ingin yang lain mengatakan "Anda menginstal 24 paket ini".

Paul Hoffman
sumber
Bisakah Anda menerima jawaban di bawah ini? Berterima kasih kepada orang-orang yang menjawab.
m-ric
Solusi ini hanya akan memeriksa apa yang telah terjadi SETELAH rotasi log terakhir. Mereka tidak memeriksa semua riwayat.
Kraang Prime
Cara sederhana dan cepat diberikan oleh jawaban ini, askubuntu.com/a/250530/197730 , untuk pertanyaan ini Cara mendaftar semua paket yang diinstal .
TooTone

Jawaban:

68

The aptsejarah di /var/log/apt/history.logseperti dikatakan dalam komentar di atas. Yang mengatakan, ini tidak akan mencantumkan paket yang diinstal secara manual, menggunakan dpkgatau GUI seperti gdebi. Untuk melihat semua paket yang melewati dpkg, Anda bisa melihatnya /var/log/dpkg.log.

ℝaphink
sumber
8

http://www.debianadmin.com/clone-your-ubuntu-installation.html

dan /var/adm/apt/history.log

M_1
sumber
5
Prosedur di tautan pertama tidak membedakan antara paket yang diinstal secara otomatis dan paket yang diinstal secara manual. /var/log/apt/history.log(Anda salah lokasi btw) akan diputar setelah beberapa bulan.
Gilles
Gilles benar dalam kedua hal. Saya hanya memiliki sekitar satu bulan senilai dari log-log itu, dan saya bahkan tidak bisa melihat bagaimana tingkat penghapusan log diatur (ini dilakukan dengan 'newsyslog' di FreeBSD). Jadi saya masih belum punya solusi, tetapi saya punya beberapa petunjuk. Setidaknya saya dapat menangkap output dari perintah di artikel kloning, mencari nama "tingkat tinggi", menginstalnya pada yang baru, melakukan hal yang sama pada kotak baru, berbeda dua hasil, dan ulangi sampai puas. Saya masih harus mendengar lebih banyak ide.
Paul Hoffman
7

Anda dapat mencantumkan paket yang instalasinya diminta secara eksplisit apt-mark.

apt-mark showmanual

Jika Anda menjalankan rilis kuno Debian, inilah cara manual.

Perintah berikut memberikan daftar paket yang instalasi diminta, apakah secara manual atau otomatis. Kecuali Anda berada di tengah-tengah (de) menginstal paket, ini adalah daftar paket yang diinstal.

dpkg --get-selections | sed -n 's/\t\+install$//p'

Perintah berikut memberikan superset dari paket yang diinstal secara otomatis:

</var/lib/apt/extended_states awk -v RS= '/\nAuto-Installed: *1/{print$2}'

Menyatukan semuanya, perintah berikut mencantumkan paket yang diinstal secara manual:

comm -23 <(dpkg --get-selections | sed -n 's/\t\+install$//p') \
         <(</var/lib/apt/extended_states \
           awk -v RS= '/\nAuto-Installed: *1/{print$2}' |sort)
Gilles
sumber
1
--- hasil yang sangat berbeda daricomm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Cbhihe
Di Debian, ada apt-mark showmanualyang setara dengan perintah terakhir Anda.
maxschlepzig
3
grep -i "Commandline" /var/log/apt/history.log

Menunjukkan semua paket yang Anda instal menggunakan: sudo apt-get install xxxxx

Prent Rodgers
sumber
Ini tidak cukup berbeda dari jawaban @ ℝaphink dan harus menjadi komentar.
Karl Richter
2

Daripada kombinasi tac / head, lebih baik menggunakan ekor (untuk 25 baris terakhir):

tail -n 25 /var/log/apt/history.log
Bilangan bulat
sumber
Ini tidak cukup berbeda dari jawaban @ ℝaphink dan harus menjadi komentar.
Karl Richter
Juga, tidak sama. tail akan mencantumkan baris terakhir dalam file, sesuai urutannya dalam file. tac akan membalik urutan sehingga baris terakhir sekarang pertama, kedua ke yang terakhir adalah yang kedua, dll. Lagi pula, sepertinya Anda berisiko salah ketika Anda mengatakan sesuatu "lebih baik" tanpa menjelaskan alasannya. Maksud saya, "lebih baik" menurut siapa? Untuk kebutuhan apa? Sepertinya terlalu percaya diri.
Todd Walton
0

Jawaban lain membantu tetapi memberi saya terlalu banyak keluaran. Untuk mengurangi output, saya mulai dengan apt-mark showmanualseperti pada jawaban ini , dan kemudian menyaring paket yang awalnya diinstal (lihat jawaban ini untuk cara mendapatkan daftar paket yang diinstal; saya menggunakan ubuntu 18.04.2 maka tautan di bawah ini) .

BASE_PACKAGES_MANIFEST=http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.manifest
REMOVE_VERSIONS_REGEX='[0-9][.-][0-9][.-][0-9]|[0-9][.-][0-9]|[0-9]'
paste  <( apt-mark showmanual ) <( apt-mark showmanual | sed -r "s/$REMOVE_VERSIONS_REGEX//g" ) |
    grep -vf <( curl $BASE_PACKAGES_MANIFEST | cut -f1 | sed -r "s/$REMOVE_VERSIONS_REGEX|:amd//g" ) |
    cut -f1 |
    sort |
    uniq

Skrip memfilter paket yang ada dalam manifes asli dengan melakukan perbandingan versi-independen, sehingga paket yang ditingkatkan tidak muncul dalam daftar. Saya berakhir dengan daftar sekitar 60 paket.

Cara lain yang saya suka adalah jawaban ini yang mencari semua log yang tepat .

TooTone
sumber
-1

Untuk mendapatkan daftar paket terinstal terbaru dalam urutan menurun, saya suka menggunakan (misalnya 25 baris):

tac /var/log/apt/history.log |head --lines=25
Hartmut P.
sumber
1
Lebih efisien (dan aliteratif) adalah: tail -25 /var/log/apt/history.log | tac
AGC
Ini tidak cukup berbeda dari jawaban @ ℝaphink dan harus menjadi komentar.
Karl Richter